HttpClient.PutAsync立即完成,没有响应

时间:2015-02-23 14:22:03

标签: c# async-await .net-4.5 dotnet-httpclient

我尝试使用以下代码将带有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方法后,执行完成。

我做错了什么?

1 个答案:

答案 0 :(得分:3)

您正在从控制台应用程序执行此操作,该应用程序将在您致电send后终止。您必须使用WaitResult才能Main不终止:

private static void Main(string[] args)
{
    var sendResult = send(options.FileName, options.Url).Result;
    Console.WriteLine(sendResult);
}

注意 - 这应仅在控制台应用程序中使用。由于同步上下文封送,使用Task.WaitTask.Result将导致其他应用程序类型(不是控制台)出现死锁。