当前位置:首页 > 技术教程 > 正文

ASP.NET如何调用外部API?C实现接口调用详细步骤

在 ASP.NET 中调用外部 API 通常使用 HttpClient 类,以下是详细步骤和最佳实践(以 ASP.NET Core 为例):

基础步骤

  1. 载入 HttpClient

    在 Startup.cs 中注册服务:

    public void ConfigureServices(IServiceCollection services) { services.AddHttpClient(); // 基本注册 // 或命名客户端(推荐) services.AddHttpClient("ExternalApi", client => { client.BaseAddress = new Uri("https://api.example.com/"); client.DefaultRequestHeaders.Add("Accept", "application/json"); }); }
  2. 在控制器中使用

    [ApiController] [Route("api/[controller]")] public class DataController : ControllerBase { private readonly IHttpClientFactory _httpClientFactory; public DataController(IHttpClientFactory httpClientFactory) { _httpClientFactory = httpClientFactory; } [HttpGet] public async Task<IActionResult> GetExternalData() { // 创建命名客户端 var client = _httpClientFactory.CreateClient("ExternalApi"); try { // 发送 GET 请求 HttpResponseMessage response = await client.GetAsync("endpoint"); if (response.IsSuccessStatusCode) { string content = await response.Content.ReadAsStringAsync(); return Ok(content); } return StatusCode((int)response.StatusCode, "API request failed"); } catch (Exception ex) { return StatusCode(500, $"Internal error: {ex.Message}"); } } }

处理 POST 请求

[HttpPost] public async Task<IActionResult> PostData([FromBody] MyModel model) { var client = _httpClientFactory.CreateClient("ExternalApi"); // 序列化数据 var json = JsonSerializer.Serialize(model); var content = new StringContent(json, Encoding.UTF8, "application/json"); // 发送 POST 请求 var response = await client.PostAsync("endpoint", content); // 处理响应... }

最佳实践

  1. 使用 IHttpClientFactory

    ASP.NET如何调用外部API?C实现接口调用详细步骤 第1张

    • 避免手动创建 HttpClient(防止套接字耗尽)
    • 自动管理连接生命周期
  2. 配置超时设置

    services.AddHttpClient("ExternalApi", client => { client.Timeout = TimeSpan.FromSeconds(30); });
  3. 添加认证

    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "your_token");
  4. 处理错误响应

    if (!response.IsSuccessStatusCode) { var errorContent = await response.Content.ReadAsStringAsync(); // 记录错误或返回特定错误对象 }
  5. 使用 Polly 实现重试策略(推荐)

    安装包:Microsoft.Extensions.Http.Polly

    services.AddHttpClient("ExternalApi") .AddTransientHttpErrorPolicy(policy => policy.WaitAndRetryAsync(3, _ => TimeSpan.FromSeconds(2)));
  6. 配置 API 地址

    • 在 appsettings.json 中存储: { "ExternalApi": { "BaseUrl": "https://api.example.com/", "ApiKey": "your_key_here" } }
    • 在代码中读取: var config = _configuration.GetSection("ExternalApi"); client.BaseAddress = new Uri(config["BaseUrl"]); client.DefaultRequestHeaders.Add("X-API-Key", config["ApiKey"]);
    • 完整示例(带配置和错误处理)

      public class ExternalApiService { private readonly HttpClient _httpClient; private readonly ILogger<ExternalApiService> _logger; public ExternalApiService( IHttpClientFactory httpClientFactory, IConfiguration config, ILogger<ExternalApiService> logger) { _httpClient = httpClientFactory.CreateClient(); _httpClient.BaseAddress = new Uri(config["ExternalApi:BaseUrl"]); _httpClient.DefaultRequestHeaders.Add("Authorization", config["ExternalApi:ApiKey"]); _logger = logger; } public async Task<ApiResponse> GetDataAsync() { try { var response = await _httpClient.GetAsync("data-endpoint"); response.EnsureSuccessStatusCode(); var content = await response.Content.ReadAsStringAsync(); return JsonSerializer.Deserialize<ApiResponse>(content); } catch (HttpRequestException ex) { _logger.LogError(ex, "API request failed"); return null; } } } // 注册服务 services.AddScoped<ExternalApiService>();

      常见问题解决

      1. 跨域问题 (CORS)

        ASP.NET如何调用外部API?C实现接口调用详细步骤 第2张

        • 外部 API 需配置 CORS 允许你的域名
        • 本地开发时可在 launchSettings.json 配置代理
      2. HTTPS 证书问题

        • 开发环境可忽略证书验证(生产环境禁用): services.AddHttpClient("UnsafeClient").ConfigurePrimaryHttpMessageHandler(() => { return new HttpClientHandler { ServerCertificateCustomValidationCallback = (msg, cert, chain, err) => true }; });
        • 性能优化

          • 复用 HttpClient 实例
          • 使用 IAsyncEnumerable 处理流式响应
          • 压缩请求(Accept-Encoding: gzip)
          • 注意:对于 .NET Framework 项目(非 Core),需使用 WebClient 或手动管理 HttpClient 生命周期,但建议升级到 Core 以获得更好的性能和安全性。

            ASP.NET如何调用外部API?C实现接口调用详细步骤 第3张

0