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 后终止。您必须在其上使用 WaitResult 才能使 Main 不终止:

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

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