2

パラメータなしで特定の URL を使用すると例外をスローするライブ サイトをクロールし続ける IP のリストがあります (MVC ルーティングのため)。これらの IP アドレスをブロックし、検出されたらすぐに 404 not found ページを返したいのですが、アプリケーション内での遭遇をログに記録したいので、IIS では実行したくありません。

カスタム 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ヘッダーが送信された後にサーバーがヘッダーを追加できないというエラーが発生し続けます。理由を知っている人はいますか?

4

1 に答える 1

2

ハンドラーからステートメントを削除する必要があると思いますhttpContext.Response.End();-リクエストはさらに処理するために渡されるため、今すぐ終了するべきではありません。

HttpResponse.EndMSDNからのメソッドの説明:

現在バッファリングされているすべての出力をクライアントに送信し、ページの実行を停止して、EndRequest イベントを発生させます。

于 2012-12-11T14:32:27.093 に答える