使用C#调用YouTube API上传视频时遇Metadata过大BadRequest错误
解决YouTube API上传时"Metadata part is too large"的Bad Request错误
你遇到的这个错误大概率是元数据部分的构造方式不符合YouTube API的要求,而非API端的问题。下面我来拆解问题并给出具体的修复方案:
核心问题分析
- 元数据未指定正确的参数名称:YouTube API明确要求,在多部分表单上传时,元数据部分必须命名为
"metadata"。你目前只是直接添加了StringContent,没有指定这个关键名称,这会导致API无法正确解析元数据,甚至误判元数据的大小。 - 元数据字段可能超出长度限制:虽然可能性稍低,但YouTube API对元数据字段有明确长度限制,比如描述最多5000字符、标签总长度(含分隔符)最多500字符、标题最多100字符,你可以先排查这些字段是否超标。
修复步骤
步骤1:为元数据指定API要求的名称
在将StringContent添加到MultipartFormDataContent时,必须显式指定名称为"metadata",这是API识别元数据的必要条件。
步骤2:检查元数据字段长度
- 确认
description字符数不超过5000 - 确认所有
tags的总字符数(包括逗号)不超过500 - 确认
title字符数不超过100
修正后的完整代码
// 构造用于向YouTube上传文件的HttpClient var client = new HttpClient { BaseAddress = new Uri("https://www.googleapis.com/"), Timeout = Timeout.InfiniteTimeSpan, // 更简洁的无限超时写法 MaxResponseContentBufferSize = 2147483647 }; client.DefaultRequestHeaders.Add("Authorization", $"Bearer {accessToken}"); var requestContent = new MultipartFormDataContent(); // 1. 添加视频文件内容,指定字段名为"video"(API要求)并带上文件名 var fileContent = new StreamContent(formFile.OpenReadStream()); fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse(formFile.ContentType); // 明确指定文件MIME类型 requestContent.Add(fileContent, "video", formFile.FileName); // 2. 添加元数据内容,必须指定字段名为"metadata" var propertiesJson = JsonConvert.SerializeObject(properties); var stringContent = new StringContent(propertiesJson, Encoding.UTF8, "application/json"); requestContent.Add(stringContent, "metadata"); var result = await client.PostAsync("upload/youtube/v3/videos?part=snippet,status", requestContent); // 返回内容处理:修复了原代码未await ReadAsStringAsync()的bug if (!result.IsSuccessStatusCode) { var content = await result.Content.ReadAsStringAsync(); return BadRequest(new { content, reasonPhrase = result.ReasonPhrase }); }
额外注意点
- 原代码中
result.Content.ReadAsStringAsync()没有添加await,会导致返回的是Task对象而非实际错误内容,这个隐藏bug已经在修正代码中修复。 - 给文件内容指定MIME类型能帮助API更准确地识别视频格式,避免潜在的解析问题。
内容的提问来源于stack exchange,提问作者Florian Delvo
相关产品推荐
相关产品推荐

