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

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

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

你不应该在GET操作上这样做。 GET操作仅支持路径或查询字符串上的参数,这些参数都不适用于复杂类型(如集合)。

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

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

不,但为方便起见,您可以为您的代理和/或服务合同制定一个(扩展)方法,这将暴露一个params string array参数,并将其作为string array传递给真正的代理/服务合同。

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

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

最“惯用”的方法(在面向服务的环境中)如下:

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

正如在这个答案中所建议的,如果你想在客户端添加一些语法糖,你可以创建一个扩展方法, 使用params关键字来使客户端体验更容易消化。

编辑:

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

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