Необходимо убедиться, что WebMessageFormat
сообщения установлено на Raw , в противном случае WCF будет использовать JsonMessageEncoder
для создания Message
, что, в свою очередь, не будет позволяют вам перейти к необработанному содержанию сообщения.
Вы делаете это путем реализации пользовательского WebContentTypeMapper
:
public class RawMapper : WebContentTypeMapper
{
public override WebContentFormat GetMessageFormatForContentType(string contentType)
{
return WebContentFormat.Raw;
}
}
... который необходимо применить к привязке WebHttp:
webHttpBinding.ContentTypeMapper = new RawMapper();
.. или через конфигурацию:
<bindings>
<webHttpBinding>
<binding contentTypeMapper="Samples.RawMapper, MyContentTypeMapperAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</webHttpBinding>
</bindings>
После этого вы можете получить тело запроса в виде строки:
public void DeserializeRequest(Message message, object[] parameters)
{
var bodyReader = message.GetReaderAtBodyContents();
bodyReader.ReadStartElement("Binary");
byte[] rawBody = bodyReader.ReadContentAsBase64();
string messageAsString;
using (var reader = new StreamReader(new MemoryStream(rawBody)))
messageAsString = reader.ReadToEnd();
object jsonObj = JsonConvert.DeserializeObject(messageAsString);
parameters[0] = jsonObj;
}