2014-09-29 56 views
3

我想從我的ViewModel(首先 - GET,然後 - POST)使用HttpClient發送兩個請求。 GET請求完成後沒有任何錯誤。但是,如果後來我發送POST請求我得到異常:第一次請求HttpClientHandler後處置

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

或者,如果我跑前GET POST請求 - POST完成確定和GET - 失敗,出現相同的異常。

我使用一個HttpClientHandler兩個請求(becouse我存儲在HttpClientHandler餅乾)

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} 
+0

什麼是你的異常堆棧跟蹤? – 2014-09-29 16:50:26

回答

4

這是我的故障。添加第二個參數(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")); 
    } 
} 

你可以閱讀一下here

相關問題