Optional UriTemplate parameter using WebGet
c#, rest, wcf
Solution
You have two options for this scenario. You can either use a wildcard (`*`) in the `{app}` parameter, which means "the rest of the URI"; or you can give a default value to the `{app}` part, which will be used if it's not present.
You can see more information about the URI Templates at http://msdn.microsoft.com/en-us/library/bb675245.aspx, and the code below shows both 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();
}
}
Problem
I have tried these Optional Parameters in WCF Service URI Template? Posted by Kamal Rawat in Blogs | .NET 4.5 on Sep 04, 2012 This section shows how we can pass optional parameters in WCF Servuce URI inShare and Optional query string parameters in URITemplate in WCF But nothing works for me. Here is my code: ``` [WebGet(UriTemplate = "RetrieveUserInformation/{hash}/{app}")] public string RetrieveUserInformation(string hash, string app) { } ``` It works if the parameters are filled up: ``` https://127.0.0.1/Case/Rest/Qr/RetrieveUserInformation/djJUd9879Hf8df/Apple ``` But doesn't work if `app` has no value ``` https://127.0.0.1/Case/Rest/Qr/RetrieveUserInformation/djJUd9879Hf8df ``` I want to make `app` optional. How to achieve this? Here is the error when `app` has no value: ``` Endpoint not found. Please see the service help page for constructing valid requests to the service. ```