【问题标题】:Not able to download file using C# from a web api which works using postman无法使用 C# 从使用邮递员工作的 Web api 下载文件
【发布时间】:2016-06-10 14:01:21
【问题描述】:

我最近开始使用 web api。

我需要从 web api 下载 C# 项目中的文件,当我使用邮递员的发送和下载选项点击 web api 时,它工作正常。参考图片,也请检查标题选项卡中的响应。这样,我就可以直接将文件下载到我的电脑上。

我想在我的 C# 项目中做同样的事情,我发现以下两个链接显示了如何从 web api 下载文件。

https://code.msdn.microsoft.com/HttpClient-Downloading-to-4cc138fd http://blogs.msdn.com/b/henrikn/archive/2012/02/16/downloading-a-google-map-to-local-file.aspx

我在 C# 项目中使用以下代码来获取响应:

 private static async Task FileDownloadAsync()
    {
        using (var client = new HttpClient())
        {

            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Add("Accept", "text/html");
            try
            {
                // _address is exactly same which I use from postman
                HttpResponseMessage response = await client.GetAsync(_address);
                if (response.IsSuccessStatusCode)
                {
                }
                else
                {
                }
            }
            catch (Exception)
            {
                throw;
            }
        }
    }

但是我根本没有收到响应(在我开始将响应转换为文件之前),请检查出现的错误消息:

我在这里缺少什么,任何帮助将不胜感激。

【问题讨论】:

    标签: c# asp.net asp.net-web-api


    【解决方案1】:

    正如 (500s) 错误所说 - 拒绝请求的是服务器。我看到的唯一可能导致问题的是字符集编码。你的是默认的 UTF-8。您可以尝试使用其他编码。

    【讨论】:

    • 查看我的更新答案。您使用默认编码,但服务器可能需要不同的编码...例如 utf-16。你能找到一些关于这项服务的文档吗?
    • 我对 web api 非常陌生,如果您知道,请告诉我如何在进行 httpClient 调用时指定编码
    • 您可以在标题中指定此项。以下是一些与您的情况非常接近的code examples
    【解决方案2】:

    以下方法使用:

    1. SSL 证书(如果您不使用,请将证书代码注释掉)
    2. 用于额外安全层的自定义 api 标头(如果不需要,请注释掉 Custom_Header_If_You_Need 代码)
    3. 当响应不是 200 时,EnsureSuccessStatusCode 将引发错误。此错误将被捕获并转换为人类可读的字符串格式以显示在您的屏幕上(如果需要)。再一次,如果你不需要的话,把它注释掉。

      private byte[] DownloadMediaMethod(string mediaId)
      {
          var cert = new X509Certificate2("Keystore/p12_keystore.p12", "p12_keystore_password");
          var handler = new WebRequestHandler { ClientCertificates = { cert } };
          using (var client = new HttpClient(handler))
          {
              client.DefaultRequestHeaders.Accept.Clear();
              client.DefaultRequestHeaders.Add("Custom_Header_If_You_Need", "Value_For_Custom_Header");
              var httpResponse = client.GetAsync(new Uri($"https://my_api.my_company.com/api/v1/my_media_controller/{mediaId}")).Result;
              //Below one line is most relevant to this question, and will address your problem.  Other code in this example if just to show the solution as a whole.
              var result = httpResponse.Content.ReadAsByteArrayAsync().Result;
              try
              {
                  httpResponse.EnsureSuccessStatusCode();
              }
              catch (Exception ex)
              {
                  if (result == null || result.Length == 0) throw;
                  using (var ms = new MemoryStream(result))
                  {
                      var sr = new StreamReader(ms);
                      throw new Exception(sr.ReadToEnd(), ex);
                  }
              }
              return result;
          }
      }
      

    一旦你得到你的 http 响应 200,你就可以使用接收到的 bytes[] 来将它们保存在一个文件中:

    using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write))
    {
        fs.Write(content, 0, content.Length);
    }
    

    【讨论】:

      【解决方案3】:

      您的请求标头表明您只接受 HTML 响应。那可能是个问题。

      【讨论】:

      • 完全省略内容类型。
      猜你喜欢
      • 2019-11-12
      • 2021-01-03
      • 2016-12-22
      • 2019-04-02
      • 2018-07-26
      • 2014-07-27
      • 2019-11-21
      • 1970-01-01
      相关资源
      最近更新 更多