使用C#+RestSharp调用Synology File Station API上传文件返回401错误如何解决
问题解决步骤
401错误为授权验证失败,结合你提供的代码,问题由以下几个可修复的错误导致:
- 错误1:手动指定multipart请求头
你开启了AlwaysMultipartFormData后,RestSharp会自动生成合法的Content-Type(含随机boundary)和Content-Length头,你手动覆盖的boundary和实际请求使用的边界值不一致,会导致群晖服务端无法正常解析表单参数,无法读取到_sid字段,最终返回401。直接删除以下两行代码即可:
request.AddHeader("Content-Type", $"multipart/form-data; boundary={Guid.NewGuid()}"); request.AddHeader("Content-Length", $"{data.Length}");
- 错误2:参数重复提交
你同时将api/method/version三个参数同时添加到了查询参数和表单参数中,重复参数会导致群晖API参数校验失败。建议保留表单参数,将对应查询参数的添加代码删除,同时将_sid也放到表单参数中提交(部分群晖版本的上传接口不支持查询参数传递sid):
删除以下代码:
request.AddQueryParameter("api", "SYNO.FileStation.Upload"); request.AddQueryParameter("method", "upload"); request.AddQueryParameter("version", "2"); request.AddQueryParameter("_sid", $"{SynSettings.Sid}");
然后在表单参数区域补充sid的提交:
request.AddParameter("_sid", SynSettings.Sid, ParameterType.GetOrPost);
- 错误3:权限校验
确认你获取SID的账号具备/ActiveBackupforBusiness共享文件夹的写入权限,且SID未过期(可先调用SYNO.FileStation.Info.getinfo接口验证SID有效性)。
修改后的可运行代码示例
private const string url_auth = "/webapi/entry.cgi"; public Upload() { byte[] data = File.ReadAllBytes(@"/Users/XXXXXX/Downloads/file.csv"); var client = new RestClient(SynSettings.DSM); var request = new RestRequest(url_auth); request.AlwaysMultipartFormData = true; request.Method = Method.POST; // 表单参数提交 request.AddParameter("api", "SYNO.FileStation.Upload", ParameterType.GetOrPost); request.AddParameter("version", "2", ParameterType.GetOrPost); request.AddParameter("method", "upload", ParameterType.GetOrPost); request.AddParameter("_sid", SynSettings.Sid, ParameterType.GetOrPost); request.AddParameter("path", "/ActiveBackupforBusiness", ParameterType.GetOrPost); request.AddParameter("create_parents", "false", ParameterType.GetOrPost); request.AddFileBytes("file", data, "file.csv", "application/octet-stream"); Console.WriteLine(client.BuildUri(request)); var queryResult = client.Execute(request); Console.WriteLine(queryResult.Content); }
内容的提问来源于stack exchange,提问作者pixel
相关产品推荐
相关产品推荐

