2017-12-06 4 views
1

現在、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"); 
    } 

答えて

0

は、郵便配達が私の最高のアイデアではありませんでした使用して、判明。私は、httpclientを使用してコンソールアプリケーションを作成し、私のテストメソッドを要求しました。 httpstatus 408が期待通りに返されます。

関連する問題