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

ASP.NET Core WebAPI集成测试中HttpClient会话不共享问题排查

问题描述

我在Web API中实现了3个方法:

  • val1 - 将传入值存入session
  • val2 - 将传入值存入session
  • diff - 返回session中两个值是否不同

我使用以下代码创建测试客户端:

var webAppFactory = new WebApplicationFactory<Program>();
_httpClient = webAppFactory.CreateDefaultClient();

集成测试代码如下:

var responseVal1 = await _httpClient.PutAsync("/val1", content);
var responseVal2 = await _httpClient.PutAsync("/val2", content);
var responseDiff = await _httpClient.GetAsync("/diff");

问题在于每次PutAsync或GetAsync请求都会在服务器生成新会话,每个请求拥有独立的HttpContext.Session,导致测试失败,但该功能在浏览器中可正常运行。请问我哪里操作有误?

解决方案

问题出在默认的HttpClient不会自动维护Cookie会话。浏览器会自动保存并在后续请求中发送Session对应的ASP.NET_SessionId Cookie,但你创建的测试客户端没有配置这个行为,所以每个请求都是全新的会话。

解决方法很简单,给测试客户端配置一个CookieContainer来保存和复用Cookie:

var webAppFactory = new WebApplicationFactory<Program>();
var cookieContainer = new CookieContainer();
var handler = new HttpClientHandler { CookieContainer = cookieContainer };
_httpClient = webAppFactory.CreateDefaultClient(handler);

这样所有请求都会共享同一个Cookie容器,服务器就能识别出是同一个会话,session里的值也能在多个请求间共享了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 21:18:23