現在、WebApi 2 Message Handlerで調査中です。キャンセルトークンを使用してサーバーサイドタイムアウトを実装する方法キャンセルが発生すると、OperationCanceledExceptionがスローされ、メッセージハンドラで処理されます。この場合、適切なHttpStatusCode(HttpStatusCode.RequestTimeout)を持つHttpResponseMessageを返します。 私の消費するクライアント(postmanを使用して)がこのHttpStatusCodeを取得することを期待しましたが、代わりに「応答を取得できませんでした」というメッセージが表示されるため、クライアントは追加情報なしで終了します。誰かが私にこの行動との関係を説明することができますか?私は何が欠けていますか?WebApi 2:処理後のカスタムHttpResponseMessageメッセージハンドラのOperationCanceledExceptionがクライアントに返されない
次のコード例を参照してください:次のように
public class RequestTimeoutHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
TimeSpan timeout = TimeSpan.FromSeconds(10.0);
using (CancellationTokenSource timeoutCancellationTokenSource = new CancellationTokenSource(timeout))
using (CancellationTokenSource linkedCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, timeoutCancellationTokenSource.Token))
{
try
{
return await base.SendAsync(request, linkedCancellationTokenSource.Token);
}
catch (OperationCanceledException e)
{
return new HttpResponseMessage(HttpStatusCode.RequestTimeout);
}
}
return null;
}
}
私のテストコントローラ方法になります。
[Route("testTimeoutAsyncHandleException"), HttpPost]
public IHttpActionResult TestTimeoutAsynchandle(string hugo, CancellationToken ct)
{
for (int i = 0; i < 500; i++)
{
Thread.Sleep(1000); //sleep 1 sec until exception is thown
if (ct.IsCancellationRequested)
{
ct.ThrowIfCancellationRequested();
}
}
return Ok("yes");
}