使用可选UriTemplate参数WebGet(Optional UriTemplate param

2019-07-21 05:17发布

我尝试了这些

在WCF服务URI模板可选参数? 发布卡迈勒拉瓦特在博客| 08月04,.NET 4.5 2012本节展示了我们如何在WCF Servuce URI 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.  

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


Answer 2:

关于默认值的互补答案UriTemplate S使用的查询参数。 通过@carlosfigueira提出的解决方案根据仅适用于路径段变量的文档 。

只有路径段变量都不允许有默认值。 查询字符串变量,复合段变量,并命名为通配符不允许使用变量有默认值。



文章来源: Optional UriTemplate parameter using WebGet
标签: c# wcf rest