J'ai essayé ces
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.
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();
}
}
Une réponse complémentaire concernant les valeurs par défaut dans UriTemplate
s à 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.