[英]Not able to download file using C# from a web api which works using postman
我最近開始使用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;
}
}
}
但是,我根本沒有得到響應(在我可以開始將響應轉換為文件之前),請檢查錯誤消息:
我在這里缺少什么,任何幫助將不勝感激。
正如(500s)錯誤所說-是服務器拒絕了請求。 我看到的唯一可能引起問題的是字符集編碼。 您的是默認的UTF-8。 您可以嘗試使用其他編碼。
您的請求標頭表示您僅接受HTML響應。 那可能是個問題。
下面的方法使用:
當響應不是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.