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.
Vous devez vous connecter pour publier un commentaire.
Fait
<enableWebScript />
est pas requises pour les "pure" support JSON. LeWebScriptEnablingBehavior
n'est nécessaire que si vous souhaitez soutenir ASP.NET AJAX. Plus souvent que pas, si vous êtes en essayant de travailler avec la norme bibliothèques de scripts, vous ne pas souhaitez activer cette prise en charge de vos services.Au lieu de ce que vous voulez faire pour votre JSON point de terminaison est juste utiliser le
WebHttpBehavior
et définir la DefaultOutgoingResponseFormat="JSON". Le problème est, dans .NET 3.5, vous ne pouvez pas contrôler ce paramètre via la config carWebHttpElement
ne pas exposer ces propriétés de configuration. Pour contourner ce problème dans 3.5 ont fourni une mise en œuvre de ce que j'appelle laEnhancedWebHttpElement
ici, dans cette réponse à l'autre StackOverflow question.Heureusement, Microsoft a réalisé cette lacune et a permis de configuration de tous les
WebHttpBehavior
les paramètres via leWebHttpElement
dans la version 4.0.Drew réponse est sur place, mais je pense que la question est toujours debout. Est-il sain d'avoir du JSON pour AJAX () et les bénédictions de UriTemplate?
Je pense qu'il vaut la peine de mentionner que JSON retourné avec est différente de celle JSON généré avec [WebGet(ResponseFormat=WebMessageFormat.Json)]. Le premier est enroulé autour de la MS AJAX " d " élément par exemple, {"d":[{...}]}.
Vous avez spécifié des paramètres entiers dans votre opération. URI modèle ne fonctionne pas bien avec les paramètres int. Veuillez changer de chaîne , Il va fonctionner.
Je pense que vous devez écrire votre propre QuerystringConverter utiliser int avec URITemplate.