在WCF Rest端点中使用参数“params string []”

时间:2016-07-19 08:08:31

标签: c# rest wcf servicecontract operationcontract

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

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

3 个答案:

答案 0 :(得分:2)

您不应该在GET操作上执行此操作。 GET操作仅支持路径或查询字符串上的参数,这两个参数都不适用于复杂类型(如集合)。

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

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

答案 1 :(得分:1)

不,但为方便起见,您可以为您的代理和/或服务合同制定(扩展)方法,这将公开params string array参数,并将其作为{{传递给真实的代理/服务合同1}}。

答案 2 :(得分:1)

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

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

最常见的"惯用的"方法(在面向服务的环境中)如下:

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

正如this answer中所建议的那样,如果您想在客户端添加一些语法糖,您可以创建一个 使用params关键字的扩展方法来制作客户端体验更容易消化。

修改

正如Tom所指出的,上述合同不起作用。您需要将操作更改为POST(如Tom's answer所示),或者将您在服务器端解开的分隔的参数字符串生成以生成数组:

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