我尝试使用以下代码将带有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));
}
作为响应,服务器应返回HTTP 200和文本响应(解析的pdf文件)。我已经用Fiddler检查了这个行为,就服务器而言它可以正常工作。
不幸的是,在调用PutAsync方法后,执行完成。
我做错了什么?
答案 0 :(得分:3)
您正在从控制台应用程序执行此操作,该应用程序将在您致电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
将导致其他应用程序类型(不是控制台)出现死锁。