我正在尝试调用一种方法,该方法从Win App返回asp.net Web API中的文件,但出现以下错误:
没有MediaTypeFormatter可以从媒体类型为“ application / octet-stream”的内容中读取“ StreamContent”类型的对象
我已经检查了我所有的代码,但是我不知道如何解决该问题。
HttpClient _client = new HttpClient();
_client.BaseAddress = new Uri("http://localhost:49681/api/ZipFile/");
_client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/octet-stream"));
// _client.DefaultRequestHeaders.Accept.Add(new ContentDispositionHeaderValue("attachment"));
HttpResponseMessage resp = _client.GetAsync("DownloadFile?fileName=/" + startPath).Result;
if (resp.StatusCode == System.Net.HttpStatusCode.OK)
{
//var file = resp.Content.ReadAsAsync<string>().Result;
var fileDownloaded = resp.Content.ReadAsAsync<StreamContent>().Result;
Stream fileStream = File.Create(@"c:\test\" + fileDownloaded);
//ZipFile.ExtractToDirectory(file, extractPath);
//MessageBox.Show(resp);
}
else
{
MessageBox.Show(resp.StatusCode.ToString());
}
答案 0 :(得分:1)
您不能仅仅使用StreamContent
神奇地将HTTP响应的内容转换为ReadAsAsync<StreamContent>
-您需要通过MediaTypeFormatter
告诉系统该如何做(您可以必须写,因为没有ReadAsStreamContentAsync
)。但是,将内容读取为字节数组(或流-使用ReadAsStreamAsync),然后使用该文件在磁盘上创建文件会容易得多:
var fileDownloaded = await response.Content.ReadAsByteArrayAsync();
using (FileStream fileStream = File.Open(@"c:\test\" + yourFileName, FileMode.OpenOrCreate))
{
fileStream.Seek(0, SeekOrigin.End);
await fileStream.WriteAsync(fileDownloaded, 0, fileDownloaded.Length);
}