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

