2016-02-23 5 views
-2

Я пытаюсь отправить файлы в запрос, записав их в объект ответа. У меня в настоящее время есть два пути. Первый способ (с использованием FileStream) работает, а второй способ (с использованием MemoryStream) терпит неудачу. Я хотел бы знать, почему второй путь терпит неудачу, так как я не хочу постоянно создавать филе. Ниже приведен кодFileStream работает и MemoryStream не удается при отправке файлов

//This method does not work 
    MemoryStream ms = MethodA(bundleStream); 
    ms.CopyTo(Context.Response.Body); //<---Copy memory stream to response (Fails - object at other end is empty) 

Другой способ работы. В этом методе я в основном пишу в файл, а затем открыть этот написанный файл и скопировать в 'Context.Response.Body'

//This method works. 
MemoryStream ms = MethodB(bundleStream,"C:\\Mytestfile.exe"); //Wrtie to Mytestfile.exe 
ftest = new FileStream("C:\\Mytestfile.exe", FileMode.Open); //Now open the same file that was written 
ftest.CopyTo(Context.Response.Body); <---Copy file stream to response (Works) 
ftest.Close(); 

Я хотел бы знать, почему первый метод не удается. По-видимому, когда я читаю входящий ответ, он пуст, а я могу легко прочитать ответ, когда используется второй метод.

+0

Вы должны написать «Response.OutputStream», а не тело. – Igor

+1

Просьба указать [MCVE] (потому что проблема, скорее всего, в 'MethodA', которая возвращает нечитаемый/пустой поток). Также базовый поиск https://www.bing.com/search?q=c%23%20memorystream%20empty обеспечивает немедленный ответ http://stackoverflow.com/questions/6130469/memory-stream-is-empty - так что вы можете уточните, что вы попробовали, прежде чем задавать вопрос. –

+0

@AlexeiLevenkov, если вы заметили, что ответ не имеет никакого отношения к методу или методу B. Это связано с поиском. Заметный ответ указывает на это. Причина, по которой я удалил метод A и methodB, заключалась в том, чтобы сделать этот вопрос коротким и кратким. Недостаток недопустим. – Rajeshwar

ответ

3

Перед копированием в поток запросов вам необходимо сбросить положение потока памяти.

ms.Seek(0, SeekOrigin.Begin); 
+0

Да, это сделал трюк. Спасибо – Rajeshwar

+1

Отмечено как ответ – Rajeshwar

2

Вы должны использовать OutputStream, а не тело при записи двоичных данных из потока. Я думаю, что Body - поток вывода, хотя я не могу найти что-либо относительно свойства Body здесь HttpWebResponse, я действительно изменил код на основе того, что у вас было в вашем примере.

Здесь вы можете быстро заменить первую часть кода. Также вы должны распоряжаться потоками, когда закончите с ними.

using(MemoryStream ms = MethodA(bundleStream)) // dispose of ms after you are done with it 
{ 
    ms.Position = 0; // reset position 
    ms.CopyTo(Context.Response.Body); // write to output stream (assuming .Body is a Stream) 
    Context.Response.Body.Flush(); // flush response obj 
} 
Context.Response.End(); // end the response 
+0

Голосование за ответ, потому что он более полный. – andyroschy

 Смежные вопросы

  • Нет связанных вопросов^_^