C# ModelBinding:在MVC4/C中发布数据(可能来自Ruby)#

C# ModelBinding:在MVC4/C中发布数据(可能来自Ruby)#,c#,asp.net-mvc-4,http-post,model-binding,C#,Asp.net Mvc 4,Http Post,Model Binding,我们正在与chargify集成,我需要在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 Cont

我们正在与chargify集成,我需要在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

我可以选择哪些选项使模型活页夹工作?我可以想到以下几点:

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

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

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

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

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

    代码。随便说:)

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

    U hv列出了阅读您的问题后想到的所有3种可能的方法。向上投票你的问题:-)你提到的选项2是最好的方法,如果你能实现…我喜欢这个答案-除了它改变了输入流,你不能再根据请求发送的sha256散列验证它(除非你把它转换回来)@benpage-关于SHA检查的好点。我可能需要返回并检查。FWIW-我使用了您的代码(谢谢!),但是SHA也检查了它-或者返回了您修改的DocumentContent,或者返回了一个字符串(“错误”)-然后我在我的授权属性的inputstream中检查了该字符串。如果它找到了,我只是返回一个httpnotfoundresult。我已经尝试了你的解决方案以及类似于你的第三个选项的东西。。。循环遍历表单集合键并正确设置它们的格式,然后调用TryUpdateModel(我已经读到一些地方,这不支持嵌套对象)。这两个实现都将绑定id和event_type属性,但都不会绑定有效负载的嵌套对象。站点和订阅都为空。我正在使用Postman复制chargify webhook帖子,因此我知道站点和订阅kvp中确实存在数据。你遇到这个问题了吗?