ASP.NET CoreではRequestを複数回読み取ることはできない.BodyとPositionの設定の問題

1544 ワード

Asp.Net Coreと従来のAsp.NetはHttpContextに対応する.RequestのSteam(.Net Coreでは属性Body、.Netでは対応する属性がInputStream)の処理メカニズムが少し異なります、Asp.Net CoreのRequest.BodyはデフォルトでRequestを許さない.Body.Position=0ということは、一度しか読み取ることができないことを意味する、何度も読み取るには、ASP.NET Core 2.1で提供する解決策は、1回目の読み取り前にRequestを通過することである.EnableRewind()【名前空間Microsoft.AspNetCore.Http.Internalを参照する必要がある】、リバース機能を有効にすればRequest.Bodyは通常のStreamに戻った.NET Core 3.1で呼び出す方法はRequest.EnableBuffering【Core 2.1にもEnableBufferingメソッドがあり、Microsoft.AspNetCore.Httpネーミングスペースの導入が必要】
EnableRewindには2つのパラメータbufferThresholdとbufferLimitがあります。bufferThresholdの設定はRequestです。Bodyの最大キャッシュバイト数(デフォルトは30 K)は、このしきい値を超えるバイトがディスクに書き込まれます。bufferLimitはRequestを設定しています。Bodyが許容する最大バイト数(デフォルトはnull)は、この制限を超えると異常Systemを放出する.IO.IOException 。 EnableRewindの実装元コードはBufferingHelper.cs

以下は、プロジェクトコードの例【Actionメソッドフィルタ(SignaturerFilterAttribute:Attribute,IActionFilter)署名検証時のアプリケーションシーン】です.
        private bool Verify(ActionExecutingContext context)
        {            
            var request = context.HttpContext.Request;           
            request.EnableRewind();
            request.Body.Seek(0, SeekOrigin.Begin);            
            var sr = new StreamReader(request.Body);
            string json = sr.ReadToEnd();
            request.Body.Seek(0, SeekOrigin.Begin);
            ..................
        }

 
参照先:
https://www.cnblogs.com/dudu/p/9190747.html
https://stackoverflow.com/questions/40494913/how-to-read-request-body-in-a-asp-net-core-webapi-controller