2009-06-17 3 views
4

J'ai un service restul WCF et je veux permettre à l'utilisateur de choisir quel format demande qu'ils veulent, j'ai les décorationsWCF WebInvoke ResponseFormat

[OperationContract] 
    [WebInvoke(Method = "GET", 
     ResponseFormat = WebMessageFormat.Xml, 
     BodyStyle = WebMessageBodyStyle.Wrapped, 
     UriTemplate = "getstreamurl?ch={ch}&format=xml")] 
    [WebInvoke(Method = "GET", 
     ResponseFormat = WebMessageFormat.Json, 
     BodyStyle = WebMessageBodyStyle.Wrapped, 
     UriTemplate = "getstreamurl?ch={ch}&format=json")] 

D'abord, est-il un moyen de spécifier le ResponseFormat à runtime et prendre le format en tant qu'argument à la méthode? De la lecture autour je ne pense pas ainsi ... OK la prochaine chose Le code ci-dessus est correct et fonctionne, mais im ayant un problème, je veux pouvoir spécifier un défaut, donc quand aucun argument de format est passé alors je par défaut mais si je décore comme si

[WebInvoke(Method = "GET", 
     ResponseFormat = WebMessageFormat.Xml, 
     BodyStyle = WebMessageBodyStyle.Wrapped, 
     UriTemplate = "getstreamurl?ch={ch})] 

    [OperationContract] 
    [WebInvoke(Method = "GET", 
     ResponseFormat = WebMessageFormat.Json, 
     BodyStyle = WebMessageBodyStyle.Wrapped, 
     UriTemplate = "getstreamurl?ch={ch}&format=json")] 

Lorsque le XML est la valeur par défaut, si je tente d'appeler la méthode de service à travers le navigateur, il me dit que:

UriTemplateTable ne prend pas en charge plusieurs modèles qui ont équivalent path comme modèle 'getstreamurl? ch = {ch}' mais ont des chaînes de requête différentes, où les chaînes de requête ne peuvent pas toutes être désambiguïsées via des valeurs littérales. Voir la documentation pour UriTemplateTable pour plus de détails

Ils peuvent évidemment être distingués mais il semble que WCF ne fait que lire l'argument et que c'est ... Des suggestions?

Répondre

5

Non, je ne pense pas que vous puissiez le faire par programmation lors de l'exécution. Ce que vous pouvez faire bien sûr si exposer deux points de terminaison distincts de votre service - un retournant XML, un autre JSON de retour, puis choisissez par programme celui qui appeler de votre application cliente.

Marc

Mise à jour: comme Steve Michelotti souligne à juste titre, cette commutation automatique entre JSON et XML peut désormais être atteint dans WCF 4.0. WCF 4.0 a une prise en charge REST améliorée qui inclut également une fonctionnalité de sélection de format de message, basée sur les en-têtes d'acceptation HTTP.

Pour plus d'informations sur les nouvelles fonctionnalités de WCF 4.0, consultez: A Developer's Introduction to WCF 4.0

+0

Ceci est incorrect. Comme Regfor le fait remarquer dans sa réponse, vous pouvez avoir le même point de terminaison renvoyer XML ou json en passant la valeur appropriée dans l'en-tête Accept. –

+1

@Steve Michelotti: cette nouvelle fonctionnalité a été introduite avec WCF 4.0 dans .NET 4.0 - il était ** pas ** disponible en Juin 2009 quand j'ai répondu à WCF 3.5 –

+0

ah, j'ai raté la date (Juin 2009) quand j'ai lu ceci la première fois. –

3

Vous pouvez le faire si votre service de repos est configuré automatiquement sélectionner le type de réponse.

Ensuite, sur la demande du client, il suffit d'ajouter l'en-tête nécessaire Accepter: application/json

+0

quoi *** config *** ('web.config') pour le service? – Kiquenet