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

使用HttpClient调用身份服务器获取Token时出现415 Unsupported Media Type错误

使用HttpClient获取Token出现415错误,RestClient却正常的原因及修复

用HttpClient从身份服务器获取Token时遇到415 Unsupported Media Type错误,但换成RestClient却能正常运行,这是怎么回事?

HttpClient 错误代码

HttpClient _client = new HttpClient();
string clientId = "clientid";
string issuer = "https://ourrdomain/token";
string secretKey = "secret";

var byteArray = System.Text.Encoding.ASCII.GetBytes(clientId + ":" + secretKey);
var httpRequestMessage = new HttpRequestMessage
{
    Method = HttpMethod.Post,
    RequestUri = new Uri(issuer),
    Headers = {
        { HttpRequestHeader.Authorization.ToString(), "Basic " + Convert.ToBase64String(byteArray) },
        { HttpRequestHeader.ContentType.ToString(), "application/x-www-form-urlencoded" },
        { HttpRequestHeader.CacheControl.ToString(), "no-cache" },
        { "grant_type", "client_credentials" }
    }
};
var response = _client.SendAsync(httpRequestMessage).Result;

RestClient 正常代码

var request = new RestRequest();
var client = new RestClient(issuer);
string clientId = "clientid";
string issuer = "https://ourrdomain/token";
string secretKey = "secret";
var byteArray = System.Text.Encoding.ASCII.GetBytes(clientId + ":" + secretKey);
request.Method = Method.Post;
request.AddHeader("cache-control", "no-cache");
request.AddHeader("content-type", "application/x-www-form-urlencoded");
request.AddHeader("Authorization", "Basic " + Convert.ToBase64String(byteArray));
request.AddParameter("grant_type", "client_credentials");
var response2 = client.Execute(request);

问题根源

  1. 参数位置错误:HttpClient代码里把grant_type放在了请求头(Headers)中,但application/x-www-form-urlencoded类型的请求,参数必须放在请求体里,身份服务器期望从请求体读取grant_type参数,因此会因请求内容格式不匹配返回415错误。
  2. ContentType设置方式错误:直接在Headers里添加Content-Type头不符合HttpClient的规范,正确做法是通过请求的Content属性设置,直接添加的头可能被忽略或导致格式冲突。

RestClient的AddParameter方法默认会将参数编码为application/x-www-form-urlencoded格式并放入请求体,同时自动处理Content-Type头,因此能正常请求。

修正后的HttpClient代码

HttpClient _client = new HttpClient();
string clientId = "clientid";
string issuer = "https://ourrdomain/token";
string secretKey = "secret";

var byteArray = System.Text.Encoding.ASCII.GetBytes($"{clientId}:{secretKey}");
// 设置认证头
_client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
// 设置缓存控制头
_client.DefaultRequestHeaders.CacheControl = new System.Net.Http.Headers.CacheControlHeaderValue { NoCache = true };

// 构造form-urlencoded格式的请求体
var formData = new Dictionary<string, string>
{
    { "grant_type", "client_credentials" }
};
var content = new FormUrlEncodedContent(formData);

var response = _client.PostAsync(issuer, content).Result;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 23:16:23