2011-07-15 131 views
0

我创建一个IIS模块,它在加载之前将文本附加到页面上。当我转到网址时,第一次加载页面时效果很好。然而,在随后的加载中,文本从不附加。IIS7模块只能第一次运行?

有关如何解决这个问题的任何想法?

== == CODE

这里是我的web.config:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <system.web> 
     <compilation debug="true" /> 
    </system.web> 
    <system.webServer> 
     <modules> 
      <add name="MIModule" type="MI.MyModule, MI" /> 
     </modules> 
     <caching enabled="false" enableKernelCache="false" />  
    </system.webServer> 
</configuration> 

一些模块代码:

public void context_PreRequestHandlerExecute(Object source, EventArgs e) 
     { 
      HttpApplication app = (HttpApplication)source; 
      HttpRequest request = app.Context.Request; 

      string pageContent = app.Response.Output.ToString(); 

      string useragent = "HI!<br />" + pageContent + "<hr />" ; 

      try 
      { 
       _current.Response.Output.Write(useragent); 
      } 
      catch 
      { 
      } 
     } 

和其他代码:

private HttpContext _current = null; 

     #region IHttpModule Members 

     public void Dispose() 
     { 
      throw new Exception("Not implemented"); 
     } 

     public void Init(HttpApplication context) 
     { 
      _current = context.Context; 

      context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute); 
     } 

     #endregion 
+0

如果它在页面之前加载,它听起来更像是一个模块,而不是一个处理程序。你可以发布一些代码吗? – bottlenecked

+0

@bottlenecked - 对不起,你是正确的,模块不处理。我附上了一些代码。 – Dexter

回答

2

_current变量实际上是HttpContext.Current?它是模块中的静态字段吗?何时/如何初始化?我的猜测是空的catch子句吞噬了所有的错误,并遵循这个想法,你很可能在_current上得到一个空引用。尝试删除try/catch以了解更多关于您的代码的问题

+0

你是对的,_current是空的,这就是为什么发生这种情况。不知道为什么它是空的,关于如何解决它的任何想法? – Dexter

+0

好吧,你*有* HttpRequest请求= app.Context.Request;',你可以轻松地写'var response = app.Context.Response;'然后'response.Output.Write(/ *你的东西* /)'。至于为什么它是空的......它可能在第一个请求(当它实际被初始化并且随后正常运行)完成时设置为空,因为重新为每个请求创建HttpContext(请求单例)。虽然如果别人知道的更好,请随时纠正我:) – bottlenecked