如何修复.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#规定一个项目只能有一个编译单元包含这类语句。
具体修复步骤:
- 检查对应项目(服务端或客户端),确认是否除了当前Program.cs外,还有其他
.cs文件也使用了顶级语句。 - 若存在多余的顶级语句文件,要么删除该文件,要么将其中的顶级语句封装到类的方法中(比如
static async Task Main()方法)。 - 注意:客户端代码中的
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
相关产品推荐
相关产品推荐

