Web Api 2 没有将 ByteArrayContent 返回给 HTTPClient

Web Api 2 not returning ByteArrayContent to HTTPClient

我正在 win 表单应用程序中使用 WebApi2 和 HttpClient 组合一个测试应用程序。

我遇到了一个问题,我的 HttpClient 请求 WebApi2 控制器 return 一个 HttpResponseMessage 没有 return ByteArrayContent。 WebApi 控制器代码

[HttpGet]
public HttpResponseMessage DownloadFilePart(string fileName)
{
    var path = Server.MapPath("~/App_Data/uploads/" + fileName);
    var fileArray = System.IO.File.ReadAllBytes(path);

    var response = new HttpResponseMessage(HttpStatusCode.OK)
    {
        Content = new  ByteArrayContent(fileArray)
    };

    response.Content.Headers.ContentType = new MediaTypeHeaderValue(System.Web.MimeMapping.GetMimeMapping(fileName));
    response.Content.Headers.ContentLength = fileArray.Length;
    response.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")
    {
        FileName = fileName
    };

    return response;
}

使用 HttpClient 的 WinForms 代码

static async void GetFilePart(string hostrUri)
{
    var httpClient = new HttpClient
    {
        BaseAddress = new Uri(hostrUri)
    };

    var request = new HttpRequestMessage(HttpMethod.Get, "/Home/DownloadFilePart/?fileName=Test.txt");
    var responseMessage = httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
    var memoryStream = new MemoryStream();
    var stream = await responseMessage.Result.Content.ReadAsByteArrayAsync();
    var fileToWriteTo = System.IO.Path.GetDirectoryName(Application.ExecutablePath) + "\Temp\Test.txt";

    using (var fileStream = new FileStream(fileToWriteTo, FileMode.Create, FileAccess.Write, FileShare.None))
    {
        //copy the content from response to filestream
        fileStream.Write(stream, 0, stream.Length);
    }
}

当来自 WebApi 的请求 return 和我将字节写入文件时,写入文件的所有内容都是来自 WebApi 响应的实际 headers。有没有人知道这里可能有什么问题?

谢谢

你的问题就在这里

httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);

HttpCompletionOption.ResponseHeadersRead总结为

The operation should complete as soon as a response is available and headers are read. The content is not read yet.

这可以解释为什么您在回复中只得到 headers。

要么完全删除它,要么将其更改为 HttpCompletionOption.ResponseContentRead

static async void GetFilePart(string hostrUri)
{
    var httpClient = new HttpClient
    {
        BaseAddress = new Uri(hostrUri)
    };

    var request = new HttpRequestMessage(HttpMethod.Get, "/Home/DownloadFilePart/?fileName=Test.txt");
    var responseMessage = await httpClient.SendAsync(request);
    var byteArray = await responseMessage.Content.ReadAsByteArrayAsync();
    var fileToWriteTo = System.IO.Path.GetDirectoryName(Application.ExecutablePath) + "\Temp\Test.txt";

    using (var fileStream = new FileStream(fileToWriteTo, FileMode.Create, FileAccess.Write, FileShare.None))
    {
        //copy the content from response to filestream
        fileStream.Write(byteArray, 0, byteArray.Length);
    }
}