邮件附件上传遇400 InvalidStart错误的处理及技术问询
Graph API邮件附件上传InvalidStart错误问题解答
问题背景
我在为邮件添加附件时,随机遇到HTTP 400错误(错误码:InvalidStart)。应用默认在收到HTTP响应NULL时会重试最后一次请求,但重试后Graph返回如下错误:
HTTP code 400 : {"error":{"code":"InvalidStart","message":"Invalid Start offset for the current fragment. Fragment might already have been uploaded."}}
错误详情
- 第一次出现3次错误:
- request-id: 056c38d3-5037-c823-046e-17c57cc5e3af,时间:Mon, 03 Oct 2022 09:08:34 GMT
- request-id: 6b1b9757-81e8-f2a4-836e-af6828e51e46,时间:Mon, 03 Oct 2022 09:09:20 GMT
- request-id: c221fe3a-131d-daa3-a83b-77ed7876377c,时间:Mon, 03 Oct 2022 09:12:46 GMT
- 影响:缺失2个附件
- 第二次出现2次错误:
- request-id: 7920075b-1f02-9d49-72ee-2cb86b3a042e,时间:Mon, 03 Oct 2022 12:31:23 GMT
- request-id: 9151bc31-d36b-f491-5941-8988b1f631b7,时间:Mon, 03 Oct 2022 12:32:19 GMT
- 影响:缺失1个附件的内容
问题解答
1. 收到该错误时,应用应采取何种行为?
立即停止当前片段的重试操作,先确认该片段是否已成功上传。禁止重复发送相同起始偏移的片段请求,否则会持续触发InvalidStart错误。
2. 如何检测上传请求是否成功?
- 分片上传的每个片段,发送后需检查响应状态码:收到
202 Accepted表示片段上传成功,会话仍在进行;收到201 Created或200 OK表示整个附件上传完成。 - 若收到NULL响应,不要直接判定为失败,可尝试发送下一个片段而非重试当前片段:如果下一个片段返回InvalidStart,说明当前片段已上传成功;如果下一个片段正常上传,则说明当前片段确实上传失败,可重新上传该片段。
3. 若最后一个数据块仅部分上传,是否会触发此400错误?
不会。服务端仅在收到完整的片段后才会标记该偏移量为已上传,若最后一个数据块仅部分上传,服务端不会记录该片段已完成,此时重试该片段不会触发InvalidStart错误,只会返回请求不完整类的错误。
4. 某些场景下能否将该错误视为上传成功?
可以。InvalidStart错误的核心含义是当前请求的片段已经被服务端完整接收,此时无需重新上传该片段:
- 如果是最后一个片段,可直接查询邮件附件是否已完整创建;
- 如果是中间片段,可继续上传后续的片段。
5. 邮件附件上传是否支持查询缺失数据范围的断点续传功能?
目前Graph API的邮件附件上传会话不支持查询已上传片段范围的功能,该能力仅在OneDrive等文件存储类API中提供,邮件附件上传没有公开接口用于获取已上传的偏移量信息。
6. 是否只能通过取消当前会话并创建新会话来重试上传?
不是必须,但这是最稳妥的方案。如果无法确认已上传片段的状态,通过DELETE请求取消当前上传会话,再创建新会话重新上传整个附件,可避免因片段状态混乱导致的持续错误。若能通过下一个片段的响应确认部分片段已上传,也可尝试继续上传后续片段,但存在一定的状态不一致风险。
内容的提问来源于stack exchange,提问作者Geoffrey Rannou
相关产品推荐
相关产品推荐

