【问题标题】:Use parameter "params string[]" in WCF Rest endpoint在 WCF Rest 端点中使用参数“params string[]”
【发布时间】:2016-07-19 08:08:30
【问题描述】:

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

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

【问题讨论】:

    标签: c# rest wcf servicecontract operationcontract


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      不,但您可以为您的代理和/或服务合约创建一个(扩展)方法,以公开params string array 参数,并将其作为string array 传递给真正的代理/服务合约。

      【讨论】:

        【解决方案3】:

        您的服务合同接口就是这样 - 服务器将接受的内容与客户端需要遵守的内容之间的正式合同。此合约以 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);
        }
        

        【讨论】:

        • 这个操作还能用吗?查询字符串如何映射到模板中?顺便说一句,你的其余答案很好,但我只是不确定提供的代码示例。
        • 你的观点很好——我已经相应地编辑了我的答案。感谢您指出这一点。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-11
        • 2011-07-29
        • 1970-01-01
        • 2011-07-22
        • 2010-09-16
        • 1970-01-01
        相关资源
        最近更新 更多