我正在使用.Net 4.0编写RESTful WCF服务。我想要以下两个URL:
/root/document/{ids}?fields={fields}
/root/externaldocument/{ids}?fields={fields}
映射到同一个接口成员:
Documents GetDocuments(string ids, string fields)
我尝试将通配符放入文字网址段:
[OperationContract]
[WebGet(UriTemplate = "/root/*document/{ids}?fields={fields}")]
Documents GetDocuments(string ids, string fields)
但是,这是无效的,我得到以下异常:
The UriTemplate '/root/*document/{ids}?fields={fields}' is not valid; the
wildcard ('*') cannot appear in a variable name or literal... Note that a
wildcard segment, either a literal or a variable, is valid only as the last
path segment in the template
如果我将通配符片段包装在模板括号中:
[OperationContract]
[WebGet(UriTemplate = "/root/{*document}/{ids}?fields={fields}")]
Documents GetDocuments(string ids, string fields)
然后我得到一个异常,因为方法参数中没有这样的输入参数:
Operation 'GetDocuments' in contract 'IAPIv2' has a UriTemplate that expects a
parameter named 'DOCUMENTS', but there is no input parameter with that name
on the operation.
我的解决方法只是有两个条目,指向不同的方法,然后让方法调用一个通用的实现:
[OperationContract]
[WebGet(UriTemplate = "/root/document/{ids}?fields={fields}")]
Documents GetDocuments(string ids, string fields)
[OperationContract]
[WebGet(UriTemplate = "/root/externaldocument/{ids}?fields={fields}")]
Documents GetExternalDocuments(string ids, string fields)
但这看起来有点难看。
我已阅读文档,但无法找到具体地址。有什么办法可以在WCF中使用通配符文字段吗?或者这在WCF中是不可能的?
答案 0 :(得分:1)
事实证明,两个入口点需要略有不同的功能。所以我需要捕获用于输入方法的URL。我最终做的是以下几点:
[OperationContract]
[WebGet(UriTemplate = "/root/{source}ocuments/{ids}?fields={fields}")]
DocumentCollection GetDocumentsById(string source, string ids, string fields);
两个网址:
/root/document/{ids}?fields={fields}
/root/externaldocument/{ids}?fields={fields}
映射到相同的URL模板,因此我需要在我的界面中只有一个带有单个UriTemplate的条目。
“source”输入参数捕获“d”,如果第二段是“documents”或“externald”,如果第二段是“externaldocuments”。因此,通过检查此输入参数,该方法可以适当地做出反应,具体取决于哪个URL用于访问该方法。
请注意,我无法将以下内容用于UriTemplate:
[WebGet(UriTemplate = "/root/{source}documents/{ids}?fields={fields}")]
因为在这种情况下,传入的URL
/root/document/{ids}?fields={fields}
与模板不匹配,即使模板匹配,如果源输入参数使用空字符串(“”)。显然,UriTemplate匹配算法要求参数捕获组中至少有一个字符才能匹配。