WebServiceHostFactory를 사용하여 호스팅되는 WCF REST 서비스에 DataContractSurrogate를 사용하려면 어떻게해야합니까?WCF REST와 함께 DataContractSurrogate 사용
하나 추가하는 방법이 보이지 않으며 사용자 지정 IOperationBehavior를 추가하더라도 WebServiceHost는 자동으로이를 덮어 쓰고 무시합니다.
WebServiceHostFactory를 사용하여 호스팅되는 WCF REST 서비스에 DataContractSurrogate를 사용하려면 어떻게해야합니까?WCF REST와 함께 DataContractSurrogate 사용
하나 추가하는 방법이 보이지 않으며 사용자 지정 IOperationBehavior를 추가하더라도 WebServiceHost는 자동으로이를 덮어 쓰고 무시합니다.
다음과 같은 두 단계로이를 달성 할 수
이첫째, 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
을 지정하는 경우에는 대리모를 설정할 수있는 기회가 없습니다.
사용자 정의 서비스 동작 속성을 만들고 그 ApplyDispatchBehavior()
방법의 대리를 설정 : 그것을 극복하기 위해, 두 가지 옵션이 있습니다. 이 특성을 서비스에 배치하면 WCF가이 메서드를 자동으로 실행하고 대리자가 설정됩니다.
CreateWebServiceHost
의 하위 클래스로 사용자 지정 서비스 호스트. 그런 다음 대리모를 ApplyConfiguration()
메소드로 설정하십시오. 이것도 똑같은 효과가 있습니다.
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
희망이 도움이됩니다.
WebServiceHost가 적용된 경우 사용자 지정 DataContractSerializerOperationBehavior를 수신하지 않습니다. 그것을 무시하고 덮어 씁니다. – Jeff
이상합니다. 위에서 설명한 방법은 제 경우에 완벽하게 작동합니다. 주인이 열리기 전에 당신이 대리인을 세우고 있다고 제프가 확신합니까? –
흠, 확실히 다시 시도하겠습니다 ...하지만 이건 알려진 문제라고 생각합니다 ... 고마워. – Jeff