2012-12-11 35 views
2

我有一个IP列表,它们会继续爬行我们的活动站点,当它们使用某些没有参数的URL(因为MVC路由)时会抛出异常。我希望阻止这些IP地址,并尽快返回404找不到页面,但我不想在IIS中执行此操作,因为我想在应用程序中记录遇到的情况。从MVC routehandler返回404

我已经写了使用自定义MvcHandler检查列表和修改响应一个包罗万象的类型routehandler:

public class ApplicationRouteHandler : IRouteHandler 
{ 
    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     BlacklistedIPAddressHandler handler = new BlacklistedIPAddressHandler(Cache.WebsiteCache.GetBlacklistedIPList(), requestContext); 

     return handler; 
    } 
} 

public class BlacklistedIPAddressHandler : MvcHandler 
{ 
    List<IPBlacklistModel> blacklist; 

    public BlacklistedIPAddressHandler(List<IPBlacklistModel> Blacklist, RequestContext requestContext) : base(requestContext) 
    { 
     blacklist = Blacklist; 
    } 

    protected override IAsyncResult BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, object state) 
    { 
     var ip = httpContext.Request.UserHostAddress; 

     if (blacklist != null && 
      blacklist.Where(x => x.IP_ADDRESS.Contains(ip)).Count() > 0) 
     { 

      httpContext.Response.ClearHeaders(); 
      httpContext.Response.Clear(); 

      httpContext.Response.StatusCode = 404; 
      httpContext.Response.SuppressContent = true; 
      httpContext.Response.End(); 
     } 

     return base.BeginProcessRequest(httpContext, callback, state); 
    } 
} 

它然后实现如下:

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.MapRoute(
      "Default", 
      "{controller}/{action}/{id}", 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
      new { controller = @"[^\.]*" } 
     ).RouteHandler = new Helpers.Routing.ApplicationRouteHandler(); 
    } 

我一直在执行此操作时,如果在发送HTTP标头后出现服务器无法追加标头错误。有人可能知道为什么?

+0

您可能必须通过'global.asax'来完成此操作,而不是在正确的时间正确截取它。 – ryan

回答

2

我想你应该从你的处理程序中删除httpContext.Response.End();语句 - 因为请求被传递给进一步处理,所以现在不应该终止它。从MSDN

HttpResponse.End方法描述:

发送所有当前缓冲输出到客户端,停止的 执行的页面,并引发EndRequest事件。

+0

不知道你*是否*是正确的,但肯定*听起来*正确。 – comecme