在.net core下如何进行http请求

来源:安卓APP网作者:卡拉米头衔:草根站长
导读:本期聚焦于小伙伴创作的《在.net core下如何进行http请求》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《在.net core下如何进行http请求》有用,将其分享出去将是对创作者最好的鼓励。

在.net core应用开发中,和外部系统、第三方接口进行交互时,发起http请求是必不可少的操作,.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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。