5

我们正在与 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 等)

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

4

1 回答 1

3

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

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

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

代码在这里。随意分叉:)

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

于 2013-06-26T16:34:09.483 回答