You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Azure .NET SDK创建资产过滤器返回400错误求助

Why does Azure Media Services .NET SDK v2.0.1.0 return 400 error when creating Asset Filter with empty Tracks list, but HTTP request succeeds?

我碰到过类似的细节问题,旧版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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:14:33