c# - example - wcf vs rest
ParĂ¡metro UriTemplate opcional con WebGet (2)
He intentado estos
Parámetros opcionales en la plantilla URI del servicio WCF? Publicado por Kamal Rawat en Blogs | .NET 4.5 el 4 de septiembre de 2012 Esta sección muestra cómo podemos pasar parámetros opcionales en WCF Servuce URI inShare
y
Parámetros de cadenas de consulta opcionales en URITemplate en WCF
Pero nada funciona para mi Aquí está mi código:
[WebGet(UriTemplate = "RetrieveUserInformation/{hash}/{app}")]
public string RetrieveUserInformation(string hash, string app)
{
}
Funciona si los parámetros están llenos:
https://127.0.0.1/Case/Rest/Qr/RetrieveUserInformation/djJUd9879Hf8df/Apple
Pero no funciona si la app
no tiene valor
https://127.0.0.1/Case/Rest/Qr/RetrieveUserInformation/djJUd9879Hf8df
Quiero hacer que la app
opcional. ¿Cómo lograr esto?
Aquí está el error cuando la app
no tiene valor:
Endpoint not found. Please see the service help page for constructing valid requests to the service.
Tienes dos opciones para este escenario. Puede usar un comodín ( *
) en el parámetro {app}
, que significa "el resto del URI"; o puede dar un valor predeterminado a la parte {app}
, que se usará si no está presente.
Puede ver más información sobre las plantillas de URI en http://msdn.microsoft.com/en-us/library/bb675245.aspx y el siguiente código muestra ambas alternativas.
public class _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();
}
}
Una respuesta complementaria con respecto a los valores predeterminados en UriTemplate
s utilizando parámetros de consulta. La solución propuesta por @carlosfigueira funciona solo para las variables del segmento de ruta de acuerdo con los documentos .
Solo las variables de segmento de ruta pueden tener valores predeterminados. Las variables de cadena de consulta, las variables de segmento compuesto y las variables de comodín con nombre no tienen valores predeterminados.