在WCF中,我可以在UriTemplate的文字段中使用通配符吗?

时间:2012-12-19 16:34:29

标签: wcf rest wcf-rest operationcontract uritemplate

我正在使用.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中是不可能的?

1 个答案:

答案 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匹配算法要求参数捕获组中至少有一个字符才能匹配。