无论内容类型如何,如何强制 WCF Rest 客户端使用 Json 反序列化器?
我正在通过 WCF 调用基于 REST 的 Web 服务。
该服务返回 JSON 正文,但具有内容类型“Application/xml”。WCF 框架现在给了我 XmlException。
public class MessageFormatter : IClientMessageFormatter
{
private readonly IClientMessageFormatter _formatter;
public MessageFormatter(IClientMessageFormatter formatter)
{
_formatter = formatter;
}
public object DeserializeReply(System.ServiceModel.Channels.Message message, object[] parameters)
{
return _formatter.DeserializeReply(message, parameters);
}
}
_formatter.DeserializeReply 正在抛出 XmlException。我在任何地方都找不到任何示例来强制对回复进行 json 反序列化。
编辑-鼠标悬停时的“消息”对象抛出“{...错误读取正文:System.Xml.XmlException:根级别的数据无效。第1行,位置1....}”
我的另一个项目中与不同的 REST 服务(Picasa Web 服务)通信的同一个对象有一个看起来像 JSON 对象的 xml 序列化版本的东西?所以这个问题似乎更进一步。我需要找到这个对象的来源。我会玩 MessageEncoder 类。
编辑 - (添加更多信息)
public class MyBinding : WebHttpBinding
{
public MyBinding(WebHttpSecurityMode mode)
: base(mode)
{
}
public override BindingElementCollection CreateBindingElements()
{
var result = base.CreateBindingElements();
var replacements = result.OfType<MessageEncodingBindingElement>().ToList();
foreach (var messageEncodingBindingElement in replacements)
{
var index = result.IndexOf(messageEncodingBindingElement);
result.Remove(messageEncodingBindingElement);
result.Insert(index, new MyMessageEncodingBindingElement(messageEncodingBindingElement));
}
return result;
}
}
public class MyMessageEncodingBindingElement : MessageEncodingBindingElement
{
private readonly MessageEncodingBindingElement _element;
public MyMessageEncodingBindingElement(MessageEncodingBindingElement element)
{
_element = element;
}
public override BindingElement Clone()
{
var result = _element.Clone();
if (result is MessageEncodingBindingElement)
return new MyMessageEncodingBindingElement(result as MessageEncodingBindingElement);
return result;
}
public override MessageEncoderFactory CreateMessageEncoderFactory()
{
return new MyMessageEncoderFactory(_element.CreateMessageEncoderFactory());
}
}
即使在设置断点时命中构造函数和 Clone 方法,也永远不会调用 CreateMessageEncoderFactory() 方法。有什么帮助吗?我正在尝试设置自定义 MessageEncoder 和 MessageEncoderFactory 类来修改 Message 对象的实例化过程。