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

.NET Core 3.1项目中如何请求外部网站数据?代码遇阻求助

.NET Core 3.1 获取外部网站数据的解决方案

1. 现有代码的问题

你当前的Main方法是用来启动ASP.NET Core Web主机的逻辑,完全不是编写外部请求的正确位置,这也是你无法实现需求的核心原因。

2. 正确实现步骤

步骤1:注入HttpClient

在Startup.cs的ConfigureServices方法中注册HttpClient,这是.NET Core官方推荐的HTTP请求方式:

public void ConfigureServices(IServiceCollection services)
{
    // 注册HttpClient供后续调用
    services.AddHttpClient();
    
    // 其他必要服务注册,比如MVC/Web API
    services.AddControllers();
}

步骤2:编写请求逻辑

请求逻辑可以放在控制器、后台服务或自定义业务服务中,以下是两种常见场景:

场景1:Web项目控制器中获取数据

创建控制器并注入IHttpClientFactory来发送请求:

public class ExternalDataController : ControllerBase
{
    private readonly IHttpClientFactory _httpClientFactory;

    public ExternalDataController(IHttpClientFactory httpClientFactory)
    {
        _httpClientFactory = httpClientFactory;
    }

    [HttpGet("fetch-external-data")]
    public async Task<IActionResult> FetchExternalData()
    {
        var client = _httpClientFactory.CreateClient();
        // 注意:URL中的#锚点是浏览器端标记,HTTP请求不会携带,需直接去除
        var targetUrl = "https://www.balldontlie.io/#players".Split('#')[0];
        
        try
        {
            var response = await client.GetAsync(targetUrl);
            response.EnsureSuccessStatusCode(); // 确保请求返回成功状态码
            
            // 获取目标网站的原始HTML内容
            var htmlContent = await response.Content.ReadAsStringAsync();
            
            // 这里可对HTML进行解析提取(例如用HtmlAgilityPack库)
            return Ok(htmlContent);
        }
        catch (HttpRequestException ex)
        {
            // 处理请求异常
            return BadRequest($"请求失败:{ex.Message}");
        }
    }
}

场景2:控制台项目中直接获取数据

如果你的项目是控制台应用,无需启动Web主机,直接在Main方法中处理(生产环境仍推荐用IHttpClientFactory):

public static async Task Main(string[] args)
{
    using var client = new HttpClient();
    var targetUrl = "https://www.balldontlie.io/#players".Split('#')[0];
    
    try
    {
        var response = await client.GetAsync(targetUrl);
        response.EnsureSuccessStatusCode();
        var htmlContent = await response.Content.ReadAsStringAsync();
        Console.WriteLine(htmlContent);
    }
    catch (HttpRequestException ex)
    {
        Console.WriteLine($"请求失败:{ex.Message}");
    }
}

步骤3:HTML内容解析(可选)

如果需要从HTML中提取特定数据,可使用HtmlAgilityPack库,先通过NuGet安装:

Install-Package HtmlAgilityPack

然后在代码中解析:

var htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(htmlContent);
// 示例:提取页面中所有链接文本
var linkTexts = htmlDoc.DocumentNode.SelectNodes("//a")?.Select(node => node.InnerText);

3. 关键注意事项

  • URL中的#锚点仅作用于浏览器端定位,HTTP请求不会将其发送到服务器,请求时必须去除。
  • 后端发起的HTTP请求不受浏览器跨域限制,但需确保目标网站未封禁你的请求IP。
  • 生产环境必须使用IHttpClientFactory而非直接实例化HttpClient,避免socket资源耗尽问题。

内容的提问来源于stack exchange,提问作者NO123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 22:50:26