使用Graph API添加大附件时遇413错误及序列化问题求助
解决Graph API添加大附件的413和序列化错误问题
我来帮你梳理下正确的操作流程,你遇到的问题主要是步骤顺序有误,加上端点版本使用不当导致的:
一、核心问题拆解
- 413错误原因:直接在创建邮件时附带7MB附件,超过了Graph API v1.0创建邮件接口的4MB请求大小限制,大附件必须用分块上传的方式处理。
- 序列化错误原因:v1.0的
/attachments端点不支持直接添加大附件,这类操作必须通过beta版本的createUploadSession接口创建上传会话,再分块上传。你之前用v1.0端点尝试添加大附件,自然会出现解析失败的问题。
二、正确操作流程(C#示例)
1. 创建无附件的草稿邮件
先创建一个不带附件的草稿邮件,拿到唯一的messageId:
var graphClient = new GraphServiceClient(authProvider); var draftMessage = new Message { Subject = "邮件主题:带大附件的测试邮件", Body = new ItemBody { ContentType = BodyType.Html, Content = "您好,这是您需要的大文件。" }, ToRecipients = new List<Recipient> { new Recipient { EmailAddress = new EmailAddress { Address = "收件人邮箱@example.com" } } } }; var createdDraft = await graphClient.Me.Messages .Request() .AddAsync(draftMessage); var messageId = createdDraft.Id;
2. 创建上传会话(必须用beta版本)
调用beta版本接口创建上传会话,获取专属的上传地址:
var uploadSessionBody = new CreateUploadSessionPostRequestBody { AttachmentItem = new AttachmentItem { AttachmentType = AttachmentType.File, Name = "你的大文件名.pdf", Size = 7340032 // 填写文件实际字节数,7MB左右的数值 } }; var uploadSession = await graphClient.Me.Messages[messageId].Attachments .CreateUploadSession() .Request() .AddAsync(uploadSessionBody); var uploadUrl = uploadSession.UploadUrl;
3. 分块上传附件
用拿到的uploadUrl进行分块上传,Graph API推荐块大小为5MB(可调整,但不要超过60MB):
using var fileStream = new FileStream(@"本地文件路径\你的大文件名.pdf", FileMode.Open); var maxChunkSize = 5 * 1024 * 1024; // 5MB分块 var uploadTask = new LargeFileUploadTask<FileAttachment>(uploadSession, fileStream, maxChunkSize); // 可选:添加上传进度回调 uploadTask.UploadProgressChanged += (sender, args) => { Console.WriteLine($"已上传:{args.BytesUploaded}/{args.TotalBytes} 字节"); }; // 执行上传 var uploadResult = await uploadTask.UploadAsync(); if (uploadResult.UploadSucceeded) { Console.WriteLine("大附件上传成功!"); } else { Console.WriteLine($"上传失败:{uploadResult.Error.Message}"); }
4. 发送邮件
最后用v1.0接口发送带附件的草稿邮件:
await graphClient.Me.Messages[messageId] .Send() .Request() .PostAsync();
三、Postman测试步骤
如果用Postman复现,按以下步骤操作:
创建草稿邮件:
- 请求方法:POST
- URL:
https://graph.microsoft.com/v1.0/me/messages - 请求体(JSON):
{ "subject": "测试大附件邮件", "body": { "contentType": "HTML", "content": "测试内容" }, "toRecipients": [ { "emailAddress": { "address": "收件人邮箱@example.com" } } ] } - 从响应中提取
id作为messageId。
创建上传会话:
- 请求方法:POST
- URL:
https://graph.microsoft.com/beta/me/messages/{messageId}/attachments/createUploadSession - 请求体(JSON):
{ "attachmentItem": { "attachmentType": "file", "name": "大文件名.pdf", "size": 7340032 } } - 提取响应中的
uploadUrl。
分块上传:
- 用PUT请求调用
uploadUrl,设置请求头Content-Range: bytes 0-5242879/7340032(根据块大小调整范围),请求体为对应块的文件内容。 - 若文件大于5MB,需多次发送PUT请求,每次更新
Content-Range的范围,直到全部上传完成。
- 用PUT请求调用
发送邮件:
- 请求方法:POST
- URL:
https://graph.microsoft.com/v1.0/me/messages/{messageId}/send
四、关键注意事项
- 必须使用beta版本的
createUploadSession接口,v1.0不支持该端点。 - 上传会话创建后需在24小时内完成上传,否则会话会过期失效。
- 分块上传时,
Content-Range格式必须严格遵循bytes start-end/totalSize规则,start从0开始,end为当前块最后一个字节的索引。
内容的提问来源于stack exchange,提问作者user2653290
相关产品推荐
相关产品推荐

