3

「正常に」機能する非常に基本的な ASP.NET 応答フィルターがあります。これを使用して、静的リソースのドメインを置き換えます。

コントローラーの私のコードは次のようになります。

    protected override void OnActionExecuted(ActionExecutedContext filterContext)
    {
            _cdnRewriter.Stream = filterContext.RequestContext.HttpContext.Response.Filter;
            filterContext.RequestContext.HttpContext.Response.Filter = _cdnRewriter;
    }

そして、書き換えフィルター自体:

    public override void Write(byte[] buffer, int offset, int count)
    {
        var html = Encoding.Default.GetString(buffer, offset, count);

        //manipulate html

        byte[] outData = Encoding.Default.GetBytes(html);
        Stream.Write(outData, 0, outData.GetLength(0));
    }

私のサイトの特定のページ (韻や理由がまだ見つかりません) で、おそらく 90% の確率で "HTTP Web Exception: Invalid use of response filter" が表示されます。12 回更新するだけで正しい出力が得られますが、再度更新すると例外が表示されます。

[HttpException (0x80004005): Invalid use of response filter]
   System.Web.HttpResponseStreamFilterSink.VerifyState() +4097234
   System.Web.HttpResponseStreamFilterSink.Write(Byte[] buffer, Int32 offset, Int32 count) +28
   NeoSmart.Web.CdnRewriteFilter.Write(Byte[] buffer, Int32 offset, Int32 count) +452
   System.Web.HttpWriter.FilterIntegrated(Boolean finalFiltering, IIS7WorkerRequest wr) +359
   System.Web.HttpResponse.FilterOutput() +121
   System.Web.CallFilterExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +119
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +165

応答フィルターで何か間違ったことをしていますか?

4

1 に答える 1

0

私はおそらくもっとよく知っているべきでした:応答フィルターは共有されるべきではありません。OnActionExecutedクラスごとにオブジェクトを使用していて、関数が呼び出されるたびに新しい応答フィルターを作成して問題を解決しました。

于 2012-11-14T20:48:36.550 に答える