繁体   English   中英

无法从使用邮递员的网络API使用C#下载文件

[英]Not able to download file using C# from a web api which works using postman

我最近开始使用Web API。

我需要从Web api下载C#项目中的文件,当我使用邮递员的发送和下载选项访问Web api时,该文件工作正常。 请参考图片,也请检查标题标签中的响应。 这样,我可以直接将文件下载到我的计算机上。

使用邮递员进行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;
            }
        }
    }

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

错误信息

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

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

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

下面的方法使用:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM