2011-01-20 47 views
1

如何爲我的WCF REST服務(使用WebServiceHostFactory託管)使用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. Create您自己定製的服務主機通過繼承WebServiceHost。然後在其ApplyConfiguration()方法中設置代理。這也會產生同樣的效果。

+0

如果應用了WebServiceHost,則不會偵聽自定義的DataContractSerializerOperationBehavior。它忽略並覆蓋它。 – Jeff 2011-07-31 06:20:42

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

希望這會有所幫助。