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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 00:15:00