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