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

RestSharp POST请求被拒绝:与HttpClient的差异及修复方法

问题分析与解决方案

核心差异点对比

  • 请求头归属:你在HttpClient里把key头加到了请求内容(HttpContent)的Headers中,但RestSharp默认AddHeader是添加到请求的顶级Headers,这大概率是接口返回NotAccepted的关键原因。
  • 请求体处理:你已经手动完成了XML序列化,不能用RestSharp的AddXmlBody(该方法会重新序列化对象,导致请求体格式错误)。
  • Basic认证细节:RestSharp自带的HttpBasicAuthenticator和你手动处理Base64编码的逻辑可能存在细微差异,也可能影响接口校验。

修改后的可运行RestSharp代码

var client = new RestClient(new RestClientOptions
{
    Encoding = new UTF8Encoding(false),
    BaseHost = "some.host.url.com"
});

// 和HttpClient保持一致的Basic认证处理
var authToken = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{username}:{password}"));

var body = myObject.SerializeToString();

var request = new RestRequest(url);

// 创建和HttpClient逻辑一致的请求内容,指定编码和Content-Type,并添加Content级别的key头
var content = new StringContent(body, new UTF8Encoding(false), "application/xml");
content.Headers.Add("key", value);

// 将自定义内容附加到请求
request.Add(content);

// 添加认证头
request.AddHeader("Authorization", $"Basic {authToken}");

var response = await client.ExecutePostAsync(request, cancellationToken);
return response.Content;

关键修改说明

  1. 统一认证逻辑:放弃RestSharp自带的HttpBasicAuthenticator,改用和HttpClient完全相同的手动Base64编码方式,彻底消除认证头的格式差异。
  2. 对齐请求头位置:通过StringContent创建请求体,把key头添加到Content的Headers中,和接口预期的请求格式完全匹配。
  3. 避免重复序列化:直接传入已手动序列化好的XML字符串,防止RestSharp自动处理破坏请求体结构。

额外排查建议

如果修改后仍有问题,抓包对比两者的请求报文,重点检查:

  • Authorization头的字符串是否完全一致
  • Content-Type是否为application/xml; charset=utf-8(注意编码后缀)
  • 请求体的XML内容是否完全相同(包括换行、空格等细节)

内容的提问来源于stack exchange,提问作者zesaro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 02:17:07