簡體   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