ASP.NET MVC: FileStreamResult возвращает слишком много байтов? - PullRequest
3 голосов
/ 11 марта 2011

Я вызываю метод контроллера MVC.Тип возвращаемого значения - FileStreamResult.В этом методе я создаю изображение в виде байтового массива.Я создаю MemoryStream, передавая байтовый массив в конструкторе.Затем я возвращаю новый объект FileStreamResult с объектом потока памяти и «image / png» в конструкторе, поскольку мое изображение является PNG.

public FileStreamResult GetImage()
    {
        ImageModel im = new ImageModel();
        var image = im.GetImageInByteArray();
        var stream = new MemoryStream(image);
        return new FileStreamResult(stream, "image/png");
    }

Теперь, когда я получаю поток запроса из этоговызов, я просто использую следующий метод для преобразования строки потока в байтовый массив для просмотра изображения.Однако после того, как все это сделано, я получаю на 100+ больше позиций в моем байтовом массиве, чем когда я возвращаюсь из вызова метода контроллера MVC.

public static byte[] ConvertStringToBytes(string input)
    {
           MemoryStream stream = new MemoryStream();

           using (StreamWriter writer = new StreamWriter(stream))
           {
             writer.Write(input);
             writer.Flush();
           }

         return stream.ToArray();
   }

Например, после «GetImageInByteArray ()»вызов, у меня есть "байт [256]".Но когда он возвращается из этого вызова MVC, и я преобразовываю строку ответа, пропуская ее через второй метод, я получаю «byte [398]»;

РЕДАКТИРОВАТЬ ВОПРОС Есть ли какая-то разница между веб-запросом, который я делаю к методу контроллера GetImage (), и тем, что я предполагаю, что получаю?

Я предполагаю, что я получаю от этого вызовапоток памяти байтового массива изображения.Вот почему я просто конвертирую это обратно в байтовый массив.

Мое предположение здесь неверно?

Ответы [ 3 ]

2 голосов
/ 12 марта 2011

Когда действие MVC возвращает результат, оно проходит через конвейер ASP.NET, который привязывается к заголовкам HTTP, чтобы запросчик (браузер) мог понять, что делать с ответом.

Для изображения:Эти заголовки могут включать:

Response Code
Content-Length
Content-Type

Или любое другое количество пользовательских или типовых заголовков HTTP ( Еще несколько заголовков HTTP ).

Если я правильно понимаю ваш вопрос,вы конвертируете весь ответ от вашего действия в байты, поэтому, естественно, вы также будете конвертировать заголовки и все остальное, что может вернуть запрос (куки?).

Что вы пытаетесь выполнить с помощью десериализациизапроса?Вы пытаетесь что-то проверить?

0 голосов
/ 11 марта 2011

Я очень ценю вашу помощь, Давид, но я решил просто пойти другим путем. Я создал объект переноса, чтобы просто хранить байтовый массив как свойство. Я сериализирую это, затем передаю объект, десериализую на противоположном конце, и у меня есть мой байтовый массив, каким он был.

Я все еще не понимаю, что именно HTTP-запрос прикрепляет к потоку передаваемой памяти, но я просто пошел другим путем.

0 голосов
/ 11 марта 2011

Как закодирована ваша строка?На мой взгляд, это проблема с кодировкой.

Попробуйте это как код вашего метода:

return (new System.Text.UTF8Encoding()).GetBytes(input);

Привет

...