mad*_*dd0 2 wcf serialization json wcf-binding
我正在扩展WebHttpBehavior以公开具有自定义序列化和反序列化的WCF REST服务(以及与该问题无关的一定数量的其他功能).
新行为使用实现IDispatchMessageFormatter来执行服务所服务的POCO的自定义序列化和反序列化,并通过SerializeReply和DeserializeRequest方法发送给它.
我可以完全按照我需要的方式提供XML和JSON SerializeReply.
我可以毫无问题地反序列化XML,但是我似乎无法找到反序列化JSON消息的方法,因为我无法获取Message参数中包含的纯文本DeserializeRequest.
这就是现在的代码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);
}
Run Code Online (Sandbox Code Playgroud)
关于如何从Message对象获取纯文本以便反序列化的任何建议将不胜感激.
如果您认为我的方法有问题,我也希望在评论中听到它.
mth*_*rba 13
您需要确保WebMessageFormat将Message的消息设置为Raw,否则WCF将使用它JsonMessageEncoder来创建,Message而这反过来将不允许您获取原始消息内容.
您可以通过实现自定义来实现WebContentTypeMapper:
public class RawMapper : WebContentTypeMapper
{
public override WebContentFormat GetMessageFormatForContentType(string contentType)
{
return WebContentFormat.Raw;
}
}
Run Code Online (Sandbox Code Playgroud)
...需要应用于WebHttpBinding:
webHttpBinding.ContentTypeMapper = new RawMapper();
Run Code Online (Sandbox Code Playgroud)
..或通过配置:
<bindings>
<webHttpBinding>
<binding contentTypeMapper="Samples.RawMapper, MyContentTypeMapperAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</webHttpBinding>
</bindings>
Run Code Online (Sandbox Code Playgroud)
有了这个,你就可以像下面那样检索请求体:
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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6319 次 |
| 最近记录: |