提问人:user464291 提问时间:9/9/2023 更新时间:9/12/2023 访问量:47
从 apsx 到代码隐藏的 Ajax 调用导致 500 错误 - 反向链接策略:.net 中的 strict-origin-when-cross-origin
Ajax call from apsx to code behind causes 500 error - Referrer Policy: strict-origin-when-cross-origin in .net
问:
我想在代码隐藏中设置一个会话变量,以便在收到基于该结果的ajax调用结果后设置一个会话变量。
这个应用程序是旧的网络表单,不是MVC 这是我所做的 下面是我的Test.aspx
<asp:Button ID="cmdTest" runat="server" Text="Set session value"
OnClientClick="mytest();return false"/>
<Script>
function myTest() {
console.log("Document is ready.");
$.ajax({
type: "POST",
url: "CheckBrowser.aspx/SetSessionVariable",
data: JSON.stringify({ value: 'true' }),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (response) {
// Handle the server's response (if needed)
console.log("success");
},
error: function (error) {
console.log("AJAX Error: " + error);
}
});
}
</script>
这是我的 Test.aspx.cs 代码
[WebMethod(enableSession: true)]
public static void SetSessionVariable(string value)
{
HttpContext.Current.Session["myTest"] = value;
Debug.Print("session value set");
}
但是我得到请求 URL:localhost:44310/Support/Test.aspx/SetSessionVariable 请求方法:POST 状态代码:500 远程地址:[::1]:44310 引用策略:严格源-当-跨源 参见网络传输的吹图像 这很奇怪,因为我的来源是相同的,我只是从我的 aspx 页面执行 ajax 调用以在相同的 aspx 代码中设置变量。我不确定我错过了什么,任何帮助将不胜感激。
答:
我建议你发布更多的标记。
因此,让我们创建一个示例网页。我们将其称为 CheckBrowser.aspx。
我们的标记现在是这样的:
<form id="form1" runat="server">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js">
</script>
<div>
<input id="Button1" type="button" value="Set session value"
onclick="SetValue();return false;" />
<br />
<input id="Button2" type="button" value="get session value"
onclick="GetValue();return false;" />
<script>
function SetValue() {
$.ajax({
type: "POST",
url: "CheckBrowser.aspx/SetSessionVariable",
data: JSON.stringify({ value: 'Hello World' }),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (response) {
// Handle the server's response (if needed)
console.log("success");
alert("Session value set")
},
error: function (error) {
console.log("AJAX Error: " + error);
}
});
}
function GetValue() {
$.ajax({
type: "POST",
url: "CheckBrowser.aspx/GetSessionVariable",
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (response) {
// Handle the server's response (if needed)
alert("Session value from server = " + response.d)
console.log("success");
},
error: function (error) {
console.log("AJAX Error: " + error);
}
});
}
</script>
</div>
</form>
因此,请注意我们如何包含jQuery库。(这是必需的)。
因此,当我们运行上述操作时,我们得到/看到以下内容:
因此,使用发布的代码,上述内容就可以正常工作。
这意味着您提供的信息不足以确定上述代码工作的原因,而您的代码则不工作。
如前所述,我会尝试按 f12 获取浏览器工具,选择控制台,然后查看浏览器开发人员模式显示的内容。
请注意,我会考虑创建一个新的测试浏览器页面,更改ajax post示例中使用的URL,看看这是否有效。
换句话说,我们这里的读者和人们无法重现您的错误。因此,您必须提供更多的页面标记,因为上面的示例工作得很好。
对于这个测试,我还建议使用 HTML 按钮,而不是 asp.net 按钮,因为在大多数情况下,JavaScript 代码中的任何错误都会导致页面回发,并且这会隐藏您查看错误消息的能力。使用上面带有 return false 的 HTML 按钮不会导致页面回发,这应该允许您查看您拥有的任何 JavaScript 代码中的错误。
如前所述,如果您的站点打开了友好的 URL,这是非常重要的信息,因为这通常会阻止简单的 ajax 调用工作。
如果使用友好 URL,则需要打开 RouteConfig.cs,并将 AutoRedirectMode = off。就是这行代码:
settings.AutoRedirectMode = RedirectMode.Off;
谢谢你上面的所有解释,今天我弄清楚了为什么会这样。这是因为我在 Protected 后面的代码中创建了 SetSessionVariable 方法。它应该是公开的。这很有趣。正如我所想的,aspx中的js应该可以访问aspx.cs保护的方法。我想我可以结束这个问题。感谢您的跟进
评论