2017-03-27 62 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代码
应用类型:控制台应用程序