从 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

提问人:user464291 提问时间:9/9/2023 更新时间:9/12/2023 访问量:47

问:

我想在代码隐藏中设置一个会话变量,以便在收到基于该结果的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 代码中设置变量。enter image description here我不确定我错过了什么,任何帮助将不胜感激。

C# asp.net Ajax 跨站点

评论

1赞 Vivekanand Vishvkarma 9/9/2023
请检查 ajax 内部的 url:将 CheckBrowser.aspx 替换为 Test.aspx
0赞 Albert D. Kallal 9/10/2023
我同意上述评论。您键入的错误消息显示 Test.aspx,然后屏幕帽显示不同的内容?(CheckBrowser.aspx)。那么,您用于此示例代码的页面名称是什么?我的意思是,如果您没有意识到ajax调用中的URL必须与此示例测试用例的当前页面匹配,那么我们真的会遇到麻烦,对吧?????
0赞 user464291 9/10/2023
不,它是CheckBrowser.aspx。我的意思是页面名称是CheckBrowser.aspx而不是test.aspx。很抱歉造成混淆。
0赞 Albert D. Kallal 9/10/2023
您必须发布此页面的更多标记。事实上,发布所有这些。您的任何 Web 方法是否在任何时间点都工作过,或者它们都坏了,从未工作过,包括此测试代码?当您尝试运行此代码时,浏览器控制台会显示什么?(F12 将打开浏览器工具)。jQuery是否已安装并正常工作?

答:

0赞 Albert D. Kallal 9/11/2023 #1

我建议你发布更多的标记。

因此,让我们创建一个示例网页。我们将其称为 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库。(这是必需的)。

因此,当我们运行上述操作时,我们得到/看到以下内容:

enter image description here

因此,使用发布的代码,上述内容就可以正常工作。

这意味着您提供的信息不足以确定上述代码工作的原因,而您的代码则不工作。

如前所述,我会尝试按 f12 获取浏览器工具,选择控制台,然后查看浏览器开发人员模式显示的内容。

请注意,我会考虑创建一个新的测试浏览器页面,更改ajax post示例中使用的URL,看看这是否有效。

换句话说,我们这里的读者和人们无法重现您的错误。因此,您必须提供更多的页面标记,因为上面的示例工作得很好。

对于这个测试,我还建议使用 HTML 按钮,而不是 asp.net 按钮,因为在大多数情况下,JavaScript 代码中的任何错误都会导致页面回发,并且这会隐藏您查看错误消息的能力。使用上面带有 return false 的 HTML 按钮不会导致页面回发,这应该允许您查看您拥有的任何 JavaScript 代码中的错误。

如前所述,如果您的站点打开了友好的 URL,这是非常重要的信息,因为这通常会阻止简单的 ajax 调用工作。

如果使用友好 URL,则需要打开 RouteConfig.cs,并将 AutoRedirectMode = off。就是这行代码:

settings.AutoRedirectMode = RedirectMode.Off;
0赞 user464291 9/12/2023 #2

谢谢你上面的所有解释,今天我弄清楚了为什么会这样。这是因为我在 Protected 后面的代码中创建了 SetSessionVariable 方法。它应该是公开的。这很有趣。正如我所想的,aspx中的js应该可以访问aspx.cs保护的方法。我想我可以结束这个问题。感谢您的跟进