2011-01-20 6 views
1

WebServiceHostFactory를 사용하여 호스팅되는 WCF REST 서비스에 DataContractSurrogate를 사용하려면 어떻게해야합니까?WCF REST와 함께 DataContractSurrogate 사용

하나 추가하는 방법이 보이지 않으며 사용자 지정 IOperationBehavior를 추가하더라도 WebServiceHost는 자동으로이를 덮어 쓰고 무시합니다.

답변

5

다음과 같은 두 단계로이를 달성 할 수

첫째, IDatacontractSurrogate 인터페이스 구현 :

class MySurrogate : IDataContractSurrogate 
{ 

    public Type GetDataContractType(Type type) 
    { 
     //Implementation here 
    } 

    public object GetObjectToSerialize(object obj, Type targetType) 
    { 
     //Implementation here 
    } 

    //Implemenentation of the remaining methods... 
} 

둘째,이 같은 ServiceHost를 당신의 대리를 설정 :

foreach (var endpoint in serviceHost.Description.Endpoints) 
{ 
    foreach (var operation in endpoint.Contract.Operations) 
    { 
     operation.Behaviors.Find<DataContractSerializerOperationBehavior>().DataContractSurrogate = new MySurrogate(); 
    } 
} 

기억 서비스 호스트를 열기 전에이 작업을 수행하십시오. 그렇지 않으면 작동하지 않을 수 있습니다.

IIS 호스팅을 사용하고 .svc 파일에 WebServiceHostFactory을 지정하는 경우에는 대리모를 설정할 수있는 기회가 없습니다.

  1. 사용자 정의 서비스 동작 속성을 만들고 그 ApplyDispatchBehavior() 방법의 대리를 설정 : 그것을 극복하기 위해, 두 가지 옵션이 있습니다. 이 특성을 서비스에 배치하면 WCF가이 메서드를 자동으로 실행하고 대리자가 설정됩니다.

  2. CreateWebServiceHost의 하위 클래스로 사용자 지정 서비스 호스트. 그런 다음 대리모를 ApplyConfiguration() 메소드로 설정하십시오. 이것도 똑같은 효과가 있습니다.

+0

WebServiceHost가 적용된 경우 사용자 지정 DataContractSerializerOperationBehavior를 수신하지 않습니다. 그것을 무시하고 덮어 씁니다. – Jeff

+0

이상합니다. 위에서 설명한 방법은 제 경우에 완벽하게 작동합니다. 주인이 열리기 전에 당신이 대리인을 세우고 있다고 제프가 확신합니까? –

+0

흠, 확실히 다시 시도하겠습니다 ...하지만 이건 알려진 문제라고 생각합니다 ... 고마워. – Jeff

3

IIS에서 WebServiceHostFactory를 사용하여 호스팅되는 WCF 4.0 REST 서비스.

나는 정의 내 NHProxyDataContractSurrogate 주입하는 속성 사용 :

public class CanSerializeNHProxyAttribute : Attribute, IContractBehavior 
{ 
    public void ApplyClientBehavior(ContractDescription description, ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime proxy) 
    { 
     foreach (OperationDescription opDesc in description.Operations) 
     { 
      ApplyDataContractSurrogate(opDesc); 
     } 
    } 

    public void ApplyDispatchBehavior(ContractDescription description, ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.DispatchRuntime dispatch) 
    { 
     foreach (OperationDescription opDesc in description.Operations) 
     { 
      ApplyDataContractSurrogate(opDesc); 
     } 
    } 

    private static void ApplyDataContractSurrogate(OperationDescription description) 
    { 
     DataContractSerializerOperationBehavior dcsOperationBehavior = description.Behaviors.Find<DataContractSerializerOperationBehavior>(); 
     if (dcsOperationBehavior != null) 
     { 
      if (dcsOperationBehavior.DataContractSurrogate == null) 
       dcsOperationBehavior.DataContractSurrogate = new NHProxyDataContractSurrogate(); 
     } 
    } 

    public void AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint serviceEndPoint, BindingParameterCollection parameters) { } 

    public void Validate(ContractDescription contractDescription, ServiceEndpoint serviceEndPoint) { } 
} 

을 그리고 내의 ServiceContract에 사용자 지정 특성을 적용 :

: 나는 이러한 링크에서 유용한 정보를 많이 가지고
[ServiceContract] 
[CanSerializeNHProxy] 
public interface IElementManager 
{ ... } 

DataContractSurrogate MSDN page, pointing to custom attribute

DataContractSurrogate implementation for serializing NHibernate proxy objects

희망이 도움이됩니다.