使用Azure .NET SDK创建资产过滤器返回400错误求助
我碰到过类似的细节问题,旧版Microsoft.Azure.Management.Media SDK(v2.0.1.0)在处理空列表属性的序列化逻辑上和手动HTTP请求不一致,这就是导致你遇到400错误核心原因。
问题根源
当你在SDK代码中设置Tracks = new List<FilterTrackSelection>()时,SDK内置的序列化器(基于Newtonsoft.Json)会因默认配置(比如DefaultValueHandling.Ignore)将这个空列表直接省略,或者序列化为null。而你手动用JsonConvert.SerializeObject序列化同一个对象时,会把空列表保留为[](空数组)格式。
Azure Media Services的API对请求体格式有严格要求:当你明确要指定Tracks属性时(哪怕是空筛选),必须传递[]而非省略该字段或传null,否则就会返回400错误。这就是手动请求成功、但SDK调用失败的核心差异点。
解决方案
1. 升级SDK版本(强烈推荐)
这是最彻底的修复方式。较新的Microsoft.Azure.Management.Media SDK(比如v3.x及以上版本)已经修复了这类序列化逻辑问题,能正确将空列表序列化为[],和你手动请求的行为完全一致。你可以直接在NuGet包管理器中更新到最新兼容版本,重新运行代码即可解决问题。
2. 调整Tracks属性设置
- 如果不需要过滤轨道(保留所有轨道):直接省略
Tracks属性的赋值,让它保持默认的null状态。此时Azure API会默认包含所有轨道,业务效果通常和传递空列表一致。修改后的代码如下:await _client.AssetFilters.CreateOrUpdateAsync( _config.ResourceGroup, _config.AccountName, _assetName, filterName, new AssetFilter() { PresentationTimeRange = new PresentationTimeRange() { StartTimestamp = 100000000, EndTimestamp = 150000000, LiveBackoffDuration = 0, Timescale = 10000000, ForceEndTimestamp = false } }); - 如果确实需要传递空Tracks列表(排除所有轨道):可以尝试手动构造符合要求的JSON请求体,借助SDK的底层HTTP客户端发送请求(不过会失去SDK的类型安全优势);或者用抓包工具确认SDK请求体差异后,针对性调整属性设置。
3. 验证请求体差异(排查用)
你可以用Fiddler或Charles这类抓包工具,对比SDK发送的请求体和手动HTTP请求的请求体,确认是否存在tracks字段的缺失/格式差异,快速验证我们提到的序列化问题。
内容的提问来源于stack exchange,提问作者strosu

