使用aiohttp调用Microsoft Graph时SSL关闭超时问题求助
解决aiohttp关闭Microsoft Graph连接时的SSL shutdown超时问题
原因分析
- 从2025年5月30日起,Microsoft Graph大概率调整了TLS连接关闭的处理逻辑:不再主动响应客户端发送的
close_notify握手包,或是延迟响应时间超过了aiohttp默认的关闭超时阈值,导致触发ClientConnectionError: Connection lost: SSL shutdown timed out错误。 - 其他服务(如Google APIs)未修改相关TLS行为,因此不会出现该问题。
规避与解决方案
1. 延长连接关闭超时时间
修改TCPConnector的shutdown_timeout参数,给Graph服务足够的响应时间:
import aiohttp async def call_graph_api(): connector = aiohttp.TCPConnector(shutdown_timeout=30) # 延长至30秒,可根据实际调整 async with aiohttp.ClientSession(connector=connector) as session: # 执行你的Microsoft Graph请求(如sendMail、delta查询) response = await session.post("https://graph.microsoft.com/v1.0/me/sendMail", ...) # 处理响应逻辑
2. 强制关闭连接(应急方案)
如果不需要优雅的TLS关闭流程,可以启用force_close=True跳过SSL shutdown握手,直接断开TCP连接:
connector = aiohttp.TCPConnector(force_close=True) async with aiohttp.ClientSession(connector=connector) as session: # 请求逻辑
注意:此方式不符合TLS规范,但能快速规避超时错误。
3. 升级aiohttp到最新版本
aiohttp后续版本可能针对SSL关闭超时场景做了优化,尝试升级到最新稳定版:
pip install --upgrade aiohttp
4. 捕获并忽略特定超时错误
在关闭ClientSession时,针对性捕获并忽略SSL shutdown超时错误,不影响其他业务逻辑:
import aiohttp async def main(): session = aiohttp.ClientSession() try: # 执行Graph请求 await session.get("https://graph.microsoft.com/v1.0/me") finally: try: await session.close() except aiohttp.ClientConnectionError as e: if "SSL shutdown timed out" in str(e): pass # 忽略该超时错误 else: raise # 重新抛出其他连接异常
关于Microsoft Graph侧变更的确认
目前Microsoft官方尚未公开该TLS关闭行为的变更公告,但已有大量开发者在2025年5月底反馈同类问题,推测是Graph服务端的调整。你可以通过以下方式确认:
- 查看Microsoft 365 Admin Center的服务健康仪表板,查看是否有相关服务变更通知;
- 提交Microsoft支持工单,直接向官方确认变更细节。
内容的提问来源于stack exchange,提问作者Henri Coorevits
相关产品推荐
相关产品推荐

