【问题标题】:pass multiple complex arguments in json post request to asp.net WebApi将json post请求中的多个复杂参数传递给asp.net WebApi
【发布时间】:2012-10-22 01:24:36
【问题描述】:

假设 ApiController 的动作具有多个参数:

[HttpPost]
public void AddAddress( Person person, Address address, int simple )

或者类似的东西。 现在我尝试发送内容类型为application/json 和json 的发布请求,如下所示:

{
  person: {...}, address: {..}, simple: 1
}

假设它是有效的 json ;)

或在这样的 json 数组中: [person, address, simple]

但 WebApi 无法识别这一点并告诉我它找不到操作,因为它不支持 json 请求中的多个参数。

我正在使用 HttpClient 从 C# 客户端执行此操作,我们希望使用 json 进行发布请求。我想使用 WebApi.Client 包,它为 HttpClient 提供了几个有用的扩展,但是我们有一个可移植的库项目(webapi 客户端不支持)。

我将如何支持此功能?

我尝试使用自定义 ActionFilter,但由于无法事先找到该操作,因此它永远无法运行。我尝试了不知道上下文和参数的 MediaTypeFormatter,还尝试了 ModelBinder,它似乎也只是基于每个参数,并不总是被执行。

谢谢!

【问题讨论】:

    标签: c# asp.net json post asp.net-web-api


    【解决方案1】:

    带有格式化程序的 ASP.NET Web API 中的内置参数绑定策略仅支持映射到请求正文的单个复杂参数。在您的情况下,您正在尝试映射至少两个复杂的参数。不扩展此基础架构的最简单解决方案是创建一个包含这些参数作为属性的新模型类

    public class AddressModel
    {
      public Person Person { get; set; }
      public Address Address { get; set; }
      public int Simple { get; set; }
    }
    

    并在您的控制器操作中使用该模型

    public void AddAddress( AddressModel model );
    

    【讨论】:

    • 这将是常见的解决方案,尽管在我们的特殊情况下,这意味着我们必须在运行时生成这个模型类(ApiController 在 DynamicAssembly 中)。我想我可以使用 JObject 或其他东西,但是我们会失去验证功能。所以我认为我们需要真正支持多个复杂的论点。
    • 如果是这种情况,您可能需要查看这篇关于如何扩展 Web API 以支持该行为的博文。 blogs.msdn.com/b/jmstall/archive/2012/04/18/…
    • 谢谢,我们决定为那些使用自定义模型作为单个参数的方法生成重载,因为另一种解决方案可能需要大量摆弄 json 序列化和其他东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 2015-11-14
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多