Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 获取API调用导致新的Asp.net会话_Javascript_C#_Jquery_Asp.net Mvc_Fetch Api - Fatal编程技术网

Javascript 获取API调用导致新的Asp.net会话

Javascript 获取API调用导致新的Asp.net会话,javascript,c#,jquery,asp.net-mvc,fetch-api,Javascript,C#,Jquery,Asp.net Mvc,Fetch Api,我正在我的一个asp.NETMVC项目中删除jQuery,以支持使用纯香草JS。现在,我已经将$.ajaxPOST调用替换为fetchapi调用,每个调用都会触发服务器上的新会话 在过去的几天里,这一直让我很恼火,我把它缩小到了使用jqueryajax获取API的范围。我的新fetchapi调用在其他情况下工作得非常好,仍然执行所需的服务器端工作。服务器返回后,只需触发一个新的服务器会话 显然,这是一个主要问题,因为我的用户会话数据不断被重置。你知道为什么会这样吗?或者有人知道任何解决方法,但不

我正在我的一个asp.NETMVC项目中删除jQuery,以支持使用纯香草JS。现在,我已经将
$.ajax
POST调用替换为fetchapi调用,每个调用都会触发服务器上的新会话

在过去的几天里,这一直让我很恼火,我把它缩小到了使用jqueryajax获取API的范围。我的新fetchapi调用在其他情况下工作得非常好,仍然执行所需的服务器端工作。服务器返回后,只需触发一个新的服务器会话

显然,这是一个主要问题,因为我的用户会话数据不断被重置。你知道为什么会这样吗?或者有人知道任何解决方法,但不必恢复使用jQuery

我以前的基于jQuery的POST调用:

Post(route, data) {
    $.ajax({
        type: 'POST',
        url: route,
        data: JSON.stringify(data),
        contentType: "application/json; charset=utf-8"
    }).done((result, statusText, jqXHR) => {
        return result;
    });
}
我新的基于“Fetch API”的调用:

async Post(route, data) {
    let response = await fetch(route, {
        method: 'POST',
        headers: {
            'Accept': 'application/json',
            'Content-type': 'application/json'
        },
        body: JSON.stringify(data)
    });
    let result = await response.json();
    return result;
}
在my
Global.asax.cs
中:

protected void Session_Start(object o, EventArgs e) {
    Debug.WriteLine("Session_Start");
    HttpContext.Current.Session.Add("__MySessionData", new MySessionDataClass());
}
正如我前面提到的,fetchapi调用除了重置会话之外工作得非常好,这是我从
Debug.WriteLine
调用中了解到的。jqueryajax调用也可以很好地工作,并且不会触发新会话,但是我正在尝试删除对jQuery的依赖


想法?

在@gunr217的帮助下解决了这个问题,因此,如果其他人遇到类似问题,请自行回答

结果表明,我的新Fetch API调用没有随请求发送当前Asp.net会话cookie,因此服务器会启动一个新会话,认为该会话还不存在。调整Fetch API调用以在选项中包含
凭据:“include”
,允许它发送当前会话cookie,并且服务器将不再在每次调用后创建新的会话cookie

作为参考,我的新Fetch API调用现在如下所示:

async Post(route, data) {
    let response = await fetch(route, {
        method: 'POST',
        headers: {
            'Accept': 'application/json',
            'Content-type': 'application/json'
        },
        credentials: 'include',
        body: JSON.stringify(data)
    });
    let result = await response.json();
    return result;
}

您没有将
ASP.NET\u SessionId
cookie与您的自定义请求一起传递

您正在使用。它对
凭证使用
省略
。这意味着,如MDN页面所述:

默认情况下,
fetch
不会从服务器发送或接收任何cookies,如果站点依赖于维护用户会话,则会导致未经验证的请求(要发送cookies,必须设置credentials init选项)

JQuery确实发送cookie,但只发送同一域上的cookie

AJAX调用仅在您调用的url与调用脚本位于同一域时发送cookie。

要解决此问题,您需要告诉
fetch
发送cookie。发件人:


发送到服务器的cookie在这两种情况下是否有所不同?@gunr217问得好。我没想到要检查一下。Asp.net会话cookie似乎是通过jQuery Ajax调用发送的,但它不是通过Fetch API调用发送的。也许我必须调整Fetch API调用以同时发送会话cookie…@gunr2171我刚刚调整Fetch API调用以添加
凭据:“在选项中包括”
,因此它现在发送会话cookie,这解决了问题。如果你想回答这个问题,我会接受的。否则,我可以自己回答这个问题。
fetch('/something', { credentials: 'same-origin' }) // or 'include'