4

ASP.NET MVC 3 でアクションを設定して、Mercurial Webhook リクエストのペイロードを処理しようとしています。この場合、 Kiln によって生成されます。

ペイロードは JSON ですが、残念ながら content type の URL エンコードされたフォーム値として送信されます。これは、パラメータ名なしでエンコードされていないものapplication/x-www-form-urlencodedを使用application/jsonして送信すると、あまりにも簡単で標準的なものになるためです。

これは、標準のコンテンツ タイプJsonValueProviderFactoryを使用する要求しか取得しないため、新しいものだけを使用できないことを意味します。そしてもちろん、JSON ではなく実際にフォーム データを受け取るアプリ内の他の場所でフォーム データ値プロバイダーを使用するために、これらのリクエストが必要なためapplication/json、ファクトリにリクエストをピックアップさせることはできません。application/x-www-form-urlencoded

では、ValueProvider または ValueProviderFactory を特定のアクションまたはルートにのみ使用するように指定する方法はありますか?

4

2 に答える 2

3

これらの Webhook リクエストを処理する特定のコントローラーを作成すると、コントローラーをインスタンス化するときに一意の ValueProvider を割り当てることができます。

public class KilnController : Controller
{

    public KilnController()
    {
        this.ValueProvider = MyCustomValueProvider;
    }

    ...
}

これにより、これらのリクエストに対するカスタム ValueProvider のニーズが満たされるはずです。

于 2011-06-17T18:36:15.180 に答える
1

それIValueProviderは私が探していた特定の拡張性ではなかったことが判明しました.James Hughesの好意でIModelBinder見つけた簡単な実装を使用する必要がありました。フォームから何かを引き出すことをカバーするには、少し調整が必要でした。

public class JsonFormModelBinder : IModelBinder
{
    #region [ ModelBinder Members ]

    Object IModelBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        HttpRequestBase request = controllerContext.HttpContext.Request;
        var jsonStringData = request.Form[bindingContext.ModelName];
        if (jsonStringData != null) return JsonConvert.DeserializeObject(jsonStringData, bindingContext.ModelType);
        else return null;
    }

    #endregion
}

そして使用法:

    [HttpPost]        
    public ActionResult WebHook([ModelBinder(typeof(JsonFormModelBinder))] WebHookMessage payload)
    {
        return Content("OK");
    }
于 2011-06-17T18:27:21.030 に答える