2015-02-23 36 views
0

我试图用PUT方法的文件用下面的代码上传到HTTP服务器(Apache的提卡)HttpClient.PutAsync没有立即响应结束

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(); 
    } 
} 

在主要的方法被称为是这样的:

private static void Main(string[] args) 
{ 
    // ... 

    send(options.FileName, options.Url). 
     ContinueWith(task => Console.WriteLine(task.Result)); 
} 

作为响应,服务器应该返回HTTP 200和文本响应(解析的pdf文件)。我已经用Fiddler检查过这种行为,并且就服务器而言它工作正常。

不幸的是,在调用PutAsync方法之后,执行完成。

我做错了什么?

回答

3

您正在通过控制台应用程序执行此操作,该操作将在您致电send后终止。你必须为了使用就可以了WaitResultMain没有终止:

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

注 - 这应该一个控制台应用程序内部仅使用。由于同步上下文封送处理,使用Task.WaitTask.Result将导致其他应用程序类型(非控制台)出现死锁。

+0

这是解决方案。谢谢!我发现我必须做好我的功课,了解异步在不同类型的应用程序上的工作方式 – Marek 2015-02-24 08:42:13