2017-03-27 103 views
0

任何人都可以請幫助我將這段代碼片段轉換爲它的.NET內核等效?WebClient(.net 4.6)到HttpClient(.net核心)

 Uri uri = new Uri(url); 
     string filename = System.IO.Path.GetFileName(uri.LocalPath); 
     string extension = Path.GetExtension(filename); 

     string tempFilepath = Path.GetTempFileName() + extension; 

     try 
     { 
      WebClient webClient = new WebClient(); 
      webClient.DownloadFile(url, tempFilepath); 

      if (new FileInfo(tempFilepath).Length > 0) 
      { 
       return tempFilepath; 
      } 
      else { 
       return null; 
      } 

     } 
     catch (WebException e) 
     { 
      return null; 
     } 
     catch (NotSupportedException e) 
     { 
      return null; 
     } 

實際上,此代碼以前是在.NET 4.6中寫入的應用程序中。然後前一段時間,我們停止使用該應用程序。現在我正在開發另一個.net核心應用程序,並且將完成同樣的事情。所以我想知道我將如何使用.net核心來做到這一點? 什麼是HttpClient中DownloadFile方法的替代方法?

+2

不知道爲什麼人們都反對投票這一點。 @Syed儘自己的努力編寫代碼,這個問題是關於.NET Core框架的變化,而不是要求分發。 –

回答

2

應該做...

try 
{ 
    using (var client = new HttpClient()) 
    { 
     using (HttpResponseMessage response = client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead).Result) 
     { 
      response.EnsureSuccessStatusCode(); 

      using (Stream contentStream = response.Content.ReadAsStreamAsync().Result, fileStream = new FileStream(tempFilepath, FileMode.Create, FileAccess.Write, FileShare.None, 8192, true)) 
      { 
       var buffer = new byte[8192]; 
       var isMoreToRead = true; 

       do 
       { 
        var read = contentStream.ReadAsync(buffer, 0, buffer.Length).Result; 
        if (read == 0) 
        { 
         isMoreToRead = false; 
        } 
        else 
        { 
         fileStream.WriteAsync(buffer, 0, read); 
        } 
       } 

       while (isMoreToRead); 
      } 
     } 
    } 

或者你也可以實現這個更乾淨,像這樣:How to implement progress reporting for Portable HttpClient

+1

非常感謝Ryan!這正是我所期待的。像魅力一樣工作。帽子! – Syed

+1

@Syed如果你的方法是異步的,我會推薦等待'ReadAsStreamAsync'和'ReadAsync'而不是'.Result'。 –

+0

是的,我已經改變它。但感謝提示:) – Syed

0

做起來的一個更簡單的方法...

 HttpClient client = new HttpClient(); 
     try 
     { 
      var response = client.GetStringAsync(url); 
      Console.WriteLine(response.Result); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Message :{0} ", e.Message); 
     } 
     finally{ 
      client.Dispose(); 
     } 

目標框架: netcoreapp1.1
編輯: Visual Studio代碼
應用類型:控制檯應用程序