Вы можете добиться этого с помощью следующих двух шагов:
Во-первых, реализовать интерфейс 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 автоматически выполнит этот метод, и суррогат будет установлен.
Create ваш собственный хостинг по подклассам WebServiceHost
. Затем установите суррогат в свой метод ApplyConfiguration()
. Это тоже будет иметь тот же эффект.
WebServiceHost не прислушивается к пользовательскому DataContractSerializerOperationBehavior, если вы его применяете. Он игнорирует и перезаписывает его. – Jeff
Это странно. То, как я описывал выше, отлично работает в моем случае. Вы уверены, что Джефф, что вы устанавливаете суррогат перед тем, как хозяин открывается? –
Хммм, я обязательно попробую еще раз ... но я думаю, что это известная проблема ... Спасибо. – Jeff