我有一个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标头后出现服务器无法追加标头错误。有人可能知道为什么?
您可能必须通过'global.asax'来完成此操作,而不是在正确的时间正确截取它。 – ryan