在asp.net开发服务器上调试httpmodule

Cav*_*rob 10 asp.net httpmodule

我想在我的asp.net应用程序的一些HTTP模块(V 3.5,Visual Studio 2008中)整合和我不知道如何调试或使用这些模块在调试时在asp.net开发服务器火灾,当我运行web应用程序.

我是否需要在解决方案中包含模块源,或者我可以将DLL丢弃到BIN中?我来自1.1世界,还没有习惯asp.net开发服务器.

Chr*_*nce 11

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

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

    using System.Web;                    
    
    Run Code Online (Sandbox Code Playgroud)
  4. 重命名该类SyncModule.cs,然后更改类定义以反映此情况.

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

    public class SyncModule : IHttpModule                    
    
    Run Code Online (Sandbox Code Playgroud)
  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(){ }
    
    Run Code Online (Sandbox Code Playgroud)
  8. 为事件创建委托,如下所示:

    public delegate void MyEventHandler(Object s, EventArgs e);    
    
    Run Code Online (Sandbox Code Playgroud)
  9. 定义类型的私有局部变量MyEventHandler以保存对事件的引用:

    private MyEventHandler _eventHandler = null;                    
    
    Run Code Online (Sandbox Code Playgroud)
  10. 创建一个事件,将委托挂钩到Global.asax文件或继承自该HttpApplication对象的类中的方法:

    public event MyEventHandler MyEvent
    {
       add { _eventHandler += value; }
       remove { _eventHandler -= value; }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  11. 创建OnBeginRequest方法,该方法连接到以下BeginRequest事件HttpApplication:

    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);
    }        
    
    Run Code Online (Sandbox Code Playgroud)
  12. 编译项目

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

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

<system.web>
    <httpModules>
       <add name="CustomHttpModule" type="MyCustomHttpModule"/>
    </httpModules>
</system.web>
Run Code Online (Sandbox Code Playgroud)


stu*_*ell 8

在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>
Run Code Online (Sandbox Code Playgroud)

......以及IIS 7+

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true">
    <add name="CustomHttpModule" type="MyCustomHttpModule"/>
  </modules>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)


Geo*_*off 5

请注意,这似乎不是开箱即用的。确保不只是包含新模块的类名,而是显式定义其命名空间和(为了完整性)程序集。如果您没有这样做,很有可能您最终会收到 IIS 抱怨无法加载您刚刚编码的新 HTTP 模块的情况。

下面是一个例子。

代替:

<add name="CustomHttpModule" type="MyCustomHttpModule"/>
Run Code Online (Sandbox Code Playgroud)

用:

<add name="CustomHttpModule" type="MyCustomRootNamespace.MyCustomHttpModule, MyCustomAssembly"/>
Run Code Online (Sandbox Code Playgroud)

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

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

Could not load type 'MyCustomHttpModule'.
Run Code Online (Sandbox Code Playgroud)

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

Could not load type 'MyCustomHttpModule' from assembly 'MyCustomAssembly'. 
Run Code Online (Sandbox Code Playgroud)

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