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
相关产品推荐
相关产品推荐

