c# - 模型绑定(bind) : POST data (possibly from Ruby) in MVC4/C#

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

我们正在与 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 方面,默认模型绑定(bind)器不喜欢方括号[ ] 而是期望子对象以点分符号分隔像 a.b.c.d=value

使模型 Binder 工作的选项有哪些?我可以想到以下几点:

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

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

最佳答案

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

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

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

代码 here .随意 fork :)

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

关于c# - 模型绑定(bind) : POST data (possibly from Ruby) in MVC4/C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17290035/

相关文章:

c# - 我可以合并 ASP.Net VB 和 ASP.Net C#吗

javascript - 当我调用 ajax 时,我的全部内容都加载到该 div 中

asp.net-mvc - 为什么这两个 API 方法会产生冲突

javascript - Angular js $http post 不起作用

c# - 在 C# 中创建结构的浅拷贝

c# - 使用 Linq to Entity 删除多行的有效方法?

c# - 提示用户许可 - facebook 开发人员工具包

android - TwitterApiClient : what is Callback signature for POST?

android - 验证登录屏幕的 GET JSON 响应并转到主屏幕

c# - 在 LINQ 中使用 IN 运算符