没有MediaTypeFormatter可用于从媒体类型为“ application / octet-stream”的内容中读取“ StreamContent”类型的对象

时间:2018-10-22 13:25:08

标签: c# .net

我正在尝试调用一种方法,该方法从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());
}

1 个答案:

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