我々はWEBAPIのプロジェクトをビルドする場合、通常はカスタムを通じてこの機能を実現するために私たちのWEBAPI DelegateHandlerの枠組みの中で、APIリクエストと関数の戻りの世界記録を構築する必要があり、
DelegateHandlerパイプラインは、.NETコアフレームワークには存在しません、我々はミドルウェアのパイプラインを通じて達成する必要があります。特定以下を達成。
定義されたLoggingMiddleware
パブリック クラスGlobalApiLoggingMiddleware:IMiddleware { プライベート 読み取り専用ILoggerですの_logger; 公共GlobalApiLoggingMiddleware(ILoggerFactory LoggerFactory) { _logger = loggerFactory.CreateLogger(" ApiLog " ); }
パブリックタスクInvokeAsync非同期(のHttpContextコンテキスト、RequestDelegate次へ)
{
//ここでは、要求をインターセプトログ収集
ザはnext.Invoke(コンテキスト)を待ちます;
}
}
HttpContextの定義
リクエストとレスポンスオブジェクト内で見ることができなくなりまし要求パケットでHttpRequestMessage、HttpResponseMessage WEBAPIフレームを介して直接利用できるようにしないとパケットを返す、のHttpRequestおよびHttpResponseにあります。
ここでは、いくつかのスキルを取ります。
要求パケットを取得し、
// Reuqest支援バフ、そうでない場合は、本体は一度しか読み取ることができます )(context.Request.EnableBuffering; //はここストリームを放出しない、またはそれ以降はrequest.bodyが文句を言うでしょう読み込む VARのリーダー= 新しい新しいStreamReaderを(context.Request.Body、エンコーディング.UTF8); VAR requestStr reader.ReadToEnd =();
最初の要求バッファWEBAPIフレームワークに類似を設定する必要があり、同様に、要求パケットを取得し、この要求メッセージは何回も読むことができます
第二の方法は、メッセージがストリームが流れ、を介して取得取得することです不要なリリースを放出しない解放されません。言うには3つの重要な事柄。
もう少し複雑なリターン・メッセージを取得します。
ストリームoriginalBody = context.Response.Body。 試す { 使用(VARの memStream = 新規のMemoryStreamを()) { context.Response.Body = memStream。 待つnext.Invoke(コンテキスト)。 VaRの要求= context.Request。 VaRのログ= 新しいApiLogEntity() { APPKEY = request.GetAppkey()、 クライアントIP = request.GetClientRealIp()、 HTTPMETHOD = request.Method、 求める = requestStr、 RequestId = request.GetRequestId()、 RequestUrl = request.Path.Value、 のQueryString = request.QueryString.Value、 SERVERIP = request.Host.Value、 のStatusCode = context.Response.StatusCode } ; memStream.Position = 0 ; log.Response = 新しいですStreamReaderを(memStream).ReadToEnd(); memStream.Position = 0 ; ザが待つmemStream.CopyToAsync(originalBody)を、 _logger.LogInformation(JsonConvert.SerializeObject()ログ); } } 最後に { // ためresponse.bodyに再割り当てバック context.Response.Body = originalBody; }
ここではHttpResponse体を読み取ることが許可されていません!!だからここ戦略は、新しいストリームを割り当てられた体を与えることです、
戻り値を取得するには、アクションを実行した後、あなたはストリームを読み取ることができるメッセージの私たち自身の定義を取得するために戻りました
最後に、戻り値のストリームは、元の身体にオブジェクトをコピーして、クライアントが右に戻ることができcontext.Response.Body、に再割り当て。
OK、の終わり!