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

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&param2=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

相关产品推荐
方舟 Agent Plan

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

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