如何在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
相关产品推荐
相关产品推荐

