在 WCF Rest 终结点中使用参数 "params string[]"
Use parameter "params string[]" in WCF Rest endpoint
我想定义一个OperationContract,我可以传递任意数量的字符串参数。这些值应解释为字符串数组。有没有可能在 OperationContract 中使用这种类型的参数并在 UriTemplate 中定义它?
[ServiceContract]
public interface IRestService {
[OperationContract]
[WebGet(UriTemplate = "operations/{values}")]
void Operations(params string[] values);
}
不,但是为了方便起见,您可以为代理 and/or 服务合同创建一个(扩展)方法,这将公开一个 params string array
参数,并将其传递给真正的 proxy/service 作为 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...等。面向服务的租户之一是合同需要明确 - 这不是。
最 "idiomatic" 的方法(在面向服务的上下文中)如下:
[ServiceContract]
public interface IRestService {
[OperationContract]
[WebGet(UriTemplate = "operations/{values}")]
void Operations(string[] values);
}
如 中所建议,如果您想在客户端添加一些语法糖,您可以创建一个扩展方法, 使用 params
关键字,使客户端体验更容易理解。
编辑:
正如 Tom, the above contract will not work. You would need to either change the operation to a POST (as demonstrated on 所指出的那样),或者使您在服务器端解开的定界参数字符串生成数组:
[ServiceContract]
public interface IRestService {
[OperationContract]
[WebGet(UriTemplate = "operations/{delimitedValues}")]
void Operations(string delimitedValues);
}
我想定义一个OperationContract,我可以传递任意数量的字符串参数。这些值应解释为字符串数组。有没有可能在 OperationContract 中使用这种类型的参数并在 UriTemplate 中定义它?
[ServiceContract]
public interface IRestService {
[OperationContract]
[WebGet(UriTemplate = "operations/{values}")]
void Operations(params string[] values);
}
不,但是为了方便起见,您可以为代理 and/or 服务合同创建一个(扩展)方法,这将公开一个 params string array
参数,并将其传递给真正的 proxy/service 作为 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...等。面向服务的租户之一是合同需要明确 - 这不是。
最 "idiomatic" 的方法(在面向服务的上下文中)如下:
[ServiceContract]
public interface IRestService {
[OperationContract]
[WebGet(UriTemplate = "operations/{values}")]
void Operations(string[] values);
}
如 params
关键字,使客户端体验更容易理解。
编辑:
正如 Tom, the above contract will not work. You would need to either change the operation to a POST (as demonstrated on
[ServiceContract]
public interface IRestService {
[OperationContract]
[WebGet(UriTemplate = "operations/{delimitedValues}")]
void Operations(string delimitedValues);
}