WCF中UriTemplate中的可选参数

Optional parameter in UriTemplate in WCF

我在这个线程中使用了提示,并提供了一个默认值,这样当用户不使用时?t指定virutal子目录,我假设他指的是要列出的所有内容。它起作用了。

1
2
3
[OperationContract]
[WebInvoke(UriTemplate ="GetStuff/{type=all}", ...]
IEnumerable<Stuff> GetStuff(String type);

但是,最好指定一个默认值。但是,默认值(字符串)为空,我希望以实际值发送。尤其是,我已经把心放在绳子上了。空的。但是,我注意到以下内容不起作用。服务器端的条件不识别空字符串(…其中(colname,","all")中的'type')。

1
2
3
[OperationContract]
[WebInvoke(UriTemplate ="GetStuff/{type=String.Empty}", ...]
IEnumerable<Stuff> GetStuff(String type);

怎么办?


它对我起到了"=null"的作用。我的合同是这样的:

1
2
3
[WebInvoke(UriTemplate ="UploadFile/{fileName}/{patientId}/{documentId}/{providerName=null}", Method ="POST")]

void UploadFile(string fileName, string patientId, string documentId, string providerName, Stream fileContents);

当只添加"="以获取字符串变量的默认值为空时,它将抛出消息。

The UriTemplate '/applications/legal/statuses/{serviceId=}' is not
valid; the UriTemplate variable declaration 'serviceId=' provides an
empty default value to path variable 'serviceId'. Note that
UriTemplate path variables cannot be bound to a null or empty value.
See the documentation for UriTemplate for more details.

而是指定一个默认值,稍后在代码中进行检查:

1
 UriTemplate ="/applications/legal/statuses/{serviceId=default}"

服务ID将是默认值。


您确实可以向UriTemplate添加可选参数。但是,它必须是最后一个参数。

使用webget的可选uritemplate参数


在uritemplate中不能真正有空的默认值,但是可以有一个表示默认值的值,在操作时可以将其替换为所需的实际默认值,如下所示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
public class StackOverflow_17251719
{
    const string DefaultValueMarker ="___DEFAULT_VALUE___";
    const string ActualDefaultValue ="";
    [ServiceContract]
    public class Service
    {
        [WebInvoke(UriTemplate ="GetStuff/{type=" + DefaultValueMarker +"}", ResponseFormat = WebMessageFormat.Json)]
        public IEnumerable<string> GetStuff(String type)
        {
            if (type == DefaultValueMarker)
            {
                type = ActualDefaultValue;
            }

            yield return type;
        }
    }
    public static void SendBodylessPostRequest(string uri)
    {
        HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(uri);
        req.Method ="POST";
        req.ContentType ="application/json";
        req.GetRequestStream().Close(); // no request body

        HttpWebResponse resp;
        try
        {
            resp = (HttpWebResponse)req.GetResponse();
        }
        catch (WebException e)
        {
            resp = (HttpWebResponse)e.Response;
        }

        Console.WriteLine("HTTP/{0} {1} {2}", resp.ProtocolVersion, (int)resp.StatusCode, resp.StatusDescription);
        foreach (string headerName in resp.Headers.AllKeys)
        {
            Console.WriteLine("{0}: {1}", headerName, resp.Headers[headerName]);
        }

        Console.WriteLine();
        Stream respStream = resp.GetResponseStream();
        Console.WriteLine(new StreamReader(respStream).ReadToEnd());

        Console.WriteLine();
        Console.WriteLine("  *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* ");
        Console.WriteLine();
    }
    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");

        SendBodylessPostRequest(baseAddress +"/GetStuff/nonDefault");
        SendBodylessPostRequest(baseAddress +"/GetStuff");

        Console.Write("Press ENTER to close the host");
        Console.ReadLine();
        host.Close();
    }
}