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

ASP.NET Core POST请求头添加认证时提示无效凭证问题求解

问题原因与解决方案

核心问题根因

  • 编码不匹配:HTTP Basic Auth 规范要求凭证字符串需使用UTF-8编码转换为字节流后再做Base64编码,你代码中使用的Encoding.Unicode是UTF-16LE编码,生成的字节序列和Python、PHP默认使用的UTF-8编码结果完全不同,导致Base64值不符合服务端预期,触发无效凭证错误。
  • 代码笔误:代码中]_Body.Headers.ContentType行存在冗余的]字符,会导致编译异常,该问题不直接触发接口凭证报错,但需要先修正才能正常运行。
  • 异步调用不规范:response.Content.ReadAsStringAsync().Result属于同步阻塞调用异步方法,高并发场景下容易引发死锁,建议统一使用await调用。

修复方案

修正后的完整代码如下:

// 替换Unicode为UTF8,符合Basic Auth编码规范
var m = System.Text.Encoding.UTF8.GetBytes("merchant." + merchant_Id + ":" + merchant_pass);
var b64Val = Convert.ToBase64String(m);
var SerSession = JsonConvert.SerializeObject(sessionRequest);
// 注意:HttpClient建议全局单例使用,不要每次请求新建实例,避免端口耗尽问题
var client = new HttpClient();
string _ContentType = "application/json";
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(_ContentType));
client.DefaultRequestHeaders.Add("Authorization", String.Format("Basic {0}", b64Val));

var _UserAgent = "d-fens HttpClient";
client.DefaultRequestHeaders.Add("User-Agent", _UserAgent);
HttpContent _Body = new StringContent(SerSession);
// 删除冗余的]符号
_Body.Headers.ContentType = new MediaTypeHeaderValue(_ContentType);
HttpResponseMessage response;
response = await client.PostAsync(api_URL, _Body);
// 替换Result为await避免死锁
var content = await response.Content.ReadAsStringAsync();
return Ok(content);

如果部分老旧支付网关仅兼容ASCII编码,将上述代码中的UTF8替换为ASCII即可。

内容的提问来源于stack exchange,提问作者Ahmed Dawood Salman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 16:06:04