2009-07-23 38 views
0

两种方法MyBehavior :: CreateSerializer()都没有被调用,但是ReplaceBehavior()方法正在工作。它正在改变我的自定义行为的默认行为。什么可能是我的自定义REST序列化器不工作的原因?

做某人知道哪里可能是问题?

关键是编写自定义REST WCF序列化程序,该程序应该生成非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

请添加更多细节和上下文。 – 2009-07-29 15:14:06

+0

问题是WCF REST服务(基于Web的服务)应该以不同的格式(非XML文本格式)自定义序列化。正如我的结论是,DataContractSerializerOperationBehavior不适用于WCF REST服务,但仅适用于SOAP。那是正确的结论吗? 我发现应该使用WebHttpBehavior来代替。 – 2009-07-30 14:03:59

回答

6

这在System.ServiceModel.Web世界中完全被忽略了。在Reflector中签出DataContractSerializerOperationBehavior。你会看到“System.ServiceModel.Dispatcher.DataContractJsonSerializerOperationBehavior”。如果你运行Analyze(Used By),你会看到恐怖的情况:DataContractJsonSerializerOperationFormatter正在实例化DataContractJsonSerializerOperationBehavior本身。所以......你添加的东西都不会做任何事情。

真正糟糕的是操作格式化程序及其周围的一切都是内部的。 WCF是非常可扩展的,但构建System.ServiceModel.Web的帅哥似乎讨厌扩展性。我每周至少遇到一次密封/内部障碍。几乎没有我的SOAP自定义在JSON世界中工作。

相关问题