コントローラのアクションでオブジェクトを試行すると、散発的にnullのように見えます。ReadAsStringAsync()のSendAsync()オーバーライドが原因であることがわかりましたDelegatingHandler。問題はコンテンツにあります。クライアントがコンテンツ本文を送信し、それがロガーで読み取られると、Controller Action Invokerによって読み取られることはありません(またはのどこかにある可能性がありますJsonFormatter)。の後続の呼び出しContent.ReadAsStringAsync()は例外をスローしないが、期待されるコンテンツ本文も返さないのではないかと思います(非同期読み取りが完了したことを示す情報が返されます)。
しかし、アクションでパラメーターを読み取りたいので、私の問題は残ります。RaceConditionがで勝った[FromBody]場合はnullになります。勝ったとき、私はオブジェクトを取得しますが、それはまれです(サービスの起動時のみ)。Content.ReadStringAsyncDelegatingHandlerJsonFormatter
これが私の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;
});
}
}
誰かがこの問題の解決策への手がかりを持っていますか?