如何在本地搭建分属不同应用池的Web应用并演示跨子域Cookie共享
一、前置准备
- 安装IIS并启用ASP.NET 4.0相关功能
- 修改本地
hosts文件(路径:C:\Windows\System32\drivers\etc\hosts),添加两行配置:
保存后执行命令127.0.0.1 a.localhost 127.0.0.1 b.localhostipconfig /flushdns刷新DNS
二、创建独立IIS应用池
- 打开IIS管理器,左侧导航栏展开服务器节点,右键点击「应用池」→「添加应用池」
- 创建第一个应用池:
- 名称:
AppPoolA - .NET CLR版本:选择
.NET Framework v4.0.30319 - 托管管道模式:
集成 - 点击「确定」
- 名称:
- 重复上述步骤创建第二个应用池,名称设为
AppPoolB,配置与AppPoolA完全一致
三、准备演示Web应用(基于HttpCookieCollection)
创建简单的ASP.NET Web Forms应用,核心代码如下,复制到两个独立文件夹(如C:\WebApps\AppA和C:\WebApps\AppB):
1. 写Cookie页面(WriteCookie.aspx)
<%@ Page Language="C#" %> <!DOCTYPE html> <html> <head><title>写入Cookie</title></head> <body> <form runat="server"> <asp:TextBox ID="txtUsername" runat="server" placeholder="输入用户名"></asp:TextBox> <asp:Button ID="btnSetCookie" runat="server" Text="设置Cookie" OnClick="btnSetCookie_Click" /> </form> </body> </html> <script runat="server"> protected void btnSetCookie_Click(object sender, EventArgs e) { HttpCookie userCookie = new HttpCookie("UserSession"); userCookie["Username"] = txtUsername.Text; userCookie.Domain = ".localhost"; // 关键:设置为父域,允许子域共享 userCookie.Path = "/"; // 确保整个域名路径可访问 userCookie.Expires = DateTime.Now.AddHours(1); Response.Cookies.Add(userCookie); Response.Write("Cookie已写入"); } </script>
2. 读Cookie页面(ReadCookie.aspx)
<%@ Page Language="C#" %> <!DOCTYPE html> <html> <head><title>读取Cookie</title></head> <body> <% HttpCookie userCookie = Request.Cookies["UserSession"]; if (userCookie != null && !string.IsNullOrEmpty(userCookie["Username"])) { Response.Write($"当前会话用户:{userCookie["Username"]}"); } else { Response.Write("未检测到共享Cookie"); } %> </body> </html>
四、部署应用到对应应用池
- 在IIS管理器左侧导航栏右键点击「网站」→「添加网站」:
- 网站名称:
AppA - 应用池:选择
AppPoolA - 物理路径:
C:\WebApps\AppA - 绑定:类型选
http,IP地址*,端口3000,主机名a.localhost - 点击「确定」
- 网站名称:
- 重复添加网站步骤创建
AppB:- 网站名称:
AppB - 应用池:选择
AppPoolB - 物理路径:
C:\WebApps\AppB - 绑定:端口
3001,主机名b.localhost - 点击「确定」
- 网站名称:
五、测试跨应用池Cookie共享
- 浏览器访问
http://a.localhost:3000/WriteCookie.aspx,输入用户名后点击「设置Cookie」 - 打开新标签页访问
http://b.localhost:3001/ReadCookie.aspx,验证是否能显示刚才输入的用户名 - 若成功读取,说明跨应用池的子域Cookie会话维持生效
关键注意事项
- 必须将Cookie的
Domain设置为父域(如.localhost),不能是具体子域(a.localhost),否则其他子域无法读取 - 两个应用必须使用独立的IIS应用池,确保进程隔离,符合演示场景
- 若测试失败,检查IIS站点绑定的主机名是否与hosts文件一致,Cookie的Path是否为
/
内容的提问来源于stack exchange,提问作者KDhyne
相关产品推荐
相关产品推荐

