Fetch API调用会导致新的Asp.net会话

我正在我的一个asp.net mvc项目中删除jQuery,转而使用直接的vanilla JS。 现在我已经用Fetch API调用替换了$.ajax POST调用,每次调用都会触发服务器上的新会话。

在过去的几天里,这一直在推动我的发展,我已经将其缩小到专门从使用jQuery Ajax到Fetch API的转变。 我的新Fetch API调用工作正常,仍然执行所需的服务器端工作。 一旦他们返回,它就会触发一个新的服务器会话。

显然,这是一个主要问题,因为我的用户会话数据不断重置。 知道为什么会这样吗? 或者任何人都知道任何变通方法,而不必恢复使用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; } 

在我的Global.asax.cs

 protected void Session_Start(object o, EventArgs e) { Debug.WriteLine("Session_Start"); HttpContext.Current.Session.Add("__MySessionData", new MySessionDataClass()); } 

正如我上面提到的,除了重置我的会话之外,Fetch API调用完全正常,我从Debug.WriteLine调用中知道。 jQuery Ajax调用也可以很好地工作,并且不会触发新的会话,但是我试图删除我对jQuery的依赖。

思考?

您没有使用自定义请求传递ASP.NET_SessionId cookie。

你正在使用fetch 。 默认情况下,它使用omit credentials 。 这意味着,如MDN页面上所述:

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

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

如果您调用的URL与您的调用脚本位于同一域中,则AJAX调用仅发送Cookie。
资源

要解决此问题,您需要告诉fetch发送cookie。 从这篇文章 :

 fetch('/something', { credentials: 'same-origin' }) // or 'include' 

在@ gunr2171的帮助下找出了问题,所以如果其他人遇到类似的问题,请自我回答。

事实certificate我的新Fetch API调用没有随请求发送当前的Asp.net会话cookie,因此服务器会启动一个新会话,认为还没有存在。 调整Fetch API调用以包含credentials: 'include'选项中的credentials: '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; }