如何在ASP.NET Core中发布JSON有效负载时解决“错误请求(400)”错误?

时间:2019-05-15 12:13:30

标签: c# http asp.net-core

我正在开发一个实现命名处理程序方法的剃刀页面。我将一些JSON编码的数据发布到命名的处理程序方法中。但是,我得到了400错误的请求响应。

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

以下是我的方法的一个小缺点:

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

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

这是一个示例请求:

The sent HTTP request

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

我想念什么?

2 个答案:

答案 0 :(得分: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());
        });

答案 1 :(得分:0)

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

他还建议使用Controller而不是Razor页面。

编辑

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

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