为什么这个基本的ajax调用给了我一个400而没有向控制器开火?

为什么这个基本的ajax调用给了我一个400而没有向控制器开火?,ajax,asp.net-mvc,asp.net-core-2.0,Ajax,Asp.net Mvc,Asp.net Core 2.0,这只是我最新的dot net core 2 web应用程序中的一个问题,它在以前的dot net应用程序中可以正常工作 我有一个自定义javascript文件,其中包含指向我的站点所在的各种服务器的路径(主要是dev、test、live) 我的ajax调用如下所示: var gameid = '@Html.Raw(Model.Id)'; $.ajax({ type: 'GET', url: url() + "UserGames/HasGame?id=" +

这只是我最新的dot net core 2 web应用程序中的一个问题,它在以前的dot net应用程序中可以正常工作

我有一个自定义javascript文件,其中包含指向我的站点所在的各种服务器的路径(主要是dev、test、live)

我的ajax调用如下所示:

var gameid = '@Html.Raw(Model.Id)';
    $.ajax({
        type: 'GET',
        url: url() + "UserGames/HasGame?id=" +gameid,
        cache: false,
        success: function (data) {
            console.log(data);
        },
        error: function (req, status, err) {
            console.log('Something went wrong', status, err);
        }
    });
有问题的url()只是在测试时查看我的本地服务器(*请注意,此端口已被编辑,它是正确的):

错误没有触发,因为它甚至没有到达正在使用的控制器功能

我完全困惑于为什么这不起作用,我可以理解我是否得到了某种错误,但我在我所有的应用程序中都使用了ajax调用,直到使用core 2,我才发现这个问题

是否有任何可能影响ajax调用使用方式的变化

方法,但我提到了,它没有命中控制器(注意:该方法中确实有代码,它只是没有命中控制器)

[HttpGet]
[ValidateAntiForgeryToken]
公共异步任务HasGame(int id)
{
//这里的东西
}

您将收到400(错误请求)响应,因为框架期望
RequestVerificationToken
作为请求的一部分。框架使用它来防止可能的CSRF攻击。如果您的请求没有此信息,框架将返回400错误请求。您当前的代码没有发送它

您可以通过显式发送
RequestVerificationToken

表单标记帮助器自动创建一个名为attAttribute value
\uu RequestVerificationToken
的隐藏输入,并将该标记存储为隐藏输入的值

var token = $("[name='__RequestVerificationToken']").val();
var gameid = '@Html.Raw(Model.Id)';
$.ajax({
    type: 'GET',
    url: url() + "UserGames/HasGame?id=" +gameid,
    headers:{ "RequestVerificationToken": token },
    success: function (data) {
        console.log(data);
    },
    error: function (req, status, err) {
        console.log('Something went wrong', status, err);
    }
});
在上面的示例中,我们使用一些jQuery代码获取名为
\uu RequestVerificationToken
的输入元素并读取其值。一种更健壮的方法是将
IAntiforgery
实现注入视图,并使用
GetAndStoreTokens
方法

services.AddTransient<IHttpContextAccessor, HttpContextAccessor>();
我们将向视图注入
IHttpContextAccessor
。因此,请确保它与DI正确连接。将此行添加到启动类的ConfigureServices方法中

services.AddTransient<IHttpContextAccessor, HttpContextAccessor>();
现在,在稍后的js中,我可以在javascript代码中调用此方法,而不是使用jQuery来获取输入值

var token = "@GetAntiXsrfRequestToken()";
var gameid = '@Html.Raw(Model.Id)';
$.ajax({
    type: 'GET',
    url: url() + "UserGames/HasGame?id=" +gameid,
    headers:{ "RequestVerificationToken": token },
    success: function (data) {
        console.log(data);
    },
    error: function (req, status, err) {
        console.log('Something went wrong', status, err);
    }
});
只需从操作方法中删除
[ValidateAntiForgeryToken]
属性装饰,该操作方法不包括此检查


我建议您利用
[ValidateAntiForgeryToken]
方法。将令牌作为请求的一部分发送(第一种方法)

如果其他人遇到此问题,我会通过对呼叫和控制器执行以下操作来解决此问题:

type: 'GET',
url: '@Url.Action("HasGame", "UserGames")',
data: {id : gameid},
Core2中的控制器似乎根本不喜欢您声明[HttpGet],所以我也删除了它


感谢您提供的所有帮助。

您是否用[HttpGet]注释装饰了HasGame方法?是否希望共享操作方法。同时,你可以使用POST。。找到控制器,但传入的参数无效。您想到的是404,但找不到它。因此,要么你的问题列出了错误的状态代码,要么你是在寻找错误的树(服务器代码因其他原因失败)。请你进一步解释,我已经发布了所有相关代码,我在控制器上设置了一个断点,它似乎没有击中它。我明白你的意思,如果我遗漏了一些非常明显的东西,我也不会感到惊讶,但我似乎看不到它。
ValidateAntiForgeryToken
可能是问题所在,因为HttpGet通常不支持这一点。此属性用于修改动词,如Put/Delete/Post等。即使添加了标记,它仍然不会影响控制器操作。我在控制器上的任何其他操作都不会发送此消息(它们是表单提交而不是ajax请求),表单提交将自动发送此令牌,因为它是表单数据的一部分。在ajax调用中,您没有发送表单数据(序列化表单),而是使用查询字符串执行GET请求?你仍然得到400响应吗?是的,即使我从控制器中移除令牌,我仍然得到相同的问题,这就是为什么我不能真正找出什么是错误的。你有其他中间点返回400吗?
var token = "@GetAntiXsrfRequestToken()";
var gameid = '@Html.Raw(Model.Id)';
$.ajax({
    type: 'GET',
    url: url() + "UserGames/HasGame?id=" +gameid,
    headers:{ "RequestVerificationToken": token },
    success: function (data) {
        console.log(data);
    },
    error: function (req, status, err) {
        console.log('Something went wrong', status, err);
    }
});
type: 'GET',
url: '@Url.Action("HasGame", "UserGames")',
data: {id : gameid},