我们正在与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
我有什么选择让模型绑定器工作?我能想到以下几点:
[]
一起使用的自定义模型绑定器 - 希望能够以某种方式委托给默认处理程序。不知道如何解决这个问题 - 但很想听到一些想法。formcollection
param。处理表单集合键以基于键形成递归字典。这也意味着我必须处理整个字符串(日期,ids等)什么是最好的方式,我该怎么做。
答案 0 :(得分:3)
所以我认为我最终使用Request.Filter
属性(msdn)
另外要注意 - MVC中没有委托处理程序 - 这是WebApi的东西(其中一些东西只是为了让你误入歧途!)
基本上,在Stream上写了一个装饰器来读取输入流,用点替换方括号,然后将其存储在另一个流中。 在Application_BeginRequest中检查是否输入请求是否为“正确”控制器,如果是,则创建装饰器实例并将其设置为Request.Filter。
代码here。随意分叉:)
[更新 - 2013.08.19]:正如评论中@benpage所述,我们还需要原始的未经修改的SHA256验证流。
我最终从装饰器中暴露了未修改的流内容,并向下转换控制器中的Request.InputStream
属性,以获得未修改的内容以进行签名验证。