Я пытаюсь настроить конечные точки 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>