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

如何修复.NET 6中创建HTTP3示例项目时的CS8802顶级语句错误

解决CS8802:仅允许一个编译单元包含顶级语句错误

我在.NET 6环境下创建C# HTTP3示例项目时,遇到如下错误:

Error CS8802 Only one compilation unit can have top-level statements.

服务端Program.cs代码(错误出现在var builder行)

using Microsoft.AspNetCore.Server.Kestrel.Core;
// This namespace contains the IPAddress type
using System.Net;

var builder = WebApplication.CreateBuilder(args);

// Configure kestrel (the web server)
builder.WebHost.ConfigureKestrel((context, options) =>
{
    // Listen on port 5001
    options.Listen(IPAddress.Any, 5001, listenOptions =>
    {
        // Serve traffic using HTTP/2 or HTTP/3
        listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
        // Use HTTPS
        listenOptions.UseHttps();
    });
});

var app = builder.Build();


// Configure the root to also accept GET requests
app.MapGet("/", () => $"The time on the server is {DateTime.Now}");

app.Run();

客户端Program.cs代码

using System.Net;

// Create a handler to turn off SSL validation
//var EndPoint = "https://192.168.0.1/api";
var httpClientHandler = new HttpClientHandler();

httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, sslPolicyErrors) =>
{
    return true;
};
//HttpClient = new HttpClient(httpClientHandler) { };

// Create a new HttpClient and wire it to our handler
var client = new HttpClient(httpClientHandler)
{
    //BaseAddress = new Uri(EndPoint),
    // Specify that requests should be for HTTP/3
    DefaultRequestVersion = HttpVersion.Version30,
    DefaultVersionPolicy = HttpVersionPolicy.RequestVersionExact
};


// Get our response
var response = await client.GetAsync("https://localhost:5001/");
// Read the body
var body = await response.Content.ReadAsStringAsync();


// Print the relevant headers to verify our results
Console.WriteLine($"HTTP Version: {response.Version}");
Console.WriteLine($"Status: {response.StatusCode}");
Console.WriteLine($"Body: {body}");

解决方法

CS8802错误的核心是同一项目中存在多个包含顶级语句的文件。顶级语句指直接写在命名空间、类之外的代码(比如两段代码里的var builder、var httpClientHandler),C#规定一个项目只能有一个编译单元包含这类语句。

具体修复步骤:

  1. 检查对应项目(服务端或客户端),确认是否除了当前Program.cs外,还有其他.cs文件也使用了顶级语句。
  2. 若存在多余的顶级语句文件,要么删除该文件,要么将其中的顶级语句封装到类的方法中(比如static async Task Main()方法)。
  3. 注意:客户端代码中的await直接用于顶级语句时,需确保项目使用C# 9及以上版本(.NET 6默认支持,无需额外配置)。

以客户端代码为例,将顶级语句封装到类中:

using System.Net;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var httpClientHandler = new HttpClientHandler();
        httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, sslPolicyErrors) => true;

        var client = new HttpClient(httpClientHandler)
        {
            DefaultRequestVersion = HttpVersion.Version30,
            DefaultVersionPolicy = HttpVersionPolicy.RequestVersionExact
        };

        var response = await client.GetAsync("https://localhost:5001/");
        var body = await response.Content.ReadAsStringAsync();

        Console.WriteLine($"HTTP Version: {response.Version}");
        Console.WriteLine($"Status: {response.StatusCode}");
        Console.WriteLine($"Body: {body}");
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 12:33:17