在 WCF Rest 终结点中使用参数 "params string[]"

Use parameter "params string[]" in WCF Rest endpoint

我想定义一个OperationContract,我可以传递任意数量的字符串参数。这些值应解释为字符串数组。有没有可能在 OperationContract 中使用这种类型的参数并在 UriTemplate 中定义它?

[ServiceContract]
public interface IRestService {
    [OperationContract]
    [WebGet(UriTemplate = "operations/{values}")]
    void Operations(params string[] values);
}

不,但是为了方便起见,您可以为代理 and/or 服务合同创建一个(扩展)方法,这将公开一个 params string array 参数,并将其传递给真正的 proxy/service 作为 string array.

的合约

您不应在 GET 操作中执行此操作。 GET 操作仅支持路径上的参数或查询字符串上的参数,这两者都不适合集合等复杂类型。

应使用 POST 操作将集合作为正文参数传递。

[OperationContract]
[WebInvoke(Method = "POST", 
           RequestFormat = WebMessageFormat.Json, // or xml
           UriTemplate = "operations/xAllTheStrings")]
void Operations(string[] values);

您的服务契约接口就是这样 - 服务器将接受的内容与客户端需要遵守的内容之间的正式契约。此合同以 wsdl 的形式序列化为 XML - 因此您的合同中出现的任何数据类型都必须以 XML.

中的序列化形式表达

在你的情况下,你的服务调用的参数数量没有明确定义:它可能有 0、1、2...等。面向服务的租户之一是合同需要明确 - 这不是。

最 "idiomatic" 的方法(在面向服务的上下文中)如下:

[ServiceContract]
public interface IRestService {
    [OperationContract]
    [WebGet(UriTemplate = "operations/{values}")]
    void Operations(string[] values);
}

中所建议,如果您想在客户端添加一些语法糖,您可以创建一个扩展方法, 使用 params 关键字,使客户端体验更容易理解。

编辑:

正如 Tom, the above contract will not work. You would need to either change the operation to a POST (as demonstrated on 所指出的那样),或者使您在服务器端解开的定界参数字符串生成数组:

[ServiceContract]
public interface IRestService {
    [OperationContract]
    [WebGet(UriTemplate = "operations/{delimitedValues}")]
    void Operations(string delimitedValues);
}