#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. Вы должны записать это как ответ и принять его, чтобы люди могли увидеть и избежать простой ошибки.