2014-09-29 59 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

相关问题