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

时间:2009-03-24 22:50:27

标签: asp.net httpmodule

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

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

5 个答案:

答案 0 :(得分:11)

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

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

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

  6. 实施IHttpModule界面。您的类定义应如下所示:

    public class SyncModule : IHttpModule                    
    
  7. 决定您要订阅的活动。以下列表概述了您可以订阅的HttpApplication对象中的可用事件:

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

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

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

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

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

    HttpApplication
  13. 编译项目

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

    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); } 添加HTTP模块将如下所示:

    web.config

答案 1 :(得分:8)

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

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

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

  1. 调试|附加到流程...
  2. 检查在所有会话中显示流程
  3. 选择您的工作流程实例( w3wp.exe
  4. 点击附加
  5. 刷新浏览器,现在应该点击断点。

    由于配置问题,实际上并未加载模块。

    如果您可以确定模块代码肯定是正在执行,那么这不是问题。但有时候,当一个模块在其他机器上正常加载时,它可能没有加载到你的开发盒上,因为你有一个不同版本的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>
    

答案 2 :(得分: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'. 

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

答案 3 :(得分:2)

你可以写一行

System.Diagnostics.Debugger.Break(); //明确调用Break to debug

在HttpModule consturction期间显式调用断点。

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

由于

答案 4 :(得分:0)

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