我想在我的 asp.net 应用程序(v 3.5,visual studio 2008)中集成一些 http 模块,但我不确定在运行 web 时触发的 asp.net 开发服务器中调试时如何调试或使用这些模块应用程序。
我需要在解决方案中包含模块源还是可以将 DLL 放入 BIN 中?我来自 1.1 世界,还不习惯 asp.net 开发服务器。
我想在我的 asp.net 应用程序(v 3.5,visual studio 2008)中集成一些 http 模块,但我不确定在运行 web 时触发的 asp.net 开发服务器中调试时如何调试或使用这些模块应用程序。
我需要在解决方案中包含模块源还是可以将 DLL 放入 BIN 中?我来自 1.1 世界,还不习惯 asp.net 开发服务器。
按照以下步骤添加 HTTP 模块:
MyModule
。System.Web.dll
。将以下指令添加到类中:
using System.Web;
重命名类SyncModule.cs
,然后更改类定义以反映这一点。
实现IHttpModule
接口。您的类定义应如下所示:
public class SyncModule : IHttpModule
决定您将订阅哪些事件。以下列表概述了HttpApplication
您可以订阅的对象的可用事件:
AcquireRequestState
: 调用此事件,允许模块获取或创建请求的状态(例如,会话)。AuthenticateRequest
:当安全模块需要在处理请求之前对用户进行身份验证时调用此事件。AuthorizeRequest
: 当请求需要被授权时,由安全模块调用此事件。认证后调用。BeginRequest
:调用此事件以通知模块新请求正在开始。Disposed
:调用此事件以通知模块应用程序由于某种原因而结束。允许模块执行内部清理。EndRequest
:调用此事件通知模块请求正在结束。Error
:调用该事件通知模块在请求处理过程中发生的错误。PostRequestHandlerExecute
:调用此事件通知模块处理程序已完成对请求的处理。PreRequestHandlerExecute
:调用此事件通知模块该请求的处理程序即将被调用。PreSendRequestContent
:调用该事件通知模块内容即将发送给客户端。PreSendRequestHeaders
: 调用该事件通知模块HTTP头即将发送给客户端。ReleaseRequestState
:调用此事件以允许模块释放状态,因为处理程序已完成处理请求。ResolveRequestCache
: 认证后调用此事件。缓存模块使用此事件来确定请求是否应由其缓存处理,或者处理程序是否应处理该请求。UpdateRequestCache
:在处理程序响应后调用此事件。缓存模块应该使用响应更新它们的缓存。实现IHttpModule接口的Init和Dispose方法如下:
public void Init(HttpApplication app)
{
app.BeginRequest += new EventHandler(OnBeginRequest);
}
public void Dispose(){ }
为事件创建委托,如下所示:
public delegate void MyEventHandler(Object s, EventArgs e);
定义一个类型的私有局部变量MyEventHandler
来保存对事件的引用:
private MyEventHandler _eventHandler = null;
创建一个事件,将委托连接到 Global.asax 文件或从HttpApplication
对象继承的类中的方法:
public event MyEventHandler MyEvent
{
add { _eventHandler += value; }
remove { _eventHandler -= value; }
}
创建方法,该方法与以下事件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);
}
编译项目
来源: http: //support.microsoft.com/kb/307996
向您添加一个 HTTP 模块web.config
将如下所示:
<system.web>
<httpModules>
<add name="CustomHttpModule" type="MyCustomHttpModule"/>
</httpModules>
</system.web>
在 HttpModule 中没有命中断点的两个常见原因是:
这个总是得到我。如果要调试模块的构造,则应手动附加调试器。在 Windows 7 上执行此操作(在 Vista 上类似):
刷新你的浏览器,你现在应该点击你的断点。
如果您可以判断模块代码肯定正在执行,那么这不是问题。但有时,当一个模块在其他机器上正常加载时,它可能无法在您的开发盒上加载,因为您有不同版本的 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 抱怨无法加载你刚刚编写的新 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'.
如果您看到另一条错误消息,那么您遇到的问题与此处讨论的问题不同。
你可以写一行
System.Diagnostics.Debugger.Break(); //显式调用Break进行调试
在 HttpModule 构造期间显式调用断点。
它将要求附加进程(例如 w3wp.exe),然后调试点将命中。
谢谢
您可能还想确保您使用的是 Web 应用程序项目,这是您在 VS2003 中使用的,而不是网站“项目”,它们不是项目。