24

我试过这些

WCF 服务 URI 模板中的可选参数?由 Kamal Rawat 发表在博客 | .NET 4.5 于 2012 年 9 月 4 日 本节展示了我们如何在 WCF Servuce URI inShare 中传递可选参数

WCF 中 URITemplate 中的可选查询字符串参数

但没有什么对我有用。这是我的代码:

    [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.  
4

2 回答 2

52

对于这种情况,您有两种选择。您可以*在参数中使用通配符 ( ) {app},表示“URI 的其余部分”;或者你可以给{app}部件一个默认值,如果它不存在,它将被使用。

您可以在http://msdn.microsoft.com/en-us/library/bb675245.aspx上查看有关 URI 模板的更多信息,下面的代码显示了这两种选择。

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();
    }
}
于 2013-03-08T17:36:46.667 回答
3

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

仅允许路径段变量具有默认值。查询字符串变量、复合段变量和命名通配符变量不允许有默认值。

于 2016-11-18T10:16:00.520 回答