在.net core应用开发中,和外部系统、第三方接口进行交互时,发起http请求是必不可少的操作,.net core提供了多种实现http请求的方式,开发者可以根据项目场景选择合适的方案。

使用HttpClient发起基础http请求
HttpClient是.net core中最常用的http请求工具,位于System.Net.Http命名空间下,支持GET、POST、PUT、DELETE等常见请求方法,使用起来比较灵活。
GET请求示例
发起GET请求获取接口返回的文本内容的代码如下:
using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
// 创建HttpClient实例
using (HttpClient client = new HttpClient())
{
// 设置请求超时时间,单位秒
client.Timeout = TimeSpan.FromSeconds(30);
try
{
// 发起GET请求,获取响应内容
string result = await client.GetStringAsync("http://ipipp.com/api/test/get");
Console.WriteLine($"GET请求返回结果:{result}");
}
catch (HttpRequestException ex)
{
Console.WriteLine($"请求发生异常:{ex.Message}");
}
}
}
}
POST请求示例
发起POST请求提交JSON数据的代码如下:
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
using (HttpClient client = new HttpClient())
{
client.Timeout = TimeSpan.FromSeconds(30);
// 构造要提交的JSON数据
string jsonContent = "{"name":"test","age":20}";
// 创建StringContent,指定编码和媒体类型
StringContent content = new StringContent(jsonContent, Encoding.UTF8, "application/json");
try
{
// 发起POST请求
HttpResponseMessage response = await client.PostAsync("http://ipipp.com/api/test/post", content);
// 确保响应成功
response.EnsureSuccessStatusCode();
// 读取响应内容
string responseText = await response.Content.ReadAsStringAsync();
Console.WriteLine($"POST请求返回结果:{responseText}");
}
catch (HttpRequestException ex)
{
Console.WriteLine($"请求发生异常:{ex.Message}");
}
}
}
}
使用IHttpClientFactory管理HttpClient
直接使用new HttpClient()的方式容易出现端口耗尽的问题,因为在高并发场景下频繁创建和释放HttpClient实例,会导致大量TIME_WAIT状态的连接。.net core提供了IHttpClientFactory来统一管理HttpClient的生命周期,避免这类问题。
注册IHttpClientFactory
在Program.cs中注册相关服务的代码如下:
using Microsoft.Extensions.DependencyInjection;
using System;
class Program
{
static void Main(string[] args)
{
IServiceCollection services = new ServiceCollection();
// 注册IHttpClientFactory
services.AddHttpClient();
// 也可以注册命名化的HttpClient,配置特定的基础地址和超时时间
services.AddHttpClient("testClient", client =>
{
client.BaseAddress = new Uri("http://ipipp.com/api/test/");
client.Timeout = TimeSpan.FromSeconds(20);
});
IServiceProvider serviceProvider = services.BuildServiceProvider();
// 后续通过serviceProvider获取IHttpClientFactory实例使用
}
}
使用IHttpClientFactory发起请求
注入IHttpClientFactory后发起请求的代码如下:
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Net.Http;
using System.Threading.Tasks;
class TestService
{
private readonly IHttpClientFactory _httpClientFactory;
// 构造函数注入IHttpClientFactory
public TestService(IHttpClientFactory httpClientFactory)
{
_httpClientFactory = httpClientFactory;
}
public async Task SendGetRequest()
{
// 获取默认的HttpClient实例
HttpClient client = _httpClientFactory.CreateClient();
try
{
string result = await client.GetStringAsync("http://ipipp.com/api/test/get");
Console.WriteLine($"请求结果:{result}");
}
catch (HttpRequestException ex)
{
Console.WriteLine($"请求异常:{ex.Message}");
}
}
public async Task SendNamedClientRequest()
{
// 获取命名注册的HttpClient实例,已经配置了基础地址
HttpClient client = _httpClientFactory.CreateClient("testClient");
try
{
// 这里的地址会拼接基础地址
string result = await client.GetStringAsync("getdata");
Console.WriteLine($"命名客户端请求结果:{result}");
}
catch (HttpRequestException ex)
{
Console.WriteLine($"请求异常:{ex.Message}");
}
}
}
使用HttpWebRequest发起请求
HttpWebRequest是更早的.net框架中的http请求类,在.net core中也得到了支持,适合需要兼容旧代码的场景,不过功能上不如HttpClient完善,新开发的项目更推荐使用HttpClient相关方案。
使用HttpWebRequest发起GET请求的代码如下:
using System;
using System.IO;
using System.Net;
class Program
{
static void Main(string[] args)
{
// 创建HttpWebRequest实例
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://ipipp.com/api/test/get");
// 设置请求方法
request.Method = "GET";
// 设置超时时间,单位毫秒
request.Timeout = 30000;
try
{
// 获取响应
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
// 读取响应流内容
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
string result = reader.ReadToEnd();
Console.WriteLine($"HttpWebRequest请求结果:{result}");
}
}
}
catch (WebException ex)
{
Console.WriteLine($"请求发生异常:{ex.Message}");
}
}
}
常见操作说明
- 添加请求头:使用HttpClient的
DefaultRequestHeaders.Add方法可以添加自定义请求头,比如添加认证token、User-Agent等。 - 处理响应状态码:通过
HttpResponseMessage.StatusCode可以获取响应状态码,判断请求是否成功。 - 提交表单数据:可以使用
FormUrlEncodedContent类构造表单格式的请求内容,媒体类型为application/x-www-form-urlencoded。
方案对比
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 原生HttpClient | 使用简单,无需额外配置 | 高并发下易出现端口耗尽问题 | 低频请求、简单测试场景 |
| IHttpClientFactory | 管理生命周期,避免端口耗尽,支持配置化 | 需要依赖注入框架,配置略复杂 | 生产环境、高并发请求场景 |
| HttpWebRequest | 兼容旧代码,功能细致 | API设计老旧,使用繁琐 | 旧项目迁移、需要兼容老代码的场景 |
HttpClientHttpWebRequestIHttpClientFactoryhttp请求修改时间:2026-06-23 06:42:33