2016-07-19 45 views
1

我想定义一个OperationContract,它可以传递任意数量的字符串参数。这些值应该被解释为一个字符串数组。有没有可能在OperationContract中使用这种类型的参数并在UriTemplate中定义这个参数?在WCF Rest端点中使用参数“params string []”

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

回答

1

您不应该在GET操作中执行此操作。 GET位于路径或查询字符串中。一个集合应该作为POST传递到主体中。

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

没有,但你可以做的(扩展)方法来你的代理和/或便民服务合同,那样会暴露一个params string array参数,并将其传递给真实代理/服务合同作为string array

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); 
} 
+0

这会运行甚至工作?查询字符串如何映射到模板中?其余的答案很好,但我只是不确定提供的代码示例。 –

+0

你说得很好 - 我已经编辑了我的答案。感谢您指出了这一点。 – Lawrence