使用RestSharp连接Synology NAS失败的问题求助
解决C#中RestSharp连接Synology NAS失败的问题
问题回顾
- 首次尝试使用QuickConnect地址发起请求,返回
Request failed with status code Redirect - 第二次改用手动验证有效的HTTPS地址,返回
Error sending request
关键问题分析
- 请求方法不匹配:两次代码中都将
RestRequest定义为Method.Post,但调用的是ExecuteGetAsync,请求方法与执行方法冲突,直接引发错误。 - SSL证书验证拦截:Synology NAS默认使用自签名SSL证书,RestSharp默认会验证证书有效性,导致HTTPS请求失败。
- 地址与端口不匹配:首次尝试用的是HTTP+5000端口,但手动验证有效的是HTTPS+5001端口,协议和端口不一致触发重定向问题。
- 冗余参数干扰:首次代码中的
path参数是多余的,Synology API不需要该参数。
修复方案
- 统一请求方法:选择
Get或Post,并对应调用正确的执行方法(ExecuteGetAsync或ExecutePostAsync),Synology API支持两种请求方式,这里以Get为例更简洁。 - 禁用SSL证书验证:在
RestClientOptions中关闭证书验证,适配NAS自签名证书的场景。 - 使用正确的目标地址:直接采用手动验证有效的HTTPS地址(带5001端口)。
- 清理冗余参数:移除不必要的
path参数。
完整可运行示例代码
public async Task TryConnection() { // 配置客户端选项,使用验证有效的HTTPS地址 var clientOptions = new RestClientOptions("https://192-168-178-23.fdesign-gmbh.direct.quickconnect.to:5001/") { // 跳过自签名证书验证 RemoteCertificateValidationCallback = (sender, cert, chain, sslPolicyErrors) => true, FollowRedirects = true }; var client = new RestClient(clientOptions); // 定义GET请求,参数自动转为URL查询参数 var request = new RestRequest("/webapi/entry.cgi", Method.Get); request.AddParameter("api", "SYNO.API.Info"); request.AddParameter("version", "1"); request.AddParameter("method", "query"); request.AddParameter("query", "SYNO.API.Auth,SYNO.FileStation"); // 异步执行请求(推荐用await替代.Result,避免死锁) var response = await client.ExecuteGetAsync(request); if (response.IsSuccessful) { string resultContent = response.Content; // 处理返回的JSON数据 } else { string errorMessage = response.ErrorMessage; // 处理请求错误 } }
额外注意事项
- 优先使用
await调用异步方法,避免UI线程死锁问题。 - 若后续调用需要授权的API(如文件管理),需先调用
SYNO.API.Auth的login方法获取会话凭证,后续请求携带该凭证。 - 若要改用Post方法,只需将
Method.Get改为Method.Post,并调用ExecutePostAsync即可,Synology API会自动处理参数。
内容的提问来源于stack exchange,提问作者Bruno Frade
相关产品推荐
相关产品推荐

