2010-06-03 6 views
44

Je développe des services RESTful dans WCF 4.0. J'ai une méthode comme ci-dessous:Paramètres de chaîne de requête facultatifs dans URITemplate dans WCF?

[OperationContract] 
    [WebGet(UriTemplate = "Test?format=XML&records={records}", ResponseFormat=WebMessageFormat.Xml)] 
    public string TestXml(string records) 
    { 
     return "Hello XML"; 
    } 

Donc, si je navigue mon navigateur à http://localhost:8000/Service/Test?format=XML&records=10, puis tout fonctionne comme exepcted. Cependant, je veux être en mesure de naviguer vers http://localhost:8000/Service/Test?format=XML et laisser la partie "& records = 10" de l'URL. Mais maintenant, j'obtiens une erreur de service car l'URI ne correspond pas au modèle d'URI attendu.

Alors, comment implémenter des valeurs par défaut pour certains de mes paramètres de chaîne de requête? Je veux par défaut les "enregistrements" à 10 par exemple si cette partie est laissée hors de la chaîne de requête.

Répondre

53

Note: Cette question est périmée, veuillez voir les autres réponses.


Cela ne semble pas être pris en charge.

Cependant, Microsoft a été informé de cette question et il y a un travail autour de:

Vous pouvez obtenir l'effet désiré par en omettant la chaîne de requête de la UriTemplate sur votre WebGet ou WebInvoke attribut, et en utilisant WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters à partir de vos gestionnaires pour inspecter, définir les paramètres par défaut, etc. sur la requête paramètres.

https://connect.microsoft.com/VisualStudio/feedback/details/451296/

+1

donc qui semble bien fonctionner. Cependant, si j'essaie d'exécuter le test unitaire, cela ne fonctionne plus car un test unitaire n'a pas de WebOperationContext. J'ai regardé quelques exemples, mais quelqu'un a-t-il un exemple simple de comment se moquer du WebOperationContext? – Shafique

+0

Essayez googler "simuler WebOperationContext". Il y a beaucoup d'idées différentes sur la façon de le faire. – luksan

+0

Donnez +1 à l'homme, sa solution fonctionne! Ici, je vais commencer. – EdgarVerona

4

Vérifiez ce billet de blog sur. Cela a du sens pour moi, et vient avec une classe pour analyser les paramètres de la chaîne de requête.

http://blogs.msdn.com/b/rjacobs/archive/2009/02/10/ambiguous-uritemplates-query-parameters-and-integration-testing.aspx

Fondamentalement ne définissent pas les paramètres de chaîne de requête dans la UriTemplate afin qu'il corresponde avec/sans les paramètres, et utiliser la classe d'échantillons pour les récupérer si elles sont là dans la mise en œuvre de la méthode.

16

Selon this answer est corrigé dans .NET 4.0. Le fait de ne pas fournir le paramètre de la chaîne de requête semble donner la valeur par défaut pour le type.

2

Cela semble fonctionner dans WCF 4.0.
Assurez-vous de définir votre valeur par défaut dans votre « Service1.svc.cs »

public string TestXml(string records) 
{ 
    if (records == null) 
     records = "10"; 

    //... rest of the code 
} 
Questions connexes