2009-07-23 13 views
0

両方のメソッド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; 
     } 
    } 
+0

詳細と文脈を追加してください。 –

+0

問題は、WCF RESTサービス(Webベースのサービス)はカスタムが異なる形式(非XMLテキスト形式)でシリアル化する必要があることです。そして、DataContractSerializerOperationBehaviorはWCF RESTサービスでは機能していませんが、SOAPに対してのみ機能していると私は結論しました。それは正しい結論ですか? 代わりにWebHttpBehaviorを使用する必要があることがわかりました。 –

答えて

6

これは、System.ServiceModel.Webの世界では完全に無視されています。 ReflectorのDataContractSerializerOperationBehaviorをチェックアウトします。 "System.ServiceModel.Dispatcher.DataContractJsonSerializerOperationBehavior"が表示されます。その上でAnalyze(Used By)を実行すると、恐怖が表示されます。DataContractJsonSerializerOperationFormatterは、DataContractJsonSerializerOperationBehavior自体をインスタンス化しています。だから...あなたが追加するものは何もしません。

実際には、動作フォーマッタとそれ以外のものはすべて内部的なものであるということは嫌です。 WCFは非常に拡張性がありますが、System.ServiceModel.Webを構築した人は拡張性を嫌うようです。少なくとも1週間に1回、密閉式/内部のロードブロッキングを実行します。私のSOAPカスタマイズのほとんどはJSONの世界では機能しません。

+0

Microsoft .NETチームにその問題を報告しましたか? –

関連する問題