c# - 从 MVC 路由处理程序返回 404

标签 c# asp.net-mvc-3 routes httphandler blacklist

我有一个 IP 列表,这些 IP 不断抓取我们的实时站点,当它们使用不带参数的某些 URL(由于 MVC 路由)时,它们会抛出异常。我想阻止这些 IP 地址,并在它们被获取后立即返回 404 未找到页面,但我不想在 IIS 中执行此操作,因为我想记录应用程序中的遇到情况。

我编写了一个包罗万象的路由处理程序,它使用自定义 MvcHandler 来检查列表并修改响应:

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 header 后附加 header ”错误。有人可能知道为什么吗?

最佳答案

我想您应该从处理程序中删除 httpContext.Response.End(); 语句 - 由于请求已传递以进行进一步处理,因此现在不应终止它。

MSDN 中的

HttpResponse.End 方法描述:

Sends all currently buffered output to the client, stops execution of the page, and raises the EndRequest event.

关于c# - 从 MVC 路由处理程序返回 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13821517/

相关文章:

c# - 将 string[] 数组分配给带有参数 string[] 的函数

c# - 将组合框中输入的数据与数据库进行匹配

css - 滑动切换无法正常工作

ember.js - Ember : loading Template not working when promise returned from Application Route

c# - 如果记录存在则不插入

c# - 如何在c#中传递回调?

asp.net-mvc - 将项目添加到 asp.net mvc 列表框客户端?

asp.net - 上传多个/大文件

vue.js - 如何同时使用 Vue-Router 和 Gorilla Mux 路由器

ruby-on-rails - 如何使用带有参数的 Rails 命名路由助手?