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

升级RestSharp至v110后持续出现401未授权错误,求排查

问题分析与解决方案

核心问题

你升级到RestSharp v110后,错误地将表单提交用户名密码的逻辑改成了HTTP Basic认证,这和原接口的认证方式不匹配,导致返回401。

  • v107版本中,你通过request.AddParameter将username和password作为application/x-www-form-urlencoded类型的表单参数提交给instancetoken接口;
  • v110版本中,你改用HttpBasicAuthenticator,RestSharp会自动给请求添加Authorization: Basic <base64编码的用户名密码>头,而不会将参数放到表单里,接口无法识别这种认证方式,因此返回401。

修正后的代码

获取instancetoken的请求需要保持原有的表单提交方式,不需要设置Authenticator,代码调整如下:

RestClientOptions options = new RestClientOptions()
{
    BaseUrl = new Uri(serviceUrl),
    MaxTimeout = cTimeout,
    UseDefaultCredentials = false,
    UserAgent = $"{Assembly.GetExecutingAssembly().GetName().Name}/{FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion}",
    Encoding = System.Text.Encoding.UTF8
};
_restClient = new RestClient(options);

RestRequest request = new RestRequest("instancetoken", Method.Post);
request.AddHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
request.AddHeader("Accept", "text/plain");
// 恢复添加表单参数的逻辑
request.AddParameter(nameof(username), username);
request.AddParameter(nameof(password), password);

RestResponse response = await _restClient.ExecuteAsync(request).ConfigureAwait(true);

关于InstanceToken只读的处理

现在InstanceToken的setter是private,你需要在获取到有效instanceToken后,通过RestClient的实例直接修改Authenticator(RestSharp v107+中RestClient.Authenticator仍可直接设置,不受初始化Options的限制):

// 假设从response中解析得到instanceToken后赋值
InstanceToken = parsedInstanceToken;

// 原代码中setter内修改Authenticator的逻辑仍然有效,无需改动:
// _restClient.Authenticator = string.IsNullOrEmpty(value) ? null : (IAuthenticator)new JwtAuthenticator(value);

后续请求需要使用JWT认证时,只要_restClient.Authenticator被正确设置为JwtAuthenticator,RestSharp会自动为请求添加Authorization: Bearer <token>头。

内容的提问来源于stack exchange,提问作者Marcel Grüger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 04:12:59