MS Teams Webhook发小消息返回Error 413,为何上限减半?
根据微软官方文档,Teams频道Webhook消息的最大上限约为28KB,但发送远小于该大小的消息时,仍收到错误:Webhook message delivery failed with error: Microsoft Teams endpoint returned HTTP error 413 with ContextId ***。经测试发现,仅能发送内容大小不超过14000字节的请求。
简化后的代码如下:
private async Task SendTeamsNotification(string webhookUrl, string jsonTemplate) { var content = new StringContent(jsonformattedTemplate); var response = await _httpClient.PostAsync(webhookUrl, content) // Some error handling... }
其中jsonTemplate是自适应卡片的JSON格式字符串,_httpClient为默认客户端。请问遗漏了什么?为何上限恰好减半?
遗漏核心设置:请求编码与Content-Type
默认情况下,StringContent使用UTF-16编码序列化字符串,UTF-16每个字符占2字节。而Teams文档中提到的28KB上限是针对UTF-8编码的内容,这就导致实际传输的字节数被翻倍计算——比如14000字符的UTF-16内容,对应传输字节数是28000左右,刚好触碰到Teams的28KB限制,这就是你测试时上限减半的原因。另外,代码中没有指定
Content-Type为application/json,Teams Webhook要求接收JSON格式请求,缺失该头可能也会导致处理时的额外开销或校验问题。修复代码
创建StringContent时显式指定UTF-8编码,并设置正确的Content-Type:private async Task SendTeamsNotification(string webhookUrl, string jsonTemplate) { var content = new StringContent(jsonTemplate, Encoding.UTF8, "application/json"); var response = await _httpClient.PostAsync(webhookUrl, content); // 错误处理逻辑... }上限减半的本质原因
完全是编码差异导致:UTF-16编码下每个字符占用2字节,Teams的28KB上限是基于UTF-8编码的内容大小。使用默认UTF-16时,实际传输字节数是UTF-8的2倍,所以能发送的最大内容规模就变成了官方上限的一半。
内容的提问来源于stack exchange,提问作者Robin

