Необязательный параметр UriTemplate, использующий WebGet
Я пробовал это
Необязательные параметры в шаблоне URI службы WCF? Автор: Камал Рават в блогах | .NET 4.5 от 04 сентября 2012 г. В этом разделе показано, как мы можем передавать необязательные параметры в URI WCF-службы в inShare
а также
Необязательные параметры строки запроса в URITemplate в WCF
Но у меня ничего не работает. Вот мой код:
[WebGet(UriTemplate = "RetrieveUserInformation/{hash}/{app}")]
public string RetrieveUserInformation(string hash, string app)
{
}
Работает, если параметры заполнены:
https://127.0.0.1/Case/Rest/Qr/RetrieveUserInformation/djJUd9879Hf8df/Apple
Но не работает, если app
не имеет значения
https://127.0.0.1/Case/Rest/Qr/RetrieveUserInformation/djJUd9879Hf8df
я хочу сделать app
необязательный. Как этого добиться?
Вот ошибка, когда app
не имеет значения:
Endpoint not found. Please see the service help page for constructing valid requests to the service.
2 ответа
У вас есть два варианта для этого сценария. Вы можете использовать подстановочный знак (*
) в {app}
параметр, который означает "остаток URI"; или вы можете дать значение по умолчанию для {app}
часть, которая будет использоваться, если ее нет.
Более подробную информацию о шаблонах URI можно найти по адресу http://msdn.microsoft.com/en-us/library/bb675245.aspx, а в приведенном ниже коде показаны обе альтернативы.
public class Stackru_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();
}
}
Дополнительный ответ относительно значений по умолчанию в UriTemplate
с использованием параметров запроса. Решение, предложенное @carlosfigueira, работает только для переменных сегмента пути в соответствии с документами.
Только переменные сегмента пути могут иметь значения по умолчанию. Строковые переменные запроса, составные переменные сегмента и именованные переменные с подстановочными знаками не могут иметь значения по умолчанию.