2011-01-27 4 views
4

Je viens de terminer mon premier service de repos WCF 4.0 et ne comprends pas pourquoi le type de contenu des données renvoyées change entre l'appel du service via Fiddler et Firefox. Voici mon contrat de service:Réglage du service de repos WCF 4.0 type de contenu

[ServiceContract] 
public interface IProjectService 
{ 
    [OperationContract] 
    [WebGet(UriTemplate = "project/{id}/json", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)] 
    ProjectDataContract GetProjectJson(string id); 

    [OperationContract] 
    [WebGet(UriTemplate = "project/{id}/xml", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Xml)] 
    ProjectDataContract GetProjectXml(string id); 

    [OperationContract] 
    [WebGet(UriTemplate = "userprojects/{userKey}/json", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)] 
    List<ProjectDataContract> GetProjectsByUserJson(string userKey); 

    [OperationContract] 
    [WebGet(UriTemplate = "userprojects/{userKey}/xml", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Xml)] 
    List<ProjectDataContract> GetProjectsByUserXml(string userKey); 
} 

Comme vous pouvez le voir, je définis le format de réponse pour chaque opération. Si la requête se termine par "/ json", je renvoie les données json. Si la requête se termine par "/ xml", les données XML sont renvoyées. Au moins c'est ce que mes intentions sont. Lorsque j'appelle http://localhost:5050/ProjectServiceLibrary/project/27/xml dans Firefox, je peux voir que le type de contenu est "text/html" alors que la même requête invoquée dans fiddler montre le type de contenu correct de "application/xml". La même chose se produit pour un appel à une requête suffixée "/ json" - "text/html" dans firefox et "application/json" dans fiddler.

Alors, pourquoi cela se passe-t-il? Lequel ai-je confiance? J'ai téléchargé le module complémentaire JSONView Firefox, mais tout ressemble à json. Il traite le XML en JSON. Je suis sûr qu'il me manque quelque chose d'évident. Toute aide serait grandement appréciée.

Répondre

3

Ceci est lié à l'en-tête Accept dans la requête envoyée par le client. L'en-tête Accept contient une liste hiérarchisée de types MIME. Les en-têtes Accept sont définis par le client (Firefox, Fiddler) et indiquent au serveur les types de contenu qu'il est capable de recevoir. Le serveur utilisera la meilleure correspondance en fonction de la priorité et de la compatibilité.

Accepter les en-têtes générés par FireFox donner une priorité plus élevée au text/html - dire au serveur d'envoyer du texte/html si c'est possible. Vous trouverez probablement que Fiddler fait le contraire, donnant à application/xml la plus haute priorité - ceci explique ce que vous voyez.

Vous trouverez des informations plus détaillées sur les en-têtes de demande au Kris Jordans blog.

+0

ahhh, c'est logique maintenant. Merci pour la clarification. Je vérifiais simplement l'URL dans Firefox et Fiddler pour voir si mon code fonctionnait. Je devenais vraiment confus par les différents résultats et pensais que c'était moi. Donc, je suppose que si j'utilise jQuery pour accéder à mes urls suffixées "/ json", il recevra les données json correctes car je spécifie le type de contenu attendu par jquery. Je vais devoir vérifier cela, mais c'est logique à la lumière de votre réponse. Merci encore. –

Questions connexes