Как получить содержимое байтового массива - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь написать сервис webapi, который будет возвращать содержимое файла. В вызывающей службе я не могу получить фактическое содержимое файла, только заголовок содержимого (в ByteArrayContent)

Я попытался прочитать файл и создать соответствующее ответное сообщение. Когда вызывающая служба получает ответ http и делает ReadAsByteArrayAsync(), единственные данные, которые я получаю, - это, по сути, заголовок ответа http.

    [HttpGet]
    [Route("{type}")]
    public async Task<HttpResponseMessage> GetFile(string type, string fileName)
    {
        try
        {
            var filePath = @"...\" + fileName;

            var stream = new MemoryStream();
            var fileStream = System.IO.File.OpenRead(filePath);
            stream.SetLength(fileStream.Length);
            await fileStream.ReadAsync(stream.GetBuffer(), 0, (int)fileStream.Length);
            stream.Position = 0;

            var response = new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new ByteArrayContent(stream.ToArray())
            };
            response.Content.Headers.ContentLength = stream.Length;
            response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
            {
                FileName = fileName
            };
            response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");

            return response;
        }
        catch (KeyNotFoundException)
        {
            return new HttpResponseMessage(HttpStatusCode.NoContent);
        }
    }

Это выглядит правильно, когда я проверяю ответ перед отправкой:

{StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.ByteArrayContent, Headers:{ Content-Length: 222772 Content-Disposition: attachment; filename=blablablah.JPG Content-Type: application/octet-stream}}

Когда я смотрю на сервисную сторону, которая называется webapi

var httpResponse = await httpClient.GetAsync(builder.ToString());
var image = await httpResponse.Content.ReadAsByteArrayAsync();

if (image != null && image.Length > 0)
{
    var x = Encoding.Default.GetString(image);

    return result;
}

httpResponse:

{StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:{ Transfer-Encoding: chunked X-SourceFiles: =?UTF-8?B?QzpcUHJvamVjdHNcRmlsZVN0cmVhbUFwaVxGaWxlU3RyZWFtQXBpXGFwaVxGaWxlXGV4cGVuc2VyZWNlaXB0?= Date: Fri, 11 Jan 2019 19:39:54 GMT Server: Kestrel X-Powered-By: ASP.NET Content-Type: application/json; charset=utf-8}}

и фактическое содержимое (из ReadAsByteArrayAsync ()) равно

"{\"version\":{\"major\":1,\"minor\":1,\"build\":-1,\"revision\":-1,\"majorRevision\":-1,\"minorRevision\":-1},\"content\":{\"headers\":[{\"key\":\"Content-Length\",\"value\":[\"222772\"]},{\"key\":\"Content-Disposition\",\"value\":[\"attachment; filename=47670af0-1916-4257-bbc2-b5f7da4c4839.JPG\"]},{\"key\":\"Content-Type\",\"value\":[\"application/octet-stream\"]}]},\"statusCode\":200,\"reasonPhrase\":\"OK\",\"headers\":[],\"requestMessage\":null,\"isSuccessStatusCode\":true}"

...