【问题标题】:Debugging an httpmodule on the asp.net development server在 asp.net 开发服务器上调试 httpmodule
【发布时间】:2010-10-15 08:09:19
【问题描述】:

我想在我的 asp.net 应用程序(v 3.5,visual studio 2008)中集成一些 http 模块,但我不确定如何在我触发时触发的 asp.net 开发服务器中调试或使用这些模块运行网络应用程序。

我是否需要在解决方案中包含模块源代码,或者我可以将 DLL 放入 BIN 中吗?我来自 1.1 世界,还不习惯 asp.net 开发服务器。

【问题讨论】:

    标签: asp.net httpmodule


    【解决方案1】:

    按照以下步骤添加 HTTP 模块:

    1. 创建一个名为 MyModule 的新 Visual Studio .NET C# 类库项目。
    2. 设置对System.Web.dll 程序集的引用。
    3. 将以下指令添加到类中:

      using System.Web;                    
      
    4. 重命名类SyncModule.cs,然后更改类定义以反映这一点。

    5. 实现IHttpModule 接口。您的类定义应如下所示:

      public class SyncModule : IHttpModule                    
      
    6. 决定您将订阅哪些事件。以下列表概述了您可以订阅的 HttpApplication 对象中的可用事件:

      • AcquireRequestState:调用此事件允许模块获取或创建请求的状态(例如,会话)。
      • AuthenticateRequest:当安全模块需要在处理请求之前对用户进行身份验证时调用此事件。
      • AuthorizeRequest:当请求需要被授权时,由安全模块调用此事件。身份验证后调用。
      • BeginRequest:调用此事件通知模块新请求正在开始。
      • Disposed:调用此事件通知模块应用程序由于某种原因正在结束。允许模块执行内部清理。
      • EndRequest:调用此事件通知模块请求正在结束。
      • Error:调用该事件通知模块请求处理过程中发生错误。
      • PostRequestHandlerExecute:调用此事件通知模块处理程序已完成对请求的处理。
      • PreRequestHandlerExecute:调用此事件通知模块该请求的处理程序即将被调用。
      • PreSendRequestContent:调用该事件通知模块内容即将发送给客户端。
      • PreSendRequestHeaders:调用该事件通知模块HTTP头即将发送给客户端。
      • ReleaseRequestState:调用此事件以允许模块释放状态,因为处理程序已完成对请求的处理。
      • ResolveRequestCache:认证后调用此事件。缓存模块使用此事件来确定请求是否应由其缓存处理,或者是否应由处理程序处理。
      • UpdateRequestCache:在处理程序响应后调用此事件。缓存模块应使用响应更新其缓存。
    7. 实现IHttpModule接口的Init和Dispose方法如下:

      public void Init(HttpApplication app)
      {
         app.BeginRequest += new EventHandler(OnBeginRequest);
      }
      public void Dispose(){ }
      
    8. 为一个事件创建一个委托,如下所示:

      public delegate void MyEventHandler(Object s, EventArgs e);    
      
    9. 定义一个 MyEventHandler 类型的私有局部变量来保存对事件的引用:

      private MyEventHandler _eventHandler = null;                    
      
    10. 创建一个事件,将委托连接到 Global.asax 文件或继承自 HttpApplication 对象的类中的方法:

      public event MyEventHandler MyEvent
      {
         add { _eventHandler += value; }
         remove { _eventHandler -= value; }
      }
      
    11. 创建OnBeginRequest 方法,该方法与HttpApplicationBeginRequest 事件挂钩:

      public void OnBeginRequest(Object s, EventArgs e)
      {
         HttpApplication app = s as HttpApplication;
         app.Context.Response.Write("Hello from OnBeginRequest in custom module.<br>");
         if(_eventHandler!=null)
            _eventHandler(this, null);
      }        
      
    12. 编译项目

    来源:http://support.microsoft.com/kb/307996

    将 HTTP 模块添加到您的 web.config 将如下所示:

    <system.web>
        <httpModules>
           <add name="CustomHttpModule" type="MyCustomHttpModule"/>
        </httpModules>
    </system.web>
    

    【讨论】:

    • 如何在 ASP.NET 开发环境中使用这个模块?我可以将 DLL 添加到我的 \bin 文件夹并使用调试时触发的开发 Web 服务器运行吗?
    • 要使用 HTTP 模块,您需要在 web.config 中定义它
    • 在我的原始答案中添加了如何将此模块添加到您的 web.config 的示例。希望这会有所帮助!
    【解决方案2】:

    在 HttpModule 中没有命中断点的两个常见原因是:

    断点位于模块构建期间调用的代码中。

    这个总是我。如果您想调试模块的构造您应该手动附加调试器。 在 Windows 7 上执行此操作(在 Vista 上类似):

    1. 调试 |附加到进程...
    2. 勾选显示所有会话中的进程
    3. 选择您的工作进程实例 (w3wp.exe)
    4. 点击附加

    刷新您的浏览器,您现在应该会遇到断点。

    由于配置问题,模块实际上没有被加载。

    如果您可以判断出模块代码肯定正在执行,那么这不是问题所在。但有时,当一个模块在其他机器上正常加载时,它可能无法在您的开发盒上加载,因为您拥有不同版本的 IIS,并且您没有必要的配置。

    如果是这种情况,请确保为所有需要的 IIS 版本正确连接模块。

    对于 IIS 5.1 和 IIS 6...

    <system.web>
      <httpModules>
        <add name="CustomHttpModule" type="MyCustomHttpModule"/>
      </httpModules>
    </system.web>
    

    ...对于 IIS 7+

    <system.webServer>
      <modules runAllManagedModulesForAllRequests="true">
        <add name="CustomHttpModule" type="MyCustomHttpModule"/>
      </modules>
    </system.webServer>
    

    【讨论】:

    • 遇到了同样的问题,我的网络配置是为 IIS 6 设置的,但应该是 7。我注意到我不需要“runAllManagedModulesForAllRequests”属性 +1 谢谢
    • 如果您正在使用与 Visual Studio 集成的开发服务器(即 IIS Express),那么您应该将调试器附加到 iisexpress.exe 而不是 w3wp.exe。
    【解决方案3】:

    请注意,这似乎不是开箱即用的。确保不仅包括新模块的类名,而是明确定义其命名空间和(为了完整性)程序集。如果你不这样做,很有可能你最终会遇到 IIS 抱怨无法加载你刚刚编写的新 HTTP 模块。

    下面是一个例子。

    代替:

    <add name="CustomHttpModule" type="MyCustomHttpModule"/>
    

    用途:

    <add name="CustomHttpModule" type="MyCustomRootNamespace.MyCustomHttpModule, MyCustomAssembly"/>
    

    如果不这样做,您的项目可能无法加载。

    您可能收到的具体错误取决于您对模块的明确定义。如果省略命名空间,您将看到:

    Could not load type 'MyCustomHttpModule'.
    

    省略命名空间并包含程序集,您将看到:

    Could not load type 'MyCustomHttpModule' from assembly 'MyCustomAssembly'. 
    

    如果您看到另一条错误消息,那么您遇到的问题与此处讨论的问题不同。

    【讨论】:

      【解决方案4】:

      你可以写一行

      System.Diagnostics.Debugger.Break(); //显式调用Break进行调试

      在 HttpModule 构造期间显式调用断点。

      它将要求附加进程(例如 w3wp.exe),然后调试点将命中。

      谢谢

      【讨论】:

        【解决方案5】:

        您可能还想确保您使用的是 Web 应用程序项目,这是您在 VS2003 中使用的,而不是网站“项目”,它们不是项目。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-23
          相关资源
          最近更新 更多