Combiné SAVON/JSON/XML dans WCF, à l'aide UriTemplate

Je suis en train de construire un générique interface de service web en utilisant WCF, pour permettre 3ème développeurs tiers pour accrocher dans notre logiciel. Après beaucoup de difficulté et de la lecture (cette question a beaucoup aidé), j'ai enfin eu le SOAP, JSON et XML (POX) à travailler ensemble.

Pour simplifier, voici mon code (pour prendre cet exemple simple, je ne suis pas en utilisant des interfaces -- je l'ai fait essayer ce dans les deux sens):

<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

et le web.config code:

<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>

Cela fonctionne en fait, je suis en mesure d'aller à TestService.svc/xml/GetDate pour xml, TestService.svc/json/GetDate de json, et point un client SOAP à TestService.svc?wsdl et ont le SAVON des requêtes.

La partie que je voudrais corriger est de requêtes. J'ai utiliser TestService.svc/xml/GetDateOffset?numDays=4 au lieu de TestService.svc/xml/GetDateOffset/4. Si je spécifie le UriTemplate, j'obtiens l'erreur:

Endpoints using 'UriTemplate' cannot be used with 'System.ServiceModel.Description.WebScriptEnablingBehavior'.

Mais bien sûr, sans l'aide de <enableWebScript/>, JSON ne fonctionne pas.

La seule autre chose que j'ai vu ce que je pense de travailler est de 3 différents services (.svc fichiers), que tous les implémenter une interface qui spécifie le contrat, mais dans les classes de spécifier différents WebGet/WebInvoke les attributs de chaque classe. Il semble que beaucoup de travail supplémentaire, que franchement, je ne vois pas pourquoi le cadre n'a pas de poignée pour moi. La mise en œuvre de la classes sont toutes les mêmes, sauf pour les attributs, ce qui signifie plus de temps, il serait facile pour les bugs/changements se fixe/fait en une mise en œuvre, mais pas les autres, conduisant à des comportements incohérents lors de l'utilisation de JSON vs SAVON mise en œuvre par exemple.

Je fais quelque chose de mal ici? Suis-je en prenant un totalement faux approche et abusant de la WCF? Est-il une meilleure façon de le faire?

Avec mon expérience dans la réalisation de contenus du web, je pense qu'il devrait être possible pour certains type de cadre pour gérer cela ... j'ai même une idée dans ma tête de façon à le construire. Il semble juste comme WCF est censé faire cela, et je n'ai pas envie de réinventer la roue.

  • Votre exemple de code ici a été très utile! Je venais de JSON liaisons et constaté que je ne pouvais pas consommer les services d'une .net app donc, c'est juste ce que je recherchais! 🙂
  • Note que je considère ce complètement obsolète maintenant avec ASP.NET l'API Web; le code à l'origine de cette question à la demande, a depuis longtemps été réécrite en utilisant l'API Web. Je recommande fortement contre l'utilisation de la WCF pour bien, quoi que ce soit, sauf si vous êtes coincé dans l'âge des ténèbres et a vraiment besoin de SAVON.
InformationsquelleAutor gregmac | 2010-03-18