You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JavaScript中调用C#全局变量与全局方法?

问题解答

1. 在JavaScript中获取Session里的GlobalVariables变量

ASP.NET WebForms中服务器端Session无法直接被前端JS访问,需通过服务器端代码将变量注入到前端,以下是两种可行方案:

方案1:在ASPX页面直接输出变量

在Page1.aspx的<script>标签内,使用<%= %>语法读取Session中的GlobalVariables属性,同时注意处理字符串转义避免XSS风险:

<script type="text/javascript">
    // 从Session注入核心变量
    var loginTokenExpiresIn = <%= ((GlobalVariables)Session["objGlobalVariableClass"])?.login_token_expires_in ?? 0 %>;
    var loginUserName = '<%= HttpUtility.JavaScriptStringEncode(((GlobalVariables)Session["objGlobalVariableClass"])?.login_user_name ?? "") %>';
    var loginRefreshToken = '<%= HttpUtility.JavaScriptStringEncode(((GlobalVariables)Session["objGlobalVariableClass"])?.login_refresh_token ?? "") %>';
    // 登录时间需在登录成功时存入Session,此处读取
    var loginTimestamp = <%= ((DateTime)Session["loginTimestamp"]).Ticks %>;

    var idleSecondsTimer = setInterval(CheckIdleTime, 1000);
    
    function CheckIdleTime() {
        // 计算已过时长(.NET Ticks转毫秒)
        var currentTime = new Date().getTime();
        var elapsedTime = currentTime - (loginTimestamp / 10000);
        // 剩余过期时间
        var remainingTime = loginTokenExpiresIn - elapsedTime;
        
        // 判断是否将在5分钟(300000毫秒)内过期
        if (remainingTime <= 300000 && remainingTime > 0) {
            refreshLoginToken();
        }
    }
</script>

登录成功时需补充存入登录时间:Session["loginTimestamp"] = DateTime.Now;

方案2:服务器端注册脚本

在Page1.aspx.cs的Page_Load方法中,将变量封装为脚本注册到前端:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        var globalVars = Session["objGlobalVariableClass"] as GlobalVariables;
        if (globalVars != null)
        {
            var script = $@"
                var loginTokenExpiresIn = {globalVars.login_token_expires_in};
                var loginUserName = '{HttpUtility.JavaScriptStringEncode(globalVars.login_user_name)}';
                var loginRefreshToken = '{HttpUtility.JavaScriptStringEncode(globalVars.login_refresh_token)}';
                var loginTimestamp = {DateTime.Now.Ticks};
            ";
            ClientScript.RegisterStartupScript(this.GetType(), "GlobalVars", script, true);
        }
    }
}

2. 在JavaScript中调用GlobalFunctions的GetLoginTokenWithRefreshToken方法

后端方法GetLoginTokenWithRefreshToken为private,无法直接被JS调用,需改造为可通过AJAX访问的接口:

步骤1:改造后端方法,暴露为WebMethod

首先将GlobalFunctions中的方法改为public,然后在Page1.aspx.cs中封装静态WebMethod(启用Session访问):

using System.Web.Services;

public partial class Page1 : System.Web.UI.Page
{
    [WebMethod(EnableSession = true)]
    public static bool RefreshLoginToken(string username, string refreshToken)
    {
        var globalVars = HttpContext.Current.Session["objGlobalVariableClass"] as GlobalVariables;
        if (globalVars == null) return false;
        
        var globalFunctions = new GlobalFunctions();
        return globalFunctions.GetLoginTokenWithRefreshToken(username, refreshToken);
    }
}

// 修改GlobalFunctions的方法访问修饰符
public class GlobalFunctions
{
    public bool GetLoginTokenWithRefreshToken(string username, string refresh_token)
    {
        // 原方法逻辑保持不变
    }
}

步骤2:前端通过AJAX调用WebMethod

使用jQuery(需提前引入)或原生XMLHttpRequest发起请求:

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script type="text/javascript">
    // ... 之前的变量定义和CheckIdleTime方法 ...
    
    function refreshLoginToken() {
        // 避免重复触发
        clearInterval(idleSecondsTimer);
        
        $.ajax({
            type: "POST",
            url: "Page1.aspx/RefreshLoginToken",
            data: JSON.stringify({
                username: loginUserName,
                refreshToken: loginRefreshToken
            }),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(res) {
                if (res.d) {
                    // 刷新成功后更新前端变量(建议通过接口返回新的过期时间,此处简化为重新读取)
                    loginTokenExpiresIn = <%= ((GlobalVariables)Session["objGlobalVariableClass"])?.login_token_expires_in ?? 0 %>;
                    loginTimestamp = new Date().getTime();
                } else {
                    // 刷新失败跳转登录页
                    window.location.href = "Login.aspx";
                }
                // 重启定时器
                idleSecondsTimer = setInterval(CheckIdleTime, 1000);
            },
            error: function() {
                window.location.href = "Login.aspx";
            }
        });
    }
</script>

关键注意点

  • WebMethod必须标记EnableSession = true才能访问Session;
  • 使用HttpUtility.JavaScriptStringEncode处理字符串,避免XSS攻击;
  • 刷新令牌后建议通过AJAX返回值传递新的过期时间,减少服务器端重复读取。

内容的提问来源于stack exchange,提问作者user16694658

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 06:05:23