0

在案例 1 中我遇到了异常,但案例 2 和 3 工作正常。案例 1 是否陷入僵局等待响应。

    public class MessageHandler1 : DelegatingHandler
    {
        protected async override Task<HttpResponseMessage> SendAsync(
            HttpRequestMessage request, CancellationToken cancellationToken)
        {
            Debug.WriteLine("Process request");
            var response = await this.ProcessRequestAsync(request, cancellationToken);
            Debug.WriteLine("Process response");
            return response;
        }
    }

情况1:

    private async Task<HttpResponseMessage> ProcessRequestAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    {
        using(HttpClientHandler clienthandler = new HttpClientHandler()) 
        {
          using(var client = new HttpClient(clienthandler)) 
          {
            using(var clonedRequest = await HttpRequestMessageExtensions.CloneHttpRequestMessageAsync(request)) 
            {
                ...
                var response = await client.SendAsync(clonedRequest, HttpCompletionOption.ResponseContentRead, 
                cancellationToken);
                ...
                return response;
            }
          }
        }
    }

案例 2:将 ConfigureAwait(false) 添加到 SendAsync

    private async Task<HttpResponseMessage> ProcessRequestAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    {
        using(HttpClientHandler clienthandler = new HttpClientHandler()) 
        {
          using(var client = new HttpClient(clienthandler)) 
          {
            using(var clonedRequest = await HttpRequestMessageExtensions.CloneHttpRequestMessageAsync(request)) 
            {
                ...
                var response = await client.SendAsync(clonedRequest, HttpCompletionOption.ResponseContentRead, 
                cancellationToken).ConfigureAwait(false);
                ...
                return response;
            }
          }
        }
    }

案例 3:使用 httpclient 删除包装

    private async Task<HttpResponseMessage> ProcessRequestAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    {
        using(HttpClientHandler clienthandler = new HttpClientHandler()) 
        {
            var client = new HttpClient(clienthandler);
            var clonedRequest = await HttpRequestMessageExtensions.CloneHttpRequestMessageAsync(request);
            ...
            var response = await client.SendAsync(clonedRequest, HttpCompletionOption.ResponseContentRead, cancellationToken);
            ...
            return response;
        }
    }
Exception: Error while copying content to a stream.

InnerException":{
  "ClassName":"System.Net.WebException",
  "Message":"The request was aborted: The request was canceled.",
  "Data":null,
  "InnerException":null,
  "HelpURL":null,"StackTraceString":"   at System.Net.ConnectStream.BeginRead(Byte[] buffer, Int32 offset, Int32 size, AsyncCallback callback, Object state)
   at System.Net.Http.HttpClientHandler.WebExceptionWrapperStream.BeginRead(Byte[] buffer, Int32 offset, Int32 count, AsyncCallback callback, Object state)",
  "RemoteStackTraceString":null,
  "RemoteStackIndex":0,
  "ExceptionMethod":"8
BeginRead
System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Net.ConnectStream
System.IAsyncResult BeginRead(Byte[], Int32, Int32, System.AsyncCallback, System.Object)",
  "HResult":-2146233079,
  "Source":"System",
  "WatsonBuckets":null
}


'Microsoft.Owin.Host.HttpListener.RequestProcessing.HttpListenerStreamWrapper'.",
  "Data":null,
  "InnerException":{
    "ClassName":"System.NotSupportedException",
    "Message":"This stream does not support seek operations.",
    "Data":null,
    "InnerException":null,
    "HelpURL":null,
    "StackTraceString":"   at System.Net.HttpResponseStream.get_Length()
   at GetLength(Object )
   at Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(Object target)",
    "RemoteStackTraceString":null,
    "RemoteStackIndex":0,
    "ExceptionMethod":"8
get_Length
System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Net.HttpResponseStream
Int64 get_Length()",
    "HResult":-2146233067,
    "Source":"System",
    "WatsonBuckets":null
  }
4

0 回答 0