ASPNET CORE Ajax Post导致400错误请求

LMK*_*MKN 5 ajax post asp.net-core

我正在基于ASP.NET Core构建ASP.NET Zero。当我在其中一个页面上使用KendoUI Upload控件时,出现了严重的请求错误。经过大量研究和调查,我意识到HTTP POST Ajax请求失败,并出现400错误的请求错误。下面的代码示例在我测试的其他场景中有一些注释行。堆栈溢出中的现有帖子均未解决我的问题。我下面是我的ajax电话:

 $.ajax({
            url: "/test/TestCall",
            type: 'Post',
           /* data: JSON.stringify({ "Param1": "test" }),
            dataType:"json",
            processData: false,  */// tell jQuery not to process the data
            contentType: "application/json",  // tell jQuery not to set contentType
            success: function (result) {
                var res = result;
            },
            error: function (jqXHR) {
                var z = 3;
            },
            complete: function (jqXHR, status) {
                var x = 10;
            }
        });
Run Code Online (Sandbox Code Playgroud)

我的Controller代码是:我也尝试不从MyTestProjectControllerBase扩展而仅使用Controller基类。这没用。

public class TestController : MyTestProjectControllerBase
{
    public IActionResult Index()
    {
        return View();
    }

   [HttpPost]
    public ActionResult TestCall()
    {
        //return Content("Name is:" );
        return new ContentResult() { Content = "test" };
    }
}
Run Code Online (Sandbox Code Playgroud)

我想念什么?我尝试使用邮递员,但看到此附加信息“由于语法错误而无法满足请求”

在此问题上花费了8个小时之后,仍无法解决。不确定问题出在Asp.net核心还是asp.net零。任何指针将不胜感激。

在通过shyju检查注释之后进行更新:Startup.cs文件包含以下代码,该代码启用AntiForgeryTokenAttribute

 services.AddMvc(options =>
        {
            options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
        }).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
Run Code Online (Sandbox Code Playgroud)

根据shyju的回答更新ajax调用和视图:

  $("#backBtn").on("click", function (e) {
        var t = $("input[name='__RequestVerificationToken']").val();
        $.ajax({
            url: "/test/TestCall",
            type: 'Post',
           /* data: JSON.stringify({ "Param1": "test" }),
            dataType:"json",
            processData: false,  */
            contentType: "application/json",  
            headers: {
                "RequestVerificationToken": t
            },
            success: function (result) {
                var res = result;
            },
            error: function (jqXHR) {
                var z = 3;
            },
            complete: function (jqXHR, status) {
                var x = 10;
            }
        });
    });
Run Code Online (Sandbox Code Playgroud)

我的视图现在看起来像这样:删除了html的其余部分

<div id="container">
    @Html.AntiForgeryToken()
    <div class="k-edit-field label">Vendor Name</div>
</div
Run Code Online (Sandbox Code Playgroud)

Shy*_*yju 13

看起来您已AutoValidateAntiforgeryTokenAttribute全局应用过滤器。这意味着当调用 HTTP Post 操作方法时(正常或 ajax),框架将检查提交的请求数据,如果没有找到有效的防伪令牌(RequestVerificationToken标头),它将被视为错误请求和 400 响应将被送回。

要解决此问题,您可以显式读取__RequestVerificationToken隐藏输入的值(由表单标签助手生成)并将其发送到您的 ajax 请求标头中。

var t = $("input[name='__RequestVerificationToken']").val();

$.ajax({
    url: "/test/TestCall",
    type: 'Post',
    headers:
    {
        "RequestVerificationToken": t
    },
    success: function (result) {
        alert("Success");
        var res = result;
    },
    error: function (jqXHR) {
        var z = 3;
    },
    complete: function (jqXHR, status) {
        var x = 10;
    }
});
Run Code Online (Sandbox Code Playgroud)

您可以通过将IAntiforgery实现注入视图/页面并使用该GetAndStoreTokens方法来使代码更加健壮。

将此添加到您的视图中

@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf
@functions{
public string GetAntiXsrfRequestToken()
{
    return Xsrf.GetAndStoreTokens(Context).RequestToken;
}
}
Run Code Online (Sandbox Code Playgroud)

并调用此 GetAntiXsrfRequestToken 函数以获取 javascript 中的值(在视图文件中)

headers:
{
    "RequestVerificationToken": '@GetAntiXsrfRequestToken()'
},
Run Code Online (Sandbox Code Playgroud)