如何爲我的WCF REST服務(使用WebServiceHostFactory託管)使用DataContractSurrogate?在WCF REST中使用DataContractSurrogate
我沒有看到添加一個的方法,即使添加了自定義IOperationBehavior,WebServiceHost也會自動覆蓋並忽略它。
如何爲我的WCF REST服務(使用WebServiceHostFactory託管)使用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將自動執行這個方法,並且代理將被設置。
Create您自己定製的服務主機通過繼承WebServiceHost
。然後在其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 2011-07-31 06:20:42