2017-07-07 45 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)

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

不,請在下一行中使用Http請求調用SendAsync。您無法切換線程,仍然可以訪問正確的http請求上下文,因此您必須使用ConfigureAwait(true)或省略對ConfigureAwait的呼叫。

+0

感謝理的問題是各地的服務器端代碼中的其他主題應始終使用ConfigureAwait(假) - 我會用ConfigureAwait(真),所以我們不要混淆它 –

+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); 
    } 
} 
相關問題