2011-03-31 45 views
3

我试图根据HttpRequest.UserAgent为服务器上的所有站点上的某些请求生成404 response如何从全局web.config中配置的IHttpModule生成404响应?

我已经配置在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

回答

0

确保您已订阅模块的IHttpModule.Init()实施中的BeginRequest事件。这些事件不会像在Global.asax中那样在IHttpModule实现中自动连线。

我也首先错过了关于全局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,你需要确保模块在两个<system.web>/<httpModules>元素IIS6和IIS7的<system.webServer>/<modules>元素引用。

+0

这就是我最初尝试过的,具有相同的非404结果。 – mike 2011-03-31 18:14:26

+0

编辑我的答案删除...基于此:http://forums.asp.net/p/1148761/1867921.aspx它看起来像你做的是正确的事情。 你能确认代码实际上正在被打? – 2011-03-31 18:16:19

+0

另外,你是真的在IIS 6服务器上测试它,还是现在在VS dev服务器(Cassini)中运行? – 2011-03-31 18:19:28