2011-01-20 3 views
1

Как я могу использовать DataContractSurrogate для моей службы REST WCF (размещенной с использованием WebServiceHostFactory)?Использование DataContractSurrogate с WCF REST

Я не вижу способа добавить его, и даже если добавить пользовательское IOperationBehavior, WebServiceHost автоматически перезаписывает и игнорирует его.

ответ

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... 
} 

Во-вторых, установить суррогат на 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, тогда понятно, что у вас нет возможности установить суррогат. Чтобы преодолеть это, у вас есть два варианта:

  1. Создать атрибут поведения пользовательского сервиса и установить суррогат в своем методе ApplyDispatchBehavior(). Когда вы разместите этот атрибут на своем устройстве, WCF автоматически выполнит этот метод, и суррогат будет установлен.

  2. Create ваш собственный хостинг по подклассам WebServiceHost. Затем установите суррогат в свой метод ApplyConfiguration(). Это тоже будет иметь тот же эффект.

+0

WebServiceHost не прислушивается к пользовательскому DataContractSerializerOperationBehavior, если вы его применяете. Он игнорирует и перезаписывает его. – Jeff

+0

Это странно. То, как я описывал выше, отлично работает в моем случае. Вы уверены, что Джефф, что вы устанавливаете суррогат перед тем, как хозяин открывается? –

+0

Хммм, я обязательно попробую еще раз ... но я думаю, что это известная проблема ... Спасибо. – Jeff

3

Мне удалось заставить его работать: служба WCF 4.0 REST, размещенная с использованием WebServiceHostFactory в IIS.

я использовал пользовательский атрибут, чтобы ввести свой 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

Надеюсь, что это поможет.

Смежные вопросы