Decoding messages in WCF Data Services
Recently I had to solve an interesting problem while working with WCF Data Services and how to decode an incoming WCF message so I can do something useful with its content.
Let’s say that you have an already configured Data Service and you intercept the message using some sort extension/interceptors in WCF.
Here is an example of such function:
|
private
static
string
DecodeMessage(ref
Message
message)
{
if
(message.IsEmpty)
return
null;
using (MessageBuffer
buffer = message.CreateBufferedCopy(Int32.MaxValue))
{
Message
copy = buffer.CreateMessage();
using (MemoryStream
ms = new
MemoryStream())
{
copy.Properties.Encoder.WriteMessage(copy,
ms);
ms.Flush();
message = buffer.CreateMessage();
return
Encoding.UTF8.GetString(ms.ToArray());
}
}
} |
As you can notice, after some basic message validation, we create a copy of the message to avoid changing the state of the original message which is typically passed by reference. Then we write all the content to MemoryStream which is handy for read/write operations.
The key here is to use the encoder specified in the
message properties which may be
MTOM
for this kind of streamed message but it might be
different according to the configured binding. After
writing all the message content to memory, we may read
from memory and create a string so we can easily inspect
the actual message. If we know that we will always deal
with XML content, we can use an
XmlReader
or the like to manipulate the content without the string
conversion which may pay a performance penalty on large
messages.
In the above code, we return the content as string
because we may get an XML or Text formatted message so we
can process accordingly.
In the next post I will show how we can use this code for
inspecting a message to perform a custom authorization
with
ServiceAuthorizationManager.
Stay tuned!