无法以 GET 类型的方法将字典作为参数传递给 WCF REST 服务

Posted

技术标签:

【中文标题】无法以 GET 类型的方法将字典作为参数传递给 WCF REST 服务【英文标题】:Unable to pass a Dictionary as a parameter to WCF REST service in GET type of method 【发布时间】:2020-07-31 13:28:59 【问题描述】:

我有一个要求,其中大多数 WCF REST api 都是 GET 类型,并且会接收 Dictionary 作为参数。但是当它如下放置时,它会抛出错误。

[WebGet(UriTemplate = "/GetVersion?Param1=serverDetails")]
public Version GetVersion(Dictionary<string, string> keyValue)



它给出以下错误:

合约“IDeploy”中的操作“GetVersion”有一个名为“keyValue”的查询变量,类型为“System.Collections.Generic.Dictionary'2[System.String,System.String]”,但类型为“System.Collections”。 Generic.Dictionary'2[System.String,System.String]' 不能被 'QueryStringConverter' 转换。 UriTemplate 查询值的变量必须具有可由“QueryStringConverter”转换的类型。

知道如何解决这个问题吗?字典参数类型很难替换,因为有很多这样的方法在服务中。

【问题讨论】:

Take a look at these answers 【参考方案1】:

为了支持如此复杂的参数,Get 请求无法完成。我们需要Post/Put/Delete 请求来完成这个任务,因为我们可以在请求正文中设置这些复杂的参数。

[OperationContract]
        [WebInvoke(RequestFormat =WebMessageFormat.Json,BodyStyle =WebMessageBodyStyle.Bare)]
        string GetData(Dictionary<string,string> value);

以下是示例请求的 JSON 内容。

[
    "Key":"Key1",
    "Value":"World"
,

    "Key":"Key2",
    "Value":"Hello"
]

以下是设置为 WebMessageFormat.Xml 时示例请求的 Xml 内容

<ArrayOfKeyValueOfstringstring xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
  <KeyValueOfstringstring>
    <Key>Key1</Key>
    <Value>Hello</Value>
  </KeyValueOfstringstring>
  <KeyValueOfstringstring>
    <Key>Key2</Key>
    <Value>World</Value>
  </KeyValueOfstringstring>
</ArrayOfKeyValueOfstringstring>

如果问题仍然存在,请随时告诉我。

【讨论】:

感谢您的输入,但无法更改方法类型。使用 QueryStringConverter 进行了一些更改。 HttpGet请求使用查询字符串而不是请求体来获取参数,因此大部分RestAPI不支持HttpGet请求中的复合类型参数,包括Asp.net WebAPI和很快。 ***.com/questions/978061/http-get-with-request-body

以上是关于无法以 GET 类型的方法将字典作为参数传递给 WCF REST 服务的主要内容,如果未能解决你的问题,请参考以下文章

模型在使用 C# 将 POST 方法作为参数传递给 ASP.NET MVC 中同一控制器的 GET 方法时获取 NULL

将对象类型作为参数传递给方法?

将字典作为关键字参数传递给函数

将参数作为字典传递给 add_argument

如何将字典参数传递给web-api方法?

将大量参数传递给 Python 函数的方法