2015-02-23 55 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