C # — Как прочитать поток в службе WCF

#c# #wcf #stream

#c# #wcf #поток

Вопрос:

У меня есть служба WCF, куда я хотел бы отправить файл журнала и обработать его на сервере. Контракт заключается:

 [OperationContract]
void LogFile(Stream file);
  

И я использую StreamedRequest в конечной точке.

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

Когда я отлаживаю вызов, я вижу, что Поток является экземпляром:

 System.ServiceModel.Dispatcher.StreamFormatter.MessageBodyStream
  

От клиента я отправляю MemoryStream.

Итак… Как я могу прочитать поток?

Спасибо.

Правка 1: я использую:

         Stream serviceStream = new MemoryStream();
        byte[] buffer = new byte[10000];
        int bytesRead = 0;
        do
        {
            bytesRead = file.Read(buffer, 0, buffer.Length);
            serviceStream.Write(buffer, 0, bytesRead);
        } while (bytesRead > 0);
        serviceStream.Position = 0;
  

для чтения потока ничего не выводится, всегда 0

Ответ №1:

Моя ошибка, в клиенте я забыл установить позицию потока равной 0, поэтому служба получала поток с позицией в конце его

Комментарии:

1. Спасите мой день! Я бы никогда не подумал об этом!

Ответ №2:

Не беспокойтесь о внутреннем типе предоставленного вам потока. Просто прочитайте поток, как обычно (например, с помощью StreamReader), и все должно быть в порядке. Обратите внимание, что вам не нужно вызывать Dispose or Close в потоке с любой стороны, WCF справится с этим.

Комментарии:

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

2. Моя ошибка, в клиенте я забыл установить позицию потока равной 0, поэтому служба получала поток с позицией в конце его

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