我们正在与 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 工作的选项有哪些?我可以想到以下几点:
- 使用委托(delegate)处理程序 Hook 请求,读取请求正文并将 [] 替换为点 (.)。然而,这至少让人觉得有些冒险
- 编写一个可与
[]
一起使用的自定义模型绑定(bind)器 - 希望能够以某种方式委托(delegate)给默认处理程序。不知道该怎么做 - 但很想听听一些想法。 - 只需在操作中使用一个
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/