如何在ASP.NET Core 6同一端口同时运行REST API与gRPC
在ASP.NET Core 6中让gRPC与REST API共用同一端口的解决方案
问题根源
你之前把Kestrel端点默认协议设为Http2,导致端口仅支持HTTP/2请求——而REST API通常基于HTTP/1.1通信,自然无法正常响应;移除配置后端口默认仅支持HTTP/1.1,又满足不了gRPC对HTTP/2的依赖,所以才会出现两者不能同时工作的情况。核心解决思路是让同一端口同时兼容HTTP/1.1和HTTP/2两种协议。
具体配置步骤
修改appsettings.json配置
将Kestrel的默认协议改为Http1AndHttp2,让端口同时处理两种协议的请求:{ "urls": "http://localhost:5000", "Kestrel": { "EndpointDefaults": { "Protocols": "Http1AndHttp2" } } }确保Program.cs中服务与中间件配置正确
需要同时注册gRPC和REST相关服务,并正确映射端点:var builder = WebApplication.CreateBuilder(args); // 注册gRPC服务 builder.Services.AddGrpc(); // 注册REST控制器服务(如果用Controller编写API) builder.Services.AddControllers(); var app = builder.Build(); app.UseRouting(); app.UseEndpoints(endpoints => { // 映射你的gRPC实现类 endpoints.MapGrpcService<YourGrpcServiceImpl>(); // 映射REST控制器路由 endpoints.MapControllers(); }); app.Run();
补充说明
- 如果使用HTTPS(生产环境推荐),Kestrel会通过ALPN协议协商自动支持HTTP/1.1和HTTP/2,不需要额外设置
Protocols。 - 若gRPC客户端连接HTTP端口时出现异常,需确认客户端允许使用不加密的HTTP/2(部分客户端默认仅支持HTTPS环境下的HTTP/2)。
内容的提问来源于stack exchange,提问作者Hadi Samadzad
相关产品推荐
相关产品推荐

