servicios example ejemplo create crear consumir c# wcf rest

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.