将DataContractSurrogate与WCF REST一起使用

Jef*_*eff 1 .net wcf datacontract datacontractserializer

如何将DataContractSurrogate用于我的WCF REST服务(使用WebServiceHostFactory托管)?

我没有看到添加一个的方式,即使我添加自定义IOperationBehavior,该WebServiceHost自动覆盖并忽略它.

Fre*_*ool 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...
}
Run Code Online (Sandbox Code Playgroud)

其次,在ServiceHost上设置代理,如下所示:

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

请务必在打开服务主机之前执行此操作.否则它可能无法正常工作.

如果您正在使用IIS主机并WebServiceHostFactory.svc文件中指定,那么可以理解的是,您没有机会设置代理.要克服这个问题,您有两种选择:

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

  2. 通过子类化创建自己的自定义服务主机WebServiceHost.然后在其ApplyConfiguration()方法中设置代理.这也会产生同样的效果.