2

我正在使用 .Net 4.0 创作一个 RESTful WCF 服务。我想要以下两个网址:

/root/document/{ids}?fields={fields}
/root/externaldocument/{ids}?fields={fields}

映射到相同的接口成员:

Documents GetDocuments(string ids, string fields)

我尝试将通配符放入文字 URL 段:

    [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 中是不可能的吗?

4

1 回答 1

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 的条目。

如果第二段是“documents”,则“source”输入参数捕获“d”;如果第二段是“externaldocuments”,则捕获“externald”。因此,通过检查此输入参数,该方法可以做出适当的反应,具体取决于使用的 URL达到方法。

请注意,我不能将以下内容用于 UriTemplate:

[WebGet(UriTemplate = "/root/{source}documents/{ids}?fields={fields}")]

因为在这种情况下,传入的 URL

/root/document/{ids}?fields={fields}

将不匹配模板,即使在源输入参数使用空字符串 ("") 时模板匹配。显然,UriTemplate 匹配算法要求参数捕获组中至少有一个字符才能进行匹配。

于 2012-12-26T22:07:37.967 回答