コントローラのアクションでオブジェクトを試行すると、散発的にnullのように見えます。ReadAsStringAsync()
のSendAsync()
オーバーライドが原因であることがわかりましたDelegatingHandler
。問題はコンテンツにあります。クライアントがコンテンツ本文を送信し、それがロガーで読み取られると、Controller Action Invokerによって読み取られることはありません(またはのどこかにある可能性がありますJsonFormatter
)。の後続の呼び出しContent.ReadAsStringAsync()
は例外をスローしないが、期待されるコンテンツ本文も返さないのではないかと思います(非同期読み取りが完了したことを示す情報が返されます)。
しかし、アクションでパラメーターを読み取りたいので、私の問題は残ります。RaceConditionがで勝った[FromBody]
場合はnullになります。勝ったとき、私はオブジェクトを取得しますが、それはまれです(サービスの起動時のみ)。Content.ReadStringAsync
DelegatingHandler
JsonFormatter
これが私のDelegatingHandler
コードです:
public class LogHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var apiRequest = new WebApiUsageRequest(request);
WriteLog(apiRequest);
request.Content.ReadAsStringAsync().ContinueWith(t =>
{
apiRequest.Content = t.Result;
WriteLog(apiRequest);
});
return base.SendAsync(request, cancellationToken).ContinueWith(task =>
{
var apiResponse = new WebApiUsageResponse(task.Result);
apiResponse.Content = task.Result.Content != null ? task.Result.Content.ReadAsStringAsync().Result : null;
WriteLog(apiResponse);
return task.Result;
});
}
}
誰かがこの問題の解決策への手がかりを持っていますか?