Я пытаюсь создать универсальный интерфейс веб-сервиса, использующий WCF, позволить сторонним разработчикам сцепляться в наше программное обеспечение. После большой борьбы и чтения (этот вопрос помог много), я наконец получил SOAP, JSON и XML (POX) сотрудничество.
Для упрощения вот, мой код (для создания этого примера простым, я не использую интерфейсы - я действительно пробовал это оба пути):
_
Public Class TestService
Public Sub New()
End Sub
_
_
Public Function GetDate() As DateTime
Return Now
End Function
' _
_
Public Function GetDateOffset(ByVal numDays As Integer) As DateTime
Return Now.AddDays(numDays)
End Function
End Class
и код web.config:
Это на самом деле работает - я могу перейти в 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'.
Но конечно без использования
, JSON не работает.
Единственная другая вещь я видел, что думаю, будет работать, делает 3 различных сервиса (.svc файлы), что вся реализация интерфейс, который указывает контракт, но в классах, указывает различные атрибуты WebGet/WebInvoke на каждом классе. Это походит на большую дополнительную работу, это откровенно говоря, я не вижу, почему платформа не обрабатывает для меня. Реализация классов все была бы тем же, за исключением атрибутов, что означает со временем, что для ошибок/изменений было бы легко фиксироваться/делаться в одной реализации, но не других, ведя к непоследовательному поведению при использовании JSON по сравнению с реализацией SOAP, например.
Я делаю что-то не так здесь? Я проявляю полностью неправильный подход и неправильно использую WCF? Существует ли лучший способ сделать это?
С моим опытом, делающим веб-материал, я думаю, что для некоторой платформы должно быть возможно обработать это... У меня даже есть идея в моей голове того, как создать ее. Просто кажется, что WCF, как предполагается, делает это, и я действительно не хочу изобретать велосипед.
На самом деле
не требуется для "чистой" поддержки JSON. WebScriptEnhibitedBehavior
требуется только в том случае, если вы хотите поддерживать ASP.NET AJAX. Чаще всего, если вы пытаетесь работать со стандартными библиотеками сценариев, вы не хотите включать эту поддержку для своих служб.
Вместо этого для конечной точки JSON вы хотите просто использовать WebHttpBehavior
и установить DefaultOutgoingResponseFormat = "JSON". Проблема в том, что в .NET 3.5 вы не можете управлять этим параметром через config, потому что WebHttpElement
не предоставляет эти свойства для настройки. Чтобы обойти это, в 3.5 была предоставлена реализация того, что я называю EnhancedWebHttpElement
здесь, в этом ответе на другой вопрос StackOverflow.
К счастью, Microsoft осознала этот недостаток и включила настройку всех параметров WebHttpBehavior
через WebHttpElement
в 4.0 .