両方のメソッドMyBehavior :: CreateSerializer()は何らかの理由で呼び出されませんが、ReplaceBehavior()メソッドが機能しています。それは私のカスタムとのデフォルトの動作を変更しています。カスタムRESTシリアライザが機能しない理由は何ですか?
どこに問題があるのか誰かが知っていますか?
ポイントは、非XMLテキスト形式の結果を生成するカスタムREST WCFシリアライザを書くことです。
public class MySerializerFormatAttribute : Attribute, IOperationBehavior
{
public void AddBindingParameters(OperationDescription description, BindingParameterCollection parameters)
{
}
public void Validate(OperationDescription description)
{
}
private static void ReplaceBehavior(OperationDescription description)
{
DataContractSerializerOperationBehavior dcsOperationBehavior = description.Behaviors.Find<DataContractSerializerOperationBehavior>();
if (dcsOperationBehavior != null)
{
int idx = description.Behaviors.IndexOf(dcsOperationBehavior);
description.Behaviors.Remove(dcsOperationBehavior);
description.Behaviors.Insert(idx, new MyBehavior(description));
}
}
public void ApplyClientBehavior(OperationDescription description, ClientOperation proxy)
{
ReplaceBehavior(description);
}
public void ApplyDispatchBehavior(OperationDescription description, DispatchOperation dispatch)
{
ReplaceBehavior(description);
}
};
public class MySerializer : XmlObjectSerializer
{
public override bool IsStartObject(XmlDictionaryReader reader)
{
throw new NotImplementedException();
}
public override object ReadObject(XmlDictionaryReader reader, bool verifyObjectName)
{
throw new NotImplementedException();
}
public override void WriteEndObject(XmlDictionaryWriter writer)
{
throw new NotImplementedException();
}
public override void WriteObjectContent(XmlDictionaryWriter writer, object graph)
{
throw new NotImplementedException();
}
public override void WriteStartObject(XmlDictionaryWriter writer, object graph)
{
throw new NotImplementedException();
}
}
// Custom Web service behaviour that passes custom serializer
public class MyBehavior : DataContractSerializerOperationBehavior
{
private static MySerializer serializer = new MySerializer();
public MyBehavior(OperationDescription operationDescription) : base(operationDescription)
{
}
public override XmlObjectSerializer CreateSerializer(Type type, string name, string ns, IList<Type> knownTypes)
{
return MyBehavior.serializer;
}
public override XmlObjectSerializer CreateSerializer(Type type, XmlDictionaryString name, XmlDictionaryString ns, IList<Type> knownTypes)
{
return MyBehavior.serializer;
}
}
詳細と文脈を追加してください。 –
問題は、WCF RESTサービス(Webベースのサービス)はカスタムが異なる形式(非XMLテキスト形式)でシリアル化する必要があることです。そして、DataContractSerializerOperationBehaviorはWCF RESTサービスでは機能していませんが、SOAPに対してのみ機能していると私は結論しました。それは正しい結論ですか? 代わりにWebHttpBehaviorを使用する必要があることがわかりました。 –