部署在IIS的ASP.NET Core Razor Pages应用为何跨设备共享变量?
问题原因及解决办法
1. 静态变量导致全局共享
你在orderformModel里定义的firstname是静态变量(带static修饰),静态变量属于类本身,不是类的实例对象。在ASP.NET Core应用中,同一个应用进程内的所有请求都会共享这个静态变量——不管是哪个用户、哪个设备的请求,读写的都是同一个值,所以不同设备会看到相同的姓名。
2. Session无效的可能原因
你说用Session也没用,大概率是Session没正确配置或使用:
- 没在
Program.cs中注册Session服务和添加中间件:ASP.NET Core默认不启用Session,必须手动配置。 - 存储或读取Session时出错:比如键名写错,或者没从当前请求的Session中取值。
正确实现方式
方式一:用Session存储用户专属数据
第一步:配置Session
在Program.cs中添加Session相关配置:
var builder = WebApplication.CreateBuilder(args); // 注册Session服务 builder.Services.AddSession(options => { options.IdleTimeout = TimeSpan.FromMinutes(30); // 设置Session超时时间 options.Cookie.HttpOnly = true; options.Cookie.IsEssential = true; }); // 注册IHttpContextAccessor(用于在视图中获取Session) builder.Services.AddHttpContextAccessor(); builder.Services.AddRazorPages(); var app = builder.Build(); if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); // 添加Session中间件(必须放在UseRouting之后、UseAuthorization之前) app.UseSession(); app.MapRazorPages(); app.Run();
第二步:修改orderform.cshtml.cs存储数据到Session
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; namespace mysite.Pages { public class orderformModel : PageModel { public void OnGet() { } public async Task<IActionResult> OnPostUpdateAsync(string firstnamein) { // 将姓名存入当前用户的Session HttpContext.Session.SetString("Firstname", firstnamein); return Content("OK"); } } }
第三步:修改orderview.cshtml从Session读取数据
@page @using Microsoft.AspNetCore.Http @inject IHttpContextAccessor HttpContextAccessor @{ Layout = "_PlainLayout"; // 从Session读取姓名,没有则显示Guest var firstname = HttpContextAccessor.HttpContext.Session.GetString("Firstname") ?? "Guest"; } <div> Hello @firstname </div>
方式二:用TempData传递一次性数据
如果只是在提交orderform后跳转展示数据,TempData更适合(数据仅保留到下一次请求):
修改orderform.cshtml.cs
public async Task<IActionResult> OnPostUpdateAsync(string firstnamein) { TempData["Firstname"] = firstnamein; return Content("OK"); }
修改orderview.cshtml
@page @{ Layout = "_PlainLayout"; var firstname = TempData["Firstname"] ?? "Guest"; } <div> Hello @firstname </div>
内容的提问来源于stack exchange,提问作者treigh55
相关产品推荐
相关产品推荐

