簡體   English   中英

在第一次請求后,HttpClientHandler被釋放

[英]After first request HttpClientHandler is disposed

我想使用HttpClient從我的ViewModel發送兩個請求(第一個--GET,然后是 - POST)。 GET請求完成,沒有任何錯誤。 但如果那時我發送POST請求我得到例外:

{System.ObjectDisposedException: The object has been closed. (Exception from HRESULT: 0x80000013)}  System.Exception {System.ObjectDisposedException}

或者如果我在GET之前運行POST請求 - POST完成正常並且GET - 失敗並且具有相同的異常。

我正在為兩個請求使用一個HttpClientHandler(因為我在那個HttpClientHandler中存儲了Cookie)

public async Task<CategoryGroupModel> GetCategoryGroup(int categoryGroupId)
{
  var handler = new HttpClientHandler {CookieContainer = App.Cookies};

  using (var client = new MmcHttpClient(handler))
  {
    // HTTP GET
    HttpResponseMessage response = await client.GetAsync("api/categorygroups/" + categoryGroupId);
    if (response.IsSuccessStatusCode)
    {
      var resultAsString = await response.Content.ReadAsStringAsync();
      var jsonResult = JObject.Parse(resultAsString);
      var wsResponse = jsonResult.ToObject<WebServiceResponse<CategoryGroupModel>>();

      if (wsResponse.Status == HttpStatusCode.OK)
      {
        return wsResponse.Result;
      }
      else
      {
        throw new Exception();
      }
    }
    else
    {
      throw new Exception();
    }
  }
}

public async Task<CategoryGroupModel> CreateCategoryGroup(CategoryGroupModel categoryGroup)
{
  var handler = new HttpClientHandler {CookieContainer = App.Cookies};

  using (var client = new MmcHttpClient(handler))
  {
    var response = await client.PostAsJsonAsync("api/categorygroups", categoryGroup);
    if (response.IsSuccessStatusCode)
    {
      var resultAsString = await response.Content.ReadAsStringAsync();
      var jsonResult = JObject.Parse(resultAsString);
      var wsResponse = jsonResult.ToObject<WebServiceResponse<CategoryGroupModel>>();

      if (wsResponse.Status == HttpStatusCode.OK)
      {
        return wsResponse.Result;
      }
      else
      {
        throw new Exception();
      }
    }
    else
    {
      throw new Exception();
    }
  }
}

MmcHttpClient:

public class MmcHttpClient : HttpClient
{
  public MmcHttpClient(HttpClientHandler handler) : base(App.Handler)
  {
    BaseAddress = new Uri("http://localhost:65066/");
    DefaultRequestHeaders.Accept.Clear();
    DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
  }
}

堆棧跟蹤:

System.ObjectDisposedException: Cannot access a disposed object. Object name: 'System.Net.Http.HttpClientHandler'.
at System.Net.Http.HttpClientHandler.CheckDisposed()
at System.Net.Http.HttpClientHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
at System.Net.Http.HttpMessageInvoker.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
at System.Net.Http.HttpClient.SendAsync(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationToken cancellationToken)
at System.Net.Http.HttpClient.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
at System.Net.Http.HttpClient.PostAsync(Uri requestUri, HttpContent content, CancellationToken cancellationToken)
at System.Net.Http.HttpClient.PostAsync(String requestUri, HttpContent content, CancellationToken cancellationToken)
at System.Net.Http.HttpClientExtensions.PostAsync[T](HttpClient client, String requestUri, T value, MediaTypeFormatter formatter, MediaTypeHeaderValue mediaType, CancellationToken cancellationToken)
at System.Net.Http.HttpClientExtensions.PostAsync[T](HttpClient client, String requestUri, T value, MediaTypeFormatter formatter, CancellationToken cancellationToken)
at System.Net.Http.HttpClientExtensions.PostAsJsonAsync[T](HttpClient client, String requestUri, T value, CancellationToken cancellationToken)
at System.Net.Http.HttpClientExtensions.PostAsJsonAsync[T](HttpClient client, String requestUri, T value)
at MMCClient.Repositories.CategoryGroupRepository.<CreateCategoryGroup>d__15.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at MMCClient.ViewModels.CategoryGroupViewModel.<Create>d__9.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<ThrowAsync>b__3(Object state)
at System.Threading.WinRTSynchronizationContext.Invoker.InvokeCore()}   System.Exception {System.ObjectDisposedException}

這都怪我。 將第二個param(disposeHandler)添加到HttpClient構造函數后,所有工作都很好:

public class MmcHttpClient : HttpClient
{
  public MmcHttpClient(HttpClientHandler handler, bool disposeHandler) : 
    base(App.Handler, disposeHandler)
  {
    BaseAddress = new Uri("http://localhost:65066/");
    DefaultRequestHeaders.Accept.Clear();
    DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
  }
}

你可以在這里閱讀它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM