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; }