在为WCF REST服务的自定义(反)序列化实现IDispatchMessageFormatter时,如何读取消息对象的主体?

在为WCF REST服务的自定义(反)序列化实现IDispatchMessageFormatter时,如何读取消息对象的主体?,wcf,json,serialization,wcf-binding,Wcf,Json,Serialization,Wcf Binding,我正在扩展以公开具有自定义序列化和反序列化(加上与问题无关的某些其他特性)的WCF REST服务 新的行为使用的实现来执行由服务提供并通过和方法发送给它的POCO的自定义序列化和反序列化 我可以按照我在SerializeReply中所需的方式提供XML和JSON 我可以毫无问题地反序列化XML,但是我似乎找不到反序列化JSON消息的方法,因为我无法获取参数DeserializeRequest中包含的纯文本 这就是反序列化请求中的代码现在的样子: if (format == System.Serv

我正在扩展以公开具有自定义序列化和反序列化(加上与问题无关的某些其他特性)的WCF REST服务

新的行为使用的实现来执行由服务提供并通过和方法发送给它的POCO的自定义序列化和反序列化

我可以按照我在
SerializeReply
中所需的方式提供XML和JSON

我可以毫无问题地反序列化XML,但是我似乎找不到反序列化JSON消息的方法,因为我无法获取参数
DeserializeRequest
中包含的纯文本

这就是
反序列化请求
中的代码现在的样子:

if (format == System.ServiceModel.Web.WebMessageFormat.Json)
{
    var data = ""; // TODO obtain plain text from Message object

    var json = JsonConvert.DeserializeObject(data, paramType, new IsoDateTimeConverter(), new StringEnumConverter());

    parameters[paramIndex] = json;
}
else
{
    var serializer = new System.Xml.Serialization.XmlSerializer(paramType, string.Empty);

    var reader = message.GetReaderAtBodyContents();

    parameters[paramIndex] = serializer.Deserialize(reader);
}
我使用的是JSON(反)序列化

对于如何从
消息
对象中获取纯文本以便对其进行反序列化,如有任何建议,将不胜感激


如果您认为我的方法有问题,我也希望在评论中听到。

您需要确保消息的
WebMessageFormat
设置为Raw,否则,WCF将使用
JsonMessageEncoder
创建
消息
,而这又不允许您访问原始消息内容

您可以通过实现一个自定义的
WebContentTypeMapper

public class RawMapper : WebContentTypeMapper
{
    public override WebContentFormat GetMessageFormatForContentType(string contentType)
    {
        return WebContentFormat.Raw;
    }
}
…需要将其应用于WebHttpBinding:

webHttpBinding.ContentTypeMapper = new RawMapper();
..或通过配置:

<bindings>
  <webHttpBinding>
    <binding contentTypeMapper="Samples.RawMapper, MyContentTypeMapperAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
  </webHttpBinding>
</bindings>

即使您使用的是WebMessageFormat.Json,您也可以将消息转换为字符串,然后将其反序列化为DeserializeRequest方法中的对象

MemoryStream mss=新的MemoryStream();
XmlDictionaryWriter-writer=JsonReaderWriterFactory.CreateJsonWriter(mss);
message.WriteMessage(编写器);
writer.Flush();
string messageBody=Encoding.UTF8.GetString(mss.ToArray());
var obj=JsonConvert.DeserializeObject(messageBody,operation.Messages[0].Body.Parts[0].Type);
参数[0]=obj;
    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;
    }