首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在为WCF REST服务的自定义(反)序列化实现IDispatchMessageFormatter时,如何读取消息对象的正文?

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

Stack Overflow用户
提问于 2011-05-11 01:07:42
回答 2查看 6.8K关注 0票数 2

我正在扩展WebHttpBehavior,以使用定制的序列化和反序列化(外加一定数量的与问题无关的其他特性)来公开WCF REST服务。

由于SerializeReplyDeserializeRequest方法,新的行为使用IDispatchMessageFormatter的实现来执行由服务提供并发送给它的POCOs的自定义序列化和反序列化。

我可以在SerializeReply中完全按照我需要的方式提供XML和JSON。

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

下面是DeserializeRequest中的代码现在的样子:

代码语言:javascript
复制
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.NET进行JSON (反)序列化。

任何关于如何从Message对象获取纯文本以便对其进行反序列化的建议都将不胜感激。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-11 03:05:04

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

您可以通过实现自定义WebContentTypeMapper来完成此操作

代码语言:javascript
复制
public class RawMapper : WebContentTypeMapper
{
    public override WebContentFormat GetMessageFormatForContentType(string contentType)
    {
        return WebContentFormat.Raw;
    }
}

需要对WebHttpBinding应用...which:

代码语言:javascript
复制
webHttpBinding.ContentTypeMapper = new RawMapper();

通过配置实现的..or:

代码语言:javascript
复制
<bindings>
  <webHttpBinding>
    <binding contentTypeMapper="Samples.RawMapper, MyContentTypeMapperAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
  </webHttpBinding>
</bindings>

准备就绪后,您就可以像这样检索请求正文:

代码语言:javascript
复制
    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;
    }
票数 13
EN

Stack Overflow用户

发布于 2014-08-15 09:59:22

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

代码语言:javascript
复制
MemoryStream mss = new MemoryStream();
XmlDictionaryWriter writer = JsonReaderWriterFactory.CreateJsonWriter(mss);
message.WriteMessage(writer);
writer.Flush();
string messageBody = Encoding.UTF8.GetString(mss.ToArray());

var obj = JsonConvert.DeserializeObject(messageBody, operation.Messages[0].Body.Parts[0].Type);

parameters[0] = obj;
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5953711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档