我正在尝试基于404 response为服务器上所有站点上的某些请求生成HttpRequest.UserAgent
。
我已经在服务器的全局IHttpModule
中配置了一个web.config
,其中包含以下代码:
private void Application_BeginRequest(Object source, EventArgs e)
{
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
if (isBot(context.Request.UserAgent))
{
System.Diagnostics.EventLog.WriteEntry(
"Application",
"\nBotRequestChecker -- request 404d\n" + "Url: " +
context.Request.Url + "\nUserAgent: " + context.Request.UserAgent,
EventLogEntryType.Information);
context.Response.StatusCode = 404;
context.Response.StatusDescription = "Not Found";
context.ApplicationInstance.CompleteRequest();
}
}
在浏览器中设置
User-Agent
并访问页面会在事件日志中产生一个条目,但也会返回该页面,但不会显示404状态。对我想念的东西有什么想法吗?
更新:
如果我将
IHttpModule
添加到单个站点(在该站点的web.config
中)而不是对所有站点,它似乎都可以工作。更新2:
IHttpModule
仅可用于IIS7服务器上的单个站点,而不能用于IIS6。 最佳答案
确保您已预订模块的IHttpModule.Init()
实现中的BeginRequest事件。在IHttpModule
实现中,事件不会像在Global.asax中那样自动连接。
一开始我也错过了有关全局web.config的知识。
在64位服务器上,您需要确保在需要支持的所有ASP.NET版本中对32位和64位配置(取决于网站所运行的位数)进行更改。 :
%windows%\Microsoft.NET\Framework\v2.0.50727\CONFIG\web.config
%windows%\Microsoft.NET\Framework64\v2.0.50727\CONFIG\web.config
%windows%\Microsoft.NET\Framework\v4.0.30319\CONFIG\web.config
%windows%\Microsoft.NET\Framework64\v4.0.30319\CONFIG\web.config
如果您同时定位IIS6和IIS7,则需要确保在IIS6的
<system.web>/<httpModules>
元素和IIS7的<system.webServer>/<modules>
元素中都引用了该模块。