13

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

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

4

5 回答 5

13

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

  1. 创建一个名为 .NET 的新 Visual Studio .NET C# 类库项目MyModule
  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挂钩:BeginRequestHttpApplication

    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>
于 2009-03-24T22:54:30.873 回答
11

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

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

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

  1. 调试 | 附加到进程...
  2. 选中Show processes in all sessions
  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>
于 2010-04-06T13:29:23.017 回答
5

请注意,这似乎不是开箱即用的。确保不仅包括新模块的类名,而是明确定义其命名空间和(为了完整性)程序集。如果你不这样做,很有可能你最终会遇到 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'. 

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

于 2011-01-10T03:06:52.153 回答
2

你可以写一行

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

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

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

谢谢

于 2015-03-12T11:15:03.437 回答
0

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

于 2009-03-24T23:06:53.247 回答