我想在我的asp.net应用程序(版本3.5,Visual Studio 2008)中集成一些http模块,但我不确定在运行Web应用程序时如何调试或使用这些模块。
我需要将模块源包含在解决方案中还是只需将DLL放入BIN中? 我来自1.1世界,还不习惯使用ASP.NET开发服务器。
我想在我的asp.net应用程序(版本3.5,Visual Studio 2008)中集成一些http模块,但我不确定在运行Web应用程序时如何调试或使用这些模块。
我需要将模块源包含在解决方案中还是只需将DLL放入BIN中? 我来自1.1世界,还不习惯使用ASP.NET开发服务器。
按照以下步骤添加HTTP模块:
MyModule
的新Visual Studio .NET C#类库项目。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
方法,将其挂钩到HttpApplication
的BeginRequest
事件:
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>
Debugger.Launch()
。在此处查看详细信息。 不要忘记在投入生产之前从代码中删除该行,或者使用条件仅在调试版本中启用它! - pholpar<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(); // 明确调用断点以进行调试
在HttpModule构造期间明确调用断点。
它会要求附加进程(例如w3wp.exe),然后调试点将被触发。
谢谢
您可能还想确保使用的是 Web 应用程序项目,这是您在 VS2003 中使用的内容,而不是 Web 站点“项目”,因为它们不是项目。