web-dev-qa-db-fra.com

Paramètres de chaîne de requête facultatifs dans URITemplate in WCF?

Je développe des services RESTful dans WCF 4.0. J'ai une méthode comme ci-dessous:

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

Donc, si je navigue dans mon navigateur vers http: // localhost: 8000/Service/Test? Format = XML & records = 10 , tout fonctionne comme prévu.

CEPENDANT, je souhaite pouvoir accéder à http: // localhost: 8000/Service/Test? Format = XML et laisser la partie "& records = 10" de l'URL. Mais maintenant, je reçois une erreur de service car l'URI ne correspond pas au modèle d'URI attendu.

Alors, comment puis-je 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 de la chaîne de requête.

44
Shafique

Note: Cette question est obsolète, veuillez voir les autres réponses.


Cela ne semble pas être pris en charge. 

Cependant, Microsoft a été informé de ce problème et il existe une solution de contournement:

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

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

53
luksan

Selon cette réponse ceci est corrigé dans .NET 4.0. Le fait de ne pas fournir le paramètre de chaîne de requête semble avoir pour résultat de lui donner la valeur par défaut du type.

16
Olly

Vérifiez cette publication de blog. 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

En gros, ne définissez pas les paramètres de chaîne de requête dans UriTemplate afin qu'ils correspondent avec/sans les paramètres, et utilisez la classe exemple pour les récupérer s'ils sont présents dans l'implémentation de la méthode.

4
MonkeyWrench

Oui, je peux confirmer après WCF 4.0 que cela fonctionne comme un charme, comme décrit ici WCF et paramètres facultatifs

3
JOKe

Cela semble fonctionner dans WCF 4.0.
Assurez-vous simplement 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
}
2
Navy Seal

Bien qu’il s’agisse d’une vieille question, nous en arrivons encore de temps en temps à ce scénario dans des projets récents. 

Pour envoyer des paramètres de requête facultatifs, j'ai créé le paquet WCF Web Extensions nuget.

Après l’installation, vous pouvez utiliser le paquet comme ceci:

using (var factory = new WebChannelFactory<IQueryParametersTestService>(new WebHttpBinding()))
{
    factory.Endpoint.Address = new EndpointAddress(ServiceUri);
    factory.Endpoint.EndpointBehaviors.Add(new QueryParametersServiceBehavior());
    using (var client = factory.CreateWebChannel())
    {
        client.AddQueryParameter("format", "xml");
        client.AddQueryParameter("version", "2");
        var result = client.Channel.GetReport();
    }
}

Côté serveur, vous pouvez récupérer les paramètres à l'aide de WebOperationContext:

WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters;
0
Cosmin Vană