コンテンツタイプに関係なく、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オブジェクトのインスタンス化プロセスを変更しようとしています。