Потоки часто могут быть прочитаны только один раз, поэтому, если вы прочитаете поток, он, вероятно, будет использован, и вам нужно будет его воссоздать.Одним из возможных мест, где вы могли бы это сделать, является пользовательский кодировщик сообщений, который оборачивает оригинальный кодировщик привязки.
Существует два метода WriteMessage
, которые необходимо реализовать.В буферизованном случае просто делегируйте вызов упакованному кодировщику, и вы получите содержимое сообщения.В случае потоковой передачи вы записываете сообщение, передающее поток памяти в упакованный кодировщик, проверяете содержимое, а затем записываете содержимое потока в поток, переданный в качестве параметра.
public override ArraySegment<byte> WriteMessage(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset)
{
ArraySegment<byte> result = this.wrappedEncoder.WriteMessage(message, maxMessageSize, bufferManager, messageOffset);
// message contents on the array segment.
return result;
}
public override void WriteMessage(Message message, Stream stream)
{
MemoryStream ms = new MemoryStream();
this.wrappedEncoder.WriteMessage(message, ms);
// message contents in the memory stream
ms.Position = 0;
ms.CopyTo(stream);
}