web-dev-qa-db-fra.com

Paramètre UriTemplate facultatif à l'aide de WebGet

J'ai essayé ces

Paramètres facultatifs dans le modèle d'URI du service WCF? Publié par Kamal Rawat dans Blogs | .NET 4.5 le 04 septembre 2012 Cette section montre comment passer des paramètres facultatifs dans WCF Servuce URI inShare

et

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

Mais rien ne fonctionne pour moi. Voici mon code:

    [WebGet(UriTemplate = "RetrieveUserInformation/{hash}/{app}")]
    public string RetrieveUserInformation(string hash, string app)
    {

    }

Cela fonctionne si les paramètres sont remplis:

https://127.0.0.1/Case/Rest/Qr/RetrieveUserInformation/djJUd9879Hf8df/Apple  

Mais ne fonctionne pas si app n'a pas de valeur

https://127.0.0.1/Case/Rest/Qr/RetrieveUserInformation/djJUd9879Hf8df  

Je veux rendre app facultatif. Comment y parvenir?
Voici l'erreur lorsque app n'a pas de valeur:

Endpoint not found. Please see the service help page for constructing valid requests to the service.  
22
fiberOptics

Vous avez deux options pour ce scénario. Vous pouvez soit utiliser un caractère générique (*) dans le {app} paramètre, ce qui signifie "le reste de l'URI"; ou vous pouvez donner une valeur par défaut au {app} part, qui sera utilisé s'il n'est pas présent.

Vous pouvez voir plus d'informations sur les modèles d'URI sur http://msdn.Microsoft.com/en-us/library/bb675245.aspx , et le code ci-dessous montre les deux alternatives.

public class StackOverflow_15289120
{
    [ServiceContract]
    public class Service
    {
        [WebGet(UriTemplate = "RetrieveUserInformation/{hash}/{*app}")]
        public string RetrieveUserInformation(string hash, string app)
        {
            return hash + " - " + app;
        }
        [WebGet(UriTemplate = "RetrieveUserInformation2/{hash}/{app=default}")]
        public string RetrieveUserInformation2(string hash, string app)
        {
            return hash + " - " + app;
        }
    }
    public static void Test()
    {
        string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
        WebServiceHost Host = new WebServiceHost(typeof(Service), new Uri(baseAddress));
        Host.Open();
        Console.WriteLine("Host opened");

        WebClient c = new WebClient();
        Console.WriteLine(c.DownloadString(baseAddress + "/RetrieveUserInformation/dsakldasda/Apple"));
        Console.WriteLine();

        c = new WebClient();
        Console.WriteLine(c.DownloadString(baseAddress + "/RetrieveUserInformation/dsakldasda"));
        Console.WriteLine();

        c = new WebClient();
        Console.WriteLine(c.DownloadString(baseAddress + "/RetrieveUserInformation2/dsakldasda"));
        Console.WriteLine();

        Console.Write("Press ENTER to close the Host");
        Console.ReadLine();
        Host.Close();
    }
}
49
carlosfigueira

Une réponse complémentaire concernant les valeurs par défaut dans UriTemplates à l'aide des paramètres de requête. La solution proposée par @carlosfigueira ne fonctionne que pour les variables de segment de chemin selon la documentation .

Seules les variables de segment de chemin sont autorisées à avoir des valeurs par défaut. Les variables de chaîne de requête, les variables de segment composé et les variables génériques nommées ne peuvent pas avoir de valeurs par défaut.

3
Bahaa