使用C#上传Walmart库存Feed报错“无法找到有效库存”求助
我用C#向Walmart Marketplace上传库存Feed时,接口返回了Feed ID,但后续Feed状态报错“Can not find any valid inventory in Feed”。用Postman上传完全相同的JSON内容能成功,但把Postman生成的C#代码复制到程序里执行,还是出现同样的错误,Walmart技术支持没给出有效解决方案,附上相关代码和数据,求排查原因:
相关代码与数据
Postman生成的C#代码
RestClient client = new RestClient("https://marketplace.walmartapis.com/v3/feeds?feedType=inventory&shipNode=<myshipnode>"); RestRequest request = new RestRequest(Method.POST); client.Timeout = -1; request.AddHeader("Content-Type", "multipart/form-data"); request.AddHeader("Cache-Control", "no-cache"); request.AddHeader("Accept", "application/json"); request.AddHeader("Accept-Encoding", "*"); request.AddHeader("Connection", "keep-alive"); request.AddHeader("WM_SEC.ACCESS_TOKEN", this.Credentials.Token); request.AddHeader("WM_CONSUMER.CHANNEL.TYPE", System.Guid.NewGuid().ToString()); request.AddHeader("WM_QOS.CORRELATION_ID", this.Credentials.ConsumerId) ; request.AddHeader("WM_SVC.NAME", "Walmart Marketplace"); request.AddHeader("Authorization", "Basic " + this.Credentials.Authorization); request.AddFile("file", "c:\\temp\\file.json", "multipart/form-data"); IRestResponse response = client.Execute(request); Console.WriteLine(response.Content);
上传的JSON数据
{ "InventoryHeader": { "version": "1.4" }, "Inventory": [ { "sku": "X27A001-A", "quantity": { "unit": "EACH", "amount": 89 } } ] }
Walmart官方示例JSON
{ "InventoryHeader": { "version": "1.4" }, "Inventory": [ { "sku": "test1", "quantity": { "unit": "EACH", "amount": 10 } }, { "sku": "894728", "quantity": { "unit": "EACH", "amount": 20 } } ] }
可能的问题原因与修复方案
1. 错误设置了请求的Content-Type头
Postman生成的代码里手动添加了Content-Type: multipart/form-data,但RestSharp在使用AddFile时会自动生成包含正确boundary的Content-Type头,手动设置会覆盖这个值,导致Walmart服务器无法正确解析multipart请求中的文件内容。
修复: 移除手动添加的Content-Type头,让RestSharp自动处理。
2. 文件MIME类型指定错误
AddFile方法的第三个参数是上传文件的MIME类型,代码里填了multipart/form-data,这是整个请求的类型,而上传的是JSON文件,应该指定为application/json。
修复: 修改AddFile的MIME参数:
request.AddFile("file", "c:\\temp\\file.json", "application/json");
3. 文件编码问题
如果JSON文件的编码不是UTF-8(比如带BOM的UTF-8或者GBK),Walmart服务器解析时可能无法识别其中的库存数据。Postman会自动处理编码,但C#直接读取文件可能保留了错误编码。
修复: 读取文件时指定UTF-8编码,再添加到请求中:
string jsonContent = File.ReadAllText(@"c:\temp\file.json", Encoding.UTF8); request.AddFile("file", Encoding.UTF8.GetBytes(jsonContent), "file.json", "application/json");
4. ShipNode参数未正确替换
确认URL中的<myshipnode>已经替换为你在Walmart后台配置的有效ShipNode值,Postman中可能已经替换,但代码里可能遗漏了。
额外排查建议
- 抓包对比Postman和C#请求的差异:用Fiddler或Charles捕获两个请求的完整报文,对比请求头、multipart结构、文件内容的编码细节,找出不一致的地方。
- 验证JSON格式:用JSON校验工具确认上传的JSON没有语法错误,虽然看起来和示例一致,但可能存在隐藏的格式问题(比如不可见字符)。
- 确认SKU有效性:确保上传的SKU已经在Walmart Marketplace后台创建,不存在的SKU也会导致该错误(但Postman能成功的话大概率不是这个问题)。
内容的提问来源于stack exchange,提问作者Tom Libby

