Это можно сделать с помощью следующих двух шагов:
Во-первых, реализовать интерфейс 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 и указываете WebServiceHostFactory
в файле .svc
, то вполне понятно, что у вас нет возможности установить суррогат.Чтобы преодолеть это, у вас есть две опции:
Создать атрибут поведения пользовательской службы и установить суррогат в его методе ApplyDispatchBehavior()
.Как только вы разместите этот атрибут в своем сервисе, WCF автоматически выполнит этот метод, и будет установлен суррогат.
Создайте свой собственный хост настраиваемой службы с помощью подкласса WebServiceHost
.Затем установите суррогат в методе ApplyConfiguration()
.Это тоже будет иметь тот же эффект.