5

chargify http://www.chargify.comと統合しており、MVC4/C# サーバーで Chargify からの Webhook を処理する必要があります。Chargify は (ルビー) の方法で 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. 委任ハンドラーでリクエストにフックし、req ボディを読み取り、[] をドット (.) に置き換えます。ただし、これは少なくとも危険に感じます
  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 に答える