【问题标题】:How to fix 'Bad Request (400)' error when POSTing JSON payload in ASP.NET Core?在 ASP.NET Core 中发布 JSON 有效负载时如何修复“错误请求 (400)”错误?
【发布时间】:2019-05-16 13:39:14
【问题描述】:

我正在开发一个实现命名处理程序方法的剃须刀页面。我将一些 JSON 编码数据发布到命名的处理程序方法。但是,我收到了 400 bad request response 作为响应。

到目前为止,我已经尝试过使用不同的 JSON 有效负载和不同的方法签名,但可惜没有任何效果。

这是我的方法的一个冷落:

        [HttpPost]
        public IActionResult OnPostContextFreeGrammarPartial() {
            var grammarModel = new ContextFreeGrammarModel();

            return new PartialViewResult() {
                ViewName = "_ContextFreeGrammar",
                ViewData = new ViewDataDictionary<ContextFreeGrammarModel>(ViewData, grammarModel)
            };
        }

这是一个示例请求:

我希望处理程序方法能够成功执行,但服务器或浏览器只是在方法开始执行之前抛出 400 响应。

我错过了什么?

【问题讨论】:

  • 我正在将有效负载传递给 OnPostContextFreeGrammar,但我不知道 ASP.NET Core 方法是否可以在忽略有效负载的情况下执行。 grammarModel 也不为空。
  • Razor 页面不打算像 API 那样处理 JSON 请求。您可能可以让它工作,但这需要不成比例的努力。当涉及到这样的事情时,你最好使用控制器。也就是说,如果我不得不猜测一下,我会说防伪验证已经生效,而且您似乎没有传递令牌。这将始终导致 400。请参阅:docs.microsoft.com/en-us/aspnet/core/security/…
  • 感谢您的评论。这就是解决方案。我必须将防伪令牌添加到请求标头中。我将研究使用控制器而不是剃须刀页面。

标签: c# http asp.net-core


【解决方案1】:

您应该将数据传递给 OnPostContextFreeGrammarPartial,我认为 grammarModel 为空!试试这个我觉得很有帮助here

    [HttpPost]
[AutoValidateAntiforgeryToken]
        public IActionResult OnPostContextFreeGrammarPartial([FromBody]ContextFreeGrammarModel item) 
        {
            var grammarModel = new ContextFreeGrammarModel();

            return new PartialViewResult() {
                ViewName = "_ContextFreeGrammar",
                ViewData = new ViewDataDictionary<ContextFreeGrammarModel>(ViewData, grammarModel)
            };
        }

还有在 startup.cs 中:

services.AddMvc(options =>
        {
            options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
        });

【讨论】:

    【解决方案2】:

    Chris Pratt's comment 解释了这个问题。请求标头中缺少防伪令牌 - 这是 Razor 页面上的发布请求所必需的。

    他还建议使用控制器而不是 Razor 页面。

    编辑

    在启动期间向服务添加IgnoreAntiforgeryToken 过滤器也解决了该问题。

                services.AddMvc()
                    .AddRazorPagesOptions(options => {
                        options.Conventions.ConfigureFilter(new IgnoreAntiforgeryTokenAttribute());
                    }).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    

    【讨论】:

      猜你喜欢
      • 2018-10-14
      • 2018-10-08
      • 2020-11-15
      • 1970-01-01
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      • 2016-10-19
      • 1970-01-01
      相关资源
      最近更新 更多