2017-07-07 1 views
3

HttpMessageHandler内で非同期呼び出しがある場合は、.ConfigureAwaitメソッドを使用する必要があります。HttpMessageHandlerでConfigureAwait(false)を使用する必要があります

/// <summary> 
/// Handler to assign the MD5 hash value if content is present 
/// </summary> 
public class RequestContentMd5Handler : DelegatingHandler 
{ 
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     if (request.Content == null) 
     { 
      return await base.SendAsync(request, cancellationToken); 
     } 

     await request.Content.AssignMd5Hash().ConfigureAwait(false); 

     var response = await base.SendAsync(request, cancellationToken); 

     return response; 
    } 
} 

答えて

3

私はあなたがこのラインについて、その行にConfigureAwait(false)を持つことがOKであれば話をしていると仮定します。

await request.Content.AssignMd5Hash().ConfigureAwait(false); 

いいえ、次の行には、HTTPリクエストでSendAsyncが呼び出されます。スレッドを切り替えても、正しいhttp要求コンテキストにアクセスすることはできませんので、ConfigureAwait(true)を使用するか、ConfigureAwaitの呼び出しを一緒に省略する必要があります。

+0

おかげで、質問の根拠サーバー側のコードの周りのすべての他のトピックは常にConfigureAwait(false)を使用する必要がありました - 私はConfigureAwait(true)を使用しますので、我々はそれを –

+2

どのように来るを混同しないのですか?正しいHTTP要求が引数として渡されています。 –

3

待っているコードの後のコードが同期コンテキストによって提供されるコンテキストに戻る必要がない場合は、常にConfigureAwait(false)を使用する必要があります。

/// <summary> 
/// Handler to assign the MD5 hash value if content is present 
/// </summary> 
public class RequestContentMd5Handler : DelegatingHandler 
{ 
    protected override async Task<HttpResponseMessage> SendAsync(
     HttpRequestMessage request, 
     CancellationToken cancellationToken) 
    { 
     if (request.Content != null) 
     { 
      await request.Content.AssignMd5Hash().ConfigureAwait(false); 
     } 

     return await base.SendAsync(request, cancellationToken); 
    } 
} 
関連する問題