【问题标题】:ModelBinding: POST data (possibly from Ruby) in MVC4/C#ModelBinding:在 MVC4/C# 中发布数据(可能来自 Ruby)
【发布时间】:2013-06-25 05:51:17
【问题描述】:

我们正在与 chargify http://www.chargify.com 集成,我需要在我们的 MVC4/C# 服务器中处理来自 Chargify 的 webhook。 Chargify 以 (ruby) 方式发送 POST 数据 - 子对象用方括号分隔,如下所示:

POST /1ffaj2f1 HTTP/1.1
X-Chargify-Webhook-Signature: 526ccfd9677668674eaa6ba5d447e93a
X-Chargify-Webhook-Id: 11238622
User-Agent: Ruby
Host: requestb.in
Content-Type: application/x-www-form-urlencoded
Content-Length: 5159
Connection: close
Accept-Encoding: gzip, deflate
Accept: */*; q=0.5, application/xml

id=11238622&event=payment_success&payload[subscription][activated_at]=2013-05-22%2001%3A25%3A20%20-0400&payload[subscription][balance_in_cents]=0&...

问题在于,在 .NET 方面,默认模型绑定器不喜欢方括号[ ],而是希望子对象以点符号分隔,例如 a.b.c.d=value

我有哪些选择可以使模型绑定器工作?我可以想到以下几点:

  1. 使用委托处理程序挂钩请求,读取请求正文并将 [] 替换为点 (.)。然而,这至少让人觉得有点冒险
  2. 编写一个可与​​[] 一起使用的自定义模型绑定器 - 希望能够以某种方式委托给默认处理程序。不知道该怎么做 - 但很想听听一些想法。
  3. 只需在操作中使用formcollection 参数。处理表单集合键以基于键形成递归字典。这也意味着我必须在整个过程中处理字符串(日期、ID 等)

什么是最好的方法,我该怎么做。

【问题讨论】:

  • U hv 列出了阅读您的问题后想到的所有 3 种可能的方法。支持你的问题:-) 如果你能实现的话,你提到的选项 2 是最好的方法......

标签: c# asp.net-mvc-4 http-post model-binding


【解决方案1】:

所以我想我终于用Request.Filter属性(msdn)解决了这个问题

还要注意 - MVC 中没有委托处理程序 - 那是 WebApi 的东西(其中一些东西只是为了让你误入歧途!)

基本上,在 Stream 上编写了一个装饰器,它读取输入流,用点替换方括号,然后将其存储在另一个流中。 在 Application_BeginRequest 中有一个检查,查看输入请求是否针对“正确”控制器,如果是,则创建一个装饰器实例并将其设置为 Request.Filter。

代码here。随意分叉:)

[更新 - 2013.08.19]: 正如下面在 cmets 中 @benpage 所指出的,我们还需要原始未修改的流来进行 SHA256 验证。 我最终从装饰器中暴露了未修改的流内容并向下转换控制器中的Request.InputStream 属性以获取未修改的内容以进行签名验证。

【讨论】:

  • 我喜欢这个答案——除了它改变了输入流并且你不能再根据请求发送的 sha256 哈希来验证它(除非你把它转换回来)
  • @benpage - SHA 检查的要点。我可能需要回去检查一下。
  • FWIW - 我使用了你的代码(谢谢!),但 SHA 也检查了它 - 要么返回你修改的文档内容,要么返回一个字符串(“错误”) - 然后我检查了我的授权属性中输入流中的字符串。如果它找到了,我只是返回一个 httpnotfoundresult。
  • 我已经尝试了您的分辨率以及类似于您的第三个选项的方法...循环表单集合键并正确格式化它们,然后调用 TryUpdateModel (我已经阅读了几个地方虽然这不支持嵌套对象)。两种实现都将绑定 id 和 event_type 属性,但不会绑定有效负载的嵌套对象。站点和订阅都为空。我正在使用 Postman 复制 chargify webhook 帖子,所以我知道网站和订阅 kvp 中确实有数据。你遇到过这个问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
相关资源
最近更新 更多