作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用 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}
最佳答案
是我的错。将第二个参数 (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
关于c# - 在处理完第一个请求 HttpClientHandler 之后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26104421/
我们面临一个用例,我们需要在 S3 上存储用户的 secret 图像。现在 S3 可以通过 HTTP 访问,如果我们授予对对象的读取权限,它们将通过 Web 提供给全世界。我们需要将图像/文件仅限于该
我是一名优秀的程序员,十分优秀!