HttpClient.PutAsync 立即完成,没有任何反应
HttpClient.PutAsync finish immediately with no response
我尝试使用以下代码通过 PUT 方法将文件上传到 http 服务器 (Apache Tika)
private static async Task<string> send(string fileName, string url)
{
using (var fileStream = File.OpenRead(fileName))
{
var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/plain"));
var content = new StreamContent(fileStream);
content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
var response = await client.PutAsync(url, content);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
}
在 Main 中,方法是这样调用的:
private static void Main(string[] args)
{
// ...
send(options.FileName, options.Url).
ContinueWith(task => Console.WriteLine(task.Result));
}
作为响应,服务器应该 return HTTP 200 和文本响应(已解析的 pdf 文件)。我已经用 Fiddler 检查了这种行为,就服务器而言它工作正常。
不幸的是,执行在调用 PutAsync 方法后立即结束。
我做错了什么?
您正在从控制台应用程序执行此操作,该应用程序将在您调用 send
后终止。您必须在其上使用 Wait
或 Result
才能使 Main
不终止:
private static void Main(string[] args)
{
var sendResult = send(options.FileName, options.Url).Result;
Console.WriteLine(sendResult);
}
注意 - 这应该只在控制台应用程序中使用。由于同步上下文编组,使用 Task.Wait
或 Task.Result
将导致其他应用程序类型(非控制台)出现死锁。
我尝试使用以下代码通过 PUT 方法将文件上传到 http 服务器 (Apache Tika)
private static async Task<string> send(string fileName, string url)
{
using (var fileStream = File.OpenRead(fileName))
{
var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/plain"));
var content = new StreamContent(fileStream);
content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
var response = await client.PutAsync(url, content);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
}
在 Main 中,方法是这样调用的:
private static void Main(string[] args)
{
// ...
send(options.FileName, options.Url).
ContinueWith(task => Console.WriteLine(task.Result));
}
作为响应,服务器应该 return HTTP 200 和文本响应(已解析的 pdf 文件)。我已经用 Fiddler 检查了这种行为,就服务器而言它工作正常。
不幸的是,执行在调用 PutAsync 方法后立即结束。
我做错了什么?
您正在从控制台应用程序执行此操作,该应用程序将在您调用 send
后终止。您必须在其上使用 Wait
或 Result
才能使 Main
不终止:
private static void Main(string[] args)
{
var sendResult = send(options.FileName, options.Url).Result;
Console.WriteLine(sendResult);
}
注意 - 这应该只在控制台应用程序中使用。由于同步上下文编组,使用 Task.Wait
或 Task.Result
将导致其他应用程序类型(非控制台)出现死锁。