Подтвердить что ты не робот

Дополнительный параметр UriTemplate с использованием WebGet

Я пробовал эти

Необязательные параметры в шаблоне URI службы WCF? Отправленный Kamal Rawat в Блоги |.NET 4.5 - 04 сентября 2012 г. В этом разделе показано, как мы можем передавать необязательные параметры в URI WCU Servuce 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.  
4b9b3361

Ответ 1

У вас есть два варианта для этого сценария. Вы можете использовать подстановочный знак (*) в параметре {app}, что означает "остальная часть URI"; или вы можете указать значение по умолчанию для части {app}, которая будет использоваться, если она не указана.

Вы можете увидеть дополнительную информацию о шаблонах URI в http://msdn.microsoft.com/en-us/library/bb675245.aspx, а в приведенном ниже коде показаны обе альтернативы.

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();
    }
}

Ответ 2

Дополнительный ответ о значениях по умолчанию в UriTemplate с использованием параметров запроса. Решение, предлагаемое @carlosfigueira, работает только для переменных сегмента пути в соответствии с docs.

Только переменные сегмента маршрута имеют значения по умолчанию. Строковые переменные запроса, составные сегментные переменные и имена подстановочных переменных не имеют значений по умолчанию.