2009-07-23 3 views
0

두 가지 메서드 MyBehavior :: CreateSerializer()는 어떤 이유로 호출되지 않지만 ReplaceBehavior() 메서드가 작동합니다. 그것은 내 사용자 지정 기본 동작을 변경합니다.사용자 정의 REST 직렬 기가 작동하지 않는 이유는 무엇입니까?

어디에서 문제가 될 수 있는지 알고 있습니까?

요점은 non-XML 텍스트 형식 결과를 생성해야하는 사용자 지정 REST WCF serializer를 작성하는 것입니다.

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 서비스 (웹 기반 서비스)가 다른 형식 (비 XML 텍스트 형식)으로 사용자 지정 serialize해야한다는 것입니다. 그리고 결론은 DataContractSerializerOperationBehavior가 WCF REST 서비스에서는 작동하지 않지만 SOAP에 대해서만 작동한다는 것입니다. 그게 정확한 결론일까요? 대신 WebHttpBehavior를 사용해야한다는 것을 알게되었습니다. –

답변

6

System.ServiceModel.Web 세계에서는 완전히 무시됩니다. 리플렉터에서 DataContractSerializerOperationBehavior를 체크 아웃합니다. "System.ServiceModel.Dispatcher.DataContractJsonSerializerOperationBehavior"가 표시됩니다. 그것에 대해 Analyze (Used By)를 실행하면 다음과 같은 공포가 나타납니다. DataContractJsonSerializerOperationFormatter가 DataContractJsonSerializerOperationBehavior 자체를 인스턴스화합니다. 그래서 ... 당신이 추가하는 것은 아무것도하지 않을 것입니다.

정말 기분이 좋지 않은 것은 작업 포맷터와 그 주변의 모든 것이 내부적이라는 것입니다. WCF는 매우 확장 성이 뛰어나지 만 System.ServiceModel.Web을 만든 사람은 확장 성을 싫어하는 것처럼 보입니다. 나는 최소한 일주일에 한 번 봉인/내부로드 블록을 만납니다. JSON 세계에서 SOAP 사용자 정의가 거의 작동하지 않습니다.

+0

Microsoft .NET 팀에 문제를 신고하셨습니까? –

관련 문제