C# 发布到web API时出现异常,HTTPClient已被释放
我在Xamarin.Forms中发布了一个来自Android应用程序的bytearray到.NETCore2.0WebAPI。然而,我得到了一个异常,即NetworkStream已经被释放 提出请求的代码C# 发布到web API时出现异常,HTTPClient已被释放,c#,asp.net-web-api,C#,Asp.net Web Api,我在Xamarin.Forms中发布了一个来自Android应用程序的bytearray到.NETCore2.0WebAPI。然而,我得到了一个异常,即NetworkStream已经被释放 提出请求的代码 public async Task PostImageAsync(ImageDTO image) { var content = new MultipartFormDataContent(); var byteArrayContent = new ByteArrayConten
public async Task PostImageAsync(ImageDTO image)
{
var content = new MultipartFormDataContent();
var byteArrayContent = new ByteArrayContent(image.Content);
content.Add(byteArrayContent, image.FileTile, image.FileName);
try
{
using (var httpClient = GetNewHttpClient())
{
SetBearerToken(httpClient);
var response = await httpClient.PostAsync($"{_apiUrl}/api/images/upload", content);
if (response.IsSuccessStatusCode)
{
}
else
{
}
}
}
catch (Exception e)
{
//Exception occurs here
var msg = e.GetBaseException().Message;
throw;
}
}
获取HttpClient的代码
API端点
例外情况:
我在这里犯了一个非常明显的错误,但我无法改变我的想法。有人有什么想法吗?不要处理HttpClient:
还注意到,您将_apirl设置为基本地址,并在帖子中为url添加前缀。挑一个或另一个 不要在异步函数中处理对象 异步方法中的using语句很奇怪,因为Dispose 调用可以在与获取调用的线程不同的线程中执行 资源(取决于同步上下文等),但仍将 发生假设你等待的东西曾经出现或消失 当然失败了。就像你不会打电话进来一样 如果using语句包含对方法的调用,则为非异步代码 永远不会回来 @乔恩·斯基特
在调用之前是否使用了HttpClientHandler?SetBearerToken中发生了什么?@CamiloTerevinto,不,这是API中第一个也是唯一一个使用HttpClientHandler的方法it@Seb,我会用这种方法更新问题谢谢,我会调查一下你必须处理HttpClient,这是完全错误的。
private HttpClient GetNewHttpClient()
{
//HttpClientHandler is a global variable
var httpClient = new HttpClient(HttpClientHandler, false) {BaseAddress = new Uri(_apiUrl)};
return httpClient;
}
[HttpPost]
public async Task<IActionResult> Upload(IFormFile file)
{
if (file == null || file.Length == 0) return BadRequest();
return Ok();
}
private static void SetBearerToken(HttpClient client)
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", App.StoredToken);
}
cannot access a disposed object. Object name: 'System.Net.Sockets.NetworkStream'.