Объединенный SOAP/JSON/XML в WCF, с помощью UriTemplate

Я пытаюсь создать универсальный интерфейс веб-сервиса, использующий 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, как предполагается, делает это, и я действительно не хочу изобретать велосипед.

25
задан Community 23 May 2017 в 12:14
поделиться

1 ответ

На самом деле не требуется для "чистой" поддержки JSON. WebScriptEnhibitedBehavior требуется только в том случае, если вы хотите поддерживать ASP.NET AJAX. Чаще всего, если вы пытаетесь работать со стандартными библиотеками сценариев, вы не хотите включать эту поддержку для своих служб.

Вместо этого для конечной точки JSON вы хотите просто использовать WebHttpBehavior и установить DefaultOutgoingResponseFormat = "JSON". Проблема в том, что в .NET 3.5 вы не можете управлять этим параметром через config, потому что WebHttpElement не предоставляет эти свойства для настройки. Чтобы обойти это, в 3.5 была предоставлена ​​реализация того, что я называю EnhancedWebHttpElement здесь, в этом ответе на другой вопрос StackOverflow.

К счастью, Microsoft осознала этот недостаток и включила настройку всех параметров WebHttpBehavior через WebHttpElement в 4.0 .

26
ответ дан 28 November 2019 в 21:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: