2009-07-23 11 views
0

Les deux méthodes MyBehavior :: CreateSerializer() ne sont pas appelées pour une raison quelconque, mais la méthode ReplaceBehavior() fonctionne. Il change le comportement par défaut avec mon coutume.Quelle peut être la raison pour laquelle mon sérialiseur REST personnalisé ne fonctionne pas?

Est-ce que quelqu'un sait où pourrait être le problème?

Le point est d'écrire un sérialiseur REST WCF personnalisé qui devrait générer un résultat de format de texte non-XML.

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

Veuillez ajouter plus de détails et de contexte. –

+0

Le problème est que le service REST WCF (service basé sur le Web) doit être personnalisé en série dans un format différent (format de texte non XML). Et comme je l'ai conclu est que DataContractSerializerOperationBehavior ne fonctionne pas pour les services REST WCF, mais seulement pour SOAP. Est-ce la bonne conclusion? J'ai trouvé que WebHttpBehavior devrait être utilisé à la place. –

Répondre

6

Ceci est totalement ignoré dans le monde System.ServiceModel.Web. CheckControlSerializerOperationBehavior dans Reflector. Vous verrez "System.ServiceModel.Dispatcher.DataContractJsonSerializerOperationBehavior". Si vous exécutez Analyze (Used By) sur cela, vous verrez alors l'horreur: DataContractJsonSerializerOperationFormatter instancie DataContractJsonSerializerOperationBehavior lui-même. Donc ... rien que vous ajouterez ne fera quoi que ce soit.

Ce qui est vraiment nul, c'est que le formateur d'opération et tout le reste sont internes. WCF est extrêmement extensible, mais les gars qui ont construit System.ServiceModel.Web semblent détester l'extensibilité. Je rencontre un barrage routier interne/scellé au moins une fois par semaine. Presque aucune de mes personnalisations SOAP ne fonctionne dans le monde JSON.

+0

Avez-vous signalé ce problème à l'équipe Microsoft .NET? –

Questions connexes