Я пытаюсь создать общий интерфейс веб-службы с использованием WCF, чтобы сторонние разработчики могли подключиться к нашему программному обеспечению. После долгих усилий и чтения ( этот вопрос очень помог), я наконец-то начал работать вместе с SOAP, JSON и XML (POX).
Чтобы упростить, вот мой код (чтобы сделать этот пример простым, я не использую интерфейсы - я попробовал это в обоих направлениях):
<ServiceContract()> _
Public Class TestService
Public Sub New()
End Sub
<OperationContract()> _
<WebGet()> _
Public Function GetDate() As DateTime
Return Now
End Function
'<WebGet(UriTemplate:="getdateoffset/{numDays}")> _
<OperationContract()> _
Public Function GetDateOffset(ByVal numDays As Integer) As DateTime
Return Now.AddDays(numDays)
End Function
End Class
и код web.config:
<services>
<service name="TestService"
behaviorConfiguration="TestServiceBehavior">
<endpoint address="soap" binding="basicHttpBinding" contract="TestService"/>
<endpoint address="json" binding="webHttpBinding" behaviorConfiguration="jsonBehavior" contract="TestService"/>
<endpoint address="xml" binding="webHttpBinding" behaviorConfiguration="poxBehavior" contract="TestService"/>
<endpoint address="mex" contract="IMetadataExchange" binding="mexHttpBinding" />
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="jsonBehavior">
<enableWebScript/>
</behavior>
<behavior name="poxBehavior">
<webHttp />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="TestServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
Это на самом деле работает - я могу перейти к TestService.svc/xml/GetDate
для xml, TestService.svc/json/GetDate
для json и указать SOAP-клиент на TestService.svc?wsdl
и заставить запросы SOAP работать.
Часть, которую я хотел бы исправить, это запросы. Я должен использовать TestService.svc/xml/GetDateOffset?numDays=4
вместо TestService.svc/xml/GetDateOffset/4
. Если я укажу UriTemplate, я получу ошибку:
Endpoints using 'UriTemplate' cannot be used with 'System.ServiceModel.Description.WebScriptEnablingBehavior'.
Но, конечно, без использования <enableWebScript/>
, JSON не работает.
Единственное, что я видел, что, как мне кажется, сработает, это создание 3 разных сервисов (файлов .svc), которые реализуют интерфейс, который определяет контракт, но в классах указывают разные атрибуты WebGet / WebInvoke для каждого класса. , Это кажется большой дополнительной работой, честно говоря, я не понимаю, почему фреймворк для меня не справляется Реализация всех классов будет одинаковой, за исключением атрибутов, что означает, что с течением времени ошибки / изменения могут быть легко исправлены / выполнены в одной реализации, но не в других, что приведет к противоречивому поведению при использовании JSON против Реализация SOAP, например.
Я что-то здесь не так делаю? Я использую совершенно неправильный подход и неправильно использую WCF? Есть лучший способ сделать это?
Имея опыт работы с веб-материалами, я думаю, что для некоторого фреймворка будет возможно справиться с этим ... У меня даже есть идея, как его построить. Просто кажется, что WCF должен это делать, и я не хочу изобретать велосипед.