C# 使用参数";参数字符串[]”;在WCF Rest端点中

C# 使用参数";参数字符串[]”;在WCF Rest端点中,c#,rest,wcf,servicecontract,operationcontract,C#,Rest,Wcf,Servicecontract,Operationcontract,我想定义一个OperationContract,我可以传递任意数量的字符串参数。这些值应解释为字符串数组。是否有可能在OperationContract中使用此类型的参数,并在模板中定义此参数 [ServiceContract] public interface IRestService { [OperationContract] [WebGet(UriTemplate = "operations/{values}")] void Operations(params st

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

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

不可以,但是为了方便起见,您可以对代理和/或服务契约进行(扩展)方法,该方法将公开
参数params string array
参数,并将其作为
string array
传递给真正的代理/服务契约。您不应该在GET操作中执行此操作。GET操作仅支持路径或查询字符串上的参数,这两个参数都不适用于复杂类型,如集合

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

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

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

在您的情况下,服务调用的参数数量定义不明确:它可能有0、1、2。。。等等。服务导向的租户之一是,合同需要明确,但事实并非如此

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

[ServiceContract]
public interface IRestService {
    [OperationContract]
    [WebGet(UriTemplate = "operations/{values}")]
    void Operations(string[] values);
}
正如中所建议的,如果您想在客户端添加一些语法糖,您可以创建一个扩展方法,使用
params
关键字使客户端体验更容易消化

编辑:

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

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

这个手术会奏效吗?查询字符串如何映射到模板中?顺便说一句,你剩下的答案很好,但我只是不确定提供的代码示例。你说得很好-我已经相应地编辑了我的答案。谢谢你指出这一点。