WCF - два интерфейса (сериализация XML и DataContract) с одинаковой реализацией - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь настроить конечные точки REST WCF для службы мыла.Дело в том, что я хочу использовать XMLSerializer для XML и DataContractSerializer для других типов.

Пытался использовать DataContractSerializer, но не смог успешно сериализовать запрос.Мне нужно изменить структуру классов, чтобы она работала, и, если это возможно, хотелось бы избежать этого.

Проблема: хотя мне удалось заставить конечные точки работать с JSON и XML, теперь Функциональность SOAP нарушена .При добавлении ссылки на службу из клиентского проекта я вижу, что определения классов удваиваются.

Reference.cs

Из контракта на обслуживание XML я получаю классы с аннотациями, такими как

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.7.3056.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://WebService/XML/REST")]

и из интерфейсов JSON / SOAP я получаю те же классы с аннотацией, как:

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="MethodARequest", Namespace="http://schemas.datacontract.org/2004/07/WebService")]
[System.SerializableAttribute()]

Вот моя настройка двух интерфейсов:

1. (для запросов REST JSON, оригинальный SOAP)

[ServiceContract]
public interface IWCFService
{
[OperationContract]
    [WebInvoke(Method ="POST",  UriTemplate = "MethodA")]
    MethodAResponse MethodA(MethodARequest request);

    [OperationContract]
    [WebInvoke(Method = "POST",  UriTemplate = "MethodB")]
    MethodBResponse MethodB(MethodBRequest request);
}

2. (для запросов XML)

[ServiceContract(Namespace = "")]
[XmlSerializerFormat]
public interface IXMLRestService
{
    [OperationContract]
    [WebInvoke(Method ="POST",  UriTemplate = "MethodA")]
    MethodAResponse MethodA(MethodARequest request);

    [OperationContract]
    [WebInvoke(Method = "POST",  UriTemplate = "MethodB")]
    MethodBResponse MethodB(MethodBRequest request);      
}

Реализация для двух интерфейсов:

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]
public class XYService : IJSONRestService, IXMLRestService
{
   public MethodAResponse MethodA(MethodARequest request){}

   public MethodBResponse MethodB(MethodBRequest request){}
}

Как я могу решить эту проблему неопределенность ?** Возможно ли скрыть определение класса, созданное интерфейсом IXMLRestService?

My app.config

  <service behaviorConfiguration="WebServiceBehavior" name="WebService">
    <endpoint address="http://localhost:45000/WebService/V2" binding="basicHttpBinding" bindingConfiguration="WebServiceTransportSecurity" contract="IWCFService">
    </endpoint>
    <endpoint address="http://localhost:45000/WebService/V2/REST"  binding="webHttpBinding" behaviorConfiguration="webhttp" contract="IWCFService">
    </endpoint>
    <endpoint address="http://localhost:45000/WebService/V2/XML/REST"  binding="webHttpBinding" behaviorConfiguration="webhttp" contract="IXMLRestService">
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
  </service>
...