ASP.NET Core MVC中如何用C#调用需用户名密码认证的API
ASP.NET Core MVC 服务端调用带Basic Auth认证API的实现方案
你之前用的WebRequest/HttpWebRequest属于.NET Framework时代的遗留API,在ASP.NET Core中仍可运行但官方不推荐,推荐使用IHttpClientFactory托管HttpClient实例来完成调用,实现如下:
1. 注册HttpClient服务
在项目的Program.cs(.NET 6及以上版本)中添加服务注册:
var builder = WebApplication.CreateBuilder(args); // 注册HttpClient工厂服务 builder.Services.AddHttpClient(); // 原有其他服务注册逻辑... var app = builder.Build(); // 原有中间件配置逻辑... app.Run();
如果需要复用同一个API的调用配置,也可以注册命名化/类型化的HttpClient,减少重复代码。
2. 控制器中注入并编写调用逻辑
在你需要发起调用的控制器中,通过构造函数注入IHttpClientFactory,再在Post动作中编写API调用代码,示例如下:
using System.Text; using Microsoft.AspNetCore.Mvc; public class HomeController : Controller { private readonly IHttpClientFactory _httpClientFactory; // 生产环境不要硬编码凭证,从配置文件/密钥服务读取即可 private readonly string _apiUsername = "你的API用户名"; private readonly string _apiPassword = "你的API密码"; public HomeController(IHttpClientFactory httpClientFactory) { _httpClientFactory = httpClientFactory; } [HttpPost] public async Task<IActionResult> YourPostAction() { // 创建HttpClient实例 var client = _httpClientFactory.CreateClient(); // 生成Basic Auth凭证,注意使用UTF8编码避免特殊字符乱码 var authBytes = Encoding.UTF8.GetBytes($"{_apiUsername}:{_apiPassword}"); var authHeader = $"Basic {Convert.ToBase64String(authBytes)}"; client.DefaultRequestHeaders.Add("Authorization", authHeader); try { // 示例1:调用外部GET接口 var getResponse = await client.GetAsync("https://sub.domain.com/api/operations?param=value¶m2=value"); // 校验响应状态 getResponse.EnsureSuccessStatusCode(); // 读取响应内容 var getResult = await getResponse.Content.ReadAsStringAsync(); // 示例2:调用外部POST接口(按需使用) /* var postData = new { key = "value" }; var postContent = new StringContent(JsonSerializer.Serialize(postData), Encoding.UTF8, "application/json"); var postResponse = await client.PostAsync("https://sub.domain.com/api/目标接口地址", postContent); postResponse.EnsureSuccessStatusCode(); var postResult = await postResponse.Content.ReadAsStringAsync(); */ // 后续你的业务逻辑,返回视图/JSON等 return Ok(getResult); } catch (HttpRequestException ex) { // 处理调用异常,比如认证失败、接口不可用等 return StatusCode(StatusCodes.Status502BadGateway, "调用外部API失败:" + ex.Message); } } }
注意事项
- 禁止硬编码API用户名密码,推荐将凭证存储在
appsettings.json、项目机密管理器中,生产环境使用云密钥管理服务存储,通过IOptions模式读取 - Basic Auth必须配合HTTPS协议使用,否则凭证会被明文传输,存在泄露风险
- 不要手动
new HttpClient,通过IHttpClientFactory创建实例可以自动管理套接字资源,避免端口耗尽问题
内容的提问来源于stack exchange,提问作者r2000_na
相关产品推荐
相关产品推荐

