2

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

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

3 回答 3

2

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

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

[OperationContract]
[WebInvoke(Method = "POST", 
           RequestFormat = WebMessageFormat.Json, // or xml
           UriTemplate = "operations/xAllTheStrings")]
void Operations(string[] values);
于 2016-07-19T08:30:50.323 回答
1

不,但是为了方便起见,您可以为您的代理和/或服务合同创建一个(扩展)方法,这将公开一个params string array参数,并将其作为string array.

于 2016-07-19T08:15:53.903 回答
1

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

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

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

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

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

编辑:

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

[ServiceContract]
public interface IRestService {
    [OperationContract]
    [WebGet(UriTemplate = "operations/{delimitedValues}")]
    void Operations(string delimitedValues);
}
于 2016-07-19T08:39:13.013 回答