繁体   English   中英

在WCF REST中使用DataContractSurrogate

[英]Using a DataContractSurrogate with WCF REST

如何为WCF REST服务(使用WebServiceHostFactory托管)使用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 ,那么可以理解,您没有机会设置代理。 为了克服这个问题,您有两种选择:

  1. 创建一个自定义服务行为属性,并在其ApplyDispatchBehavior()方法中设置代理。 一旦将此属性放在您的服务上,WCF将自动执行此方法并设置代理。

  2. 通过子类化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页面,指向自定义属性

用于序列化NHibernate代理对象的DataContractSurrogate实现

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM