无法使gRPC在现有ASP.NET核心项目上工作

vfhzx4xs  于 2023-03-04  发布在  .NET
关注(0)|答案(2)|浏览(104)

我正在尝试添加gRPC到一个现有的ASP.NET核心7项目。它是一个旧的代码库,所以它没有使用现代的WebApplication.CreateBuilder(args)方法。
这是我的Configure方法,其中我在端点Map配置中添加了MapGrpcServiceMapGrpcReflectionService

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseHttpsRedirection();

    app.UseOpenApi();
    app.UseSwaggerUi3(c => {
        c.OAuth2Client = new NSwag.AspNetCore.OAuth2ClientSettings() { ClientId = null, ClientSecret = null };
    });

    app.UseCors(c => {
        c.AllowAnyOrigin();
        c.AllowAnyMethod();
        c.AllowAnyHeader();
    });

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapGrpcService<StateStoreService>();
        if (env.IsDevelopment())
            endpoints.MapGrpcReflectionService();
        endpoints.MapControllers();
    });
}

如果我尝试使用Insomnia(REST/gRPC客户端GUI)访问gRPC端点,我会收到错误消息
13 13接收到代码为2的RST_STREAM,由内部客户端错误触发:方案错误
使用命令行工具

./grpcurl -plaintext localhost:5010 data_provider_service.v1.StateStore/ReadStates

我得到
无法拨打目标主机"localhost:5010":超出上下文截止日期
有趣的是,在某个时候gRPC服务是工作的(我认为使用相同的代码-它的行为似乎有点不确定),但随后常规HTTP请求确实失败了,并在浏览器中出现CORS错误。

    • 问题:**

我需要如何配置我的应用,以便gRPC端点和我现有的HTTP端点同时工作?

    • 更新日期:**

这似乎是协议不匹配引起的问题。所以让我给你一些更多的背景:我正在将gRPC添加到一个提供不安全HTTP API的遗留应用程序中。为了向后兼容,这不应该更改为HTTPS。所以我想问题可以归结为:我的应用如何同时提供不安全的HTTP API(显然需要HTTP/1.1)和gRPC API(显然需要HTTP/2)?

rkttyhzu

rkttyhzu1#

HTPP 1.1和gRPC都有API是可能的,但不太可能是同一个,您需要为它们各自构建API。

kqlmhetl

kqlmhetl2#

解决办法其实简单明了。
我的ASP.NET核心应用程序继续侦听现有端口上的HTTP连接,因此现有客户端不会中断。
此外,它监听HTTPS连接的新端口,支持来自新客户端的REST调用和gRPC调用。

相关问题