我想定义一个OperationContract,我可以传递任意数量的字符串参数。值应解释为字符串数组。是否有可能在OperationContract中使用这种类型的参数并在UriTemplate中定义它?
[ServiceContract]
public interface IRestService {
[OperationContract]
[WebGet(UriTemplate = "operations/{values}")]
void Operations(params string[] values);
}
答案 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);
}