Dela via


gRPC-Web i ASP.NET Core gRPC-applikationer

Note

Det här är inte den senaste versionen av den här artikeln. För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

Warning

Den här versionen av ASP.NET Core stöds inte längre. Mer information finns i supportpolicyn för .NET och .NET Core. För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

Important

Den här informationen gäller en förhandsversionsprodukt som kan ändras avsevärt innan den släpps kommersiellt. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, med avseende på den information som tillhandahålls här.

För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

Av James Newton-King

Lär dig hur du konfigurerar en befintlig ASP.NET Core gRPC-tjänst så att den kan anropas från webbläsarappar med hjälp av gRPC-Web-protokollet . gRPC-Web tillåter javaScript i webbläsaren och Blazor appar att anropa gRPC-tjänster. Det går inte att anropa en HTTP/2 gRPC-tjänst från en webbläsarbaserad app. gRPC-tjänster som finns i ASP.NET Core kan konfigureras för att stödja gRPC-Web tillsammans med HTTP/2 gRPC.

Anvisningar om hur du lägger till en gRPC-tjänst i en befintlig ASP.NET Core-app finns i Lägga till gRPC-tjänster i en ASP.NET Core-app.

Anvisningar om hur du skapar ett gRPC-projekt finns i Skapa en .NET gRPC-klient och -server i ASP.NET Core.

ASP.NET Core gRPC-Web kontra Envoy

Det finns två alternativ för hur du lägger till gRPC-Web i en ASP.NET Core-app:

  • Stöd för gRPC-Web tillsammans med gRPC HTTP/2 i ASP.NET Core. Det här alternativet använder mellanprogram som tillhandahålls av Grpc.AspNetCore.Web paketet.
  • Använd envoyproxyns gRPC-Web-stöd för att översätta gRPC-Web till gRPC HTTP/2. Det översatta anropet vidarebefordras sedan till ASP.NET Core-appen.

Det finns för- och nackdelar med varje metod. Om en apps miljö redan använder Envoy som proxy kan det vara klokt att även använda Envoy för att tillhandahålla stöd för gRPC-Web. För en grundläggande lösning för gRPC-Web som bara kräver ASP.NET Core är Grpc.AspNetCore.Web ett bra val.

Konfigurera gRPC-Web i ASP.NET Core

gRPC-tjänster som finns i ASP.NET Core kan konfigureras för att stödja gRPC-Web tillsammans med HTTP/2 gRPC. gRPC-Web kräver inga ändringar i tjänsterna. Den enda ändringen är att ange mellanprogrammet i Program.cs.

Så här aktiverar du gRPC-Web med en ASP.NET Core gRPC-tjänst:

  • Lägg till en referens till Grpc.AspNetCore.Web paketet.
  • Konfigurera appen så att den använder gRPC-Web genom att lägga till UseGrpcWeb och EnableGrpcWeb till Program.cs:
using GrpcGreeter.Services;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddGrpc();

var app = builder.Build();

app.UseGrpcWeb();

app.MapGrpcService<GreeterService>().EnableGrpcWeb();
app.MapGet("/", () => "This gRPC service is gRPC-Web enabled and is " +
    "callable from browser apps using the gRPC-Web protocol");

app.Run();

Föregående kod:

  • Lägger till mellanprogrammet gRPC-Web UseGrpcWeb, efter routning och före slutpunkter.
  • Anger att endpoints.MapGrpcService<GreeterService>() metoden stöder gRPC-Web med EnableGrpcWeb.

Alternativt kan mellanprogrammet gRPC-Web konfigureras så att alla tjänster stöder gRPC-Web som standard och EnableGrpcWeb inte krävs. Ange new GrpcWebOptions { DefaultEnabled = true } när mellanprogrammet läggs till.

using GrpcGreeter.Services;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddGrpc();

var app = builder.Build();

app.UseGrpcWeb(new GrpcWebOptions { DefaultEnabled = true });

app.MapGrpcService<GreeterService>();
app.MapGet("/", () => "All gRPC service are supported by default in " +
    "this example, and are callable from browser apps using the " +
    "gRPC-Web protocol");

app.Run();

Note

Det finns ett känt problem som gör att gRPC-Web misslyckas när den hanteras av HTTP.sys i .NET Core 3.x.

En lösning för att få gRPC-Web att arbeta med HTTP.sys finns i Grpc-web experimental och UseHttpSys()? (grpc/grpc-dotnet #853).

gRPC-Web och CORS

Webbläsarsäkerhet hindrar en webbsida från att göra begäranden till en annan domän än den som hanterade webbsidan. Den här begränsningen gäller för att göra gRPC-web-anrop med webbläsarappar. En webbläsarapp som hanteras av https://www.contoso.com blockeras till exempel från att anropa gRPC-Web-tjänster som finns på https://services.contoso.com. Resursdelning för korsande ursprung (CORS) kan användas för att lätta på den här begränsningen.

Om du vill tillåta att en webbläsarapp gör GRPC-Web-anrop mellan ursprung konfigurerar du CORS i ASP.NET Core. Använd det inbyggda CORS-stödet och exponera gRPC-specifika rubriker med WithExposedHeaders.

using GrpcGreeter.Services;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddGrpc();

builder.Services.AddCors(o => o.AddPolicy("AllowAll", builder =>
{
    builder.AllowAnyOrigin()
            .AllowAnyMethod()
            .AllowAnyHeader()
            .WithExposedHeaders("Grpc-Status", "Grpc-Message", 
                "Grpc-Encoding", "Grpc-Accept-Encoding", 
                "Grpc-Status-Details-Bin");
}));

var app = builder.Build();

app.UseGrpcWeb();
app.UseCors();

app.MapGrpcService<GreeterService>().EnableGrpcWeb()
                                    .RequireCors("AllowAll");

app.MapGet("/", () => "This gRPC service is gRPC-Web enabled, CORS " +
    "enabled, and is callable from browser apps using the gRPC-Web " +
    "protocol");

app.Run();

Föregående kod:

  • Anropar AddCors för att lägga till CORS-tjänster och konfigurera en CORS-princip som exponerar gRPC-specifika huvuden.
  • Anrop UseCors för att lägga till CORS-mellanprogrammet efter routningskonfigurationen och före konfigurationen av slutpunkter.
  • Anger att endpoints.MapGrpcService<GreeterService>() metoden stöder CORS med RequireCors.

gRPC-Web och direktuppspelning

Traditionell gRPC via HTTP/2 stöder klient-, server- och dubbelriktad direktuppspelning. gRPC-Web erbjuder begränsat stöd för direktuppspelning:

  • gRPC-webbläsarklienter stöder inte anropande klientströmning och dubbelriktade strömningsmetoder.
  • gRPC-Web .NET-klienter stöder inte klientströmning och dubbelriktad strömning via HTTP/1.1.
  • ASP.NET Core gRPC-tjänster som finns i Azure App Service och IIS stöder inte dubbelriktad direktuppspelning.

När du använder gRPC-Web rekommenderar vi endast användning av unary-metoder och metoder för serverströmning.

HTTP protocol

ASP.NET Core gRPC-tjänstmallen, som ingår i .NET SDK, skapar en app som endast har konfigurerats för HTTP/2. Detta är en bra standard när en app endast stöder traditionell gRPC via HTTP/2. gRPC-Web fungerar dock med både HTTP/1.1 och HTTP/2. Vissa plattformar, till exempel UWP eller Unity, kan inte använda HTTP/2. Konfigurera servern för att aktivera HTTP/1.1 och HTTP/2 för att stödja alla klientappar.

Uppdatera standardprotokollet i appsettings.json:

{
  "Kestrel": {
    "EndpointDefaults": {
      "Protocols": "Http1AndHttp2"
    }
  }
}

Du kan också konfigurera Kestrel slutpunkter i startkoden.

För att aktivera HTTP/1.1 och HTTP/2 på samma port krävs TLS för protokollförhandling. Mer information finns i ASP.NET Core gRPC-protokollförhandling.

Anropa gRPC-Web från webbläsaren

Webbläsarappar kan använda gRPC-Web för att anropa gRPC-tjänster. Det finns vissa krav och begränsningar när du anropar gRPC-tjänster med gRPC-Web från webbläsaren:

  • Servern måste innehålla konfiguration för att stödja gRPC-Web.
  • Klientströmning och dubbelriktade strömningsanrop stöds inte. Serverströmning stöds.
  • Att anropa gRPC-tjänster på en annan domän kräver CORS-konfiguration på servern.

JavaScript gRPC-Web-klient

Det finns en JavaScript gRPC-Web-klient. Anvisningar om hur du använder gRPC-Web från JavaScript finns i skriva JavaScript-klientkod med gRPC-Web.

Konfigurera gRPC-Web med .NET gRPC-klienten

.NET gRPC-klienten kan konfigureras för att göra gRPC-Web-anrop. Detta är användbart för Blazor WebAssembly appar som finns i webbläsaren och har samma HTTP-begränsningar för JavaScript-kod. Att anropa gRPC-Web med en .NET-klient är detsamma som HTTP/2 gRPC. Den enda ändringen är hur kanalen skapas.

Så här använder du gRPC-Web:

  • Lägg till en referens till Grpc.Net.Client.Web paketet.
  • Kontrollera att referensen till Grpc.Net.Client paketet är version 2.29.0 eller senare.
  • Konfigurera kanalen så att den GrpcWebHandleranvänder :
var channel = GrpcChannel.ForAddress("https://localhost:53305", new GrpcChannelOptions
{
    HttpHandler = new GrpcWebHandler(new HttpClientHandler())
});

var client = new Greeter.GreeterClient(channel);
var response = await client.SayHelloAsync(
                  new HelloRequest { Name = "GreeterClient" });

Föregående kod:

  • Konfigurerar en kanal för att använda gRPC-Web.
  • Skapar en klient och anropar med hjälp av kanalen.

GrpcWebHandler har följande konfigurationsalternativ:

  • InnerHandler: Den underliggande HttpMessageHandler som gör gRPC HTTP-begäran, till exempel HttpClientHandler.
  • GrpcWebMode: En uppräkningstyp som anger om gRPC HTTP-begäran Content-Type är application/grpc-web eller application/grpc-web-text.
    • GrpcWebMode.GrpcWeb konfigurerar sändning av innehåll utan kodning. Default value.
    • GrpcWebMode.GrpcWebText konfigurerar base64-kodat innehåll. Krävs för serverströmningsanrop i webbläsare.

GrpcChannelOptions.HttpVersion och GrpcChannelOptions.HttpVersionPolicy kan användas för att konfigurera HTTP-protokollversionen.

Important

Genererade gRPC-klienter har synkrona och asynkrona metoder för att anropa unary-metoder. Till exempel SayHello är synkron och SayHelloAsync asynkron. Asynkrona metoder krävs alltid i Blazor WebAssembly. Att anropa en synkron metod i en Blazor WebAssembly-app gör att appen blir svarslös.

Använd gRPC-klientfabrik med gRPC-Web

Skapa en .NET-klient som är kompatibel med gRPC-Web med hjälp av gRPC-klientfabriken:

  • Lägg till paketreferenser till projektfilen för följande paket:
  • Registrera en gRPC-klient med beroendeinmatning (DI) med hjälp av den generiska AddGrpcClient tilläggsmetoden. I en Blazor WebAssembly app registreras tjänster med DI i Program.cs.
  • Konfigurera GrpcWebHandler med hjälp av ConfigurePrimaryHttpMessageHandler tilläggsmetoden.
builder.Services
    .AddGrpcClient<Greet.GreeterClient>(options =>
    {
        options.Address = new Uri("https://localhost:5001");
    })
    .ConfigurePrimaryHttpMessageHandler(
        () => new GrpcWebHandler(new HttpClientHandler()));

Mer information finns i gRPC-klientfabriksintegrering i .NET.

Additional resources

Lär dig hur du konfigurerar en befintlig ASP.NET Core gRPC-tjänst så att den kan anropas från webbläsarappar med hjälp av gRPC-Web-protokollet . gRPC-Web tillåter javaScript i webbläsaren och Blazor appar att anropa gRPC-tjänster. Det går inte att anropa en HTTP/2 gRPC-tjänst från en webbläsarbaserad app. gRPC-tjänster som finns i ASP.NET Core kan konfigureras för att stödja gRPC-Web tillsammans med HTTP/2 gRPC.

Anvisningar om hur du lägger till en gRPC-tjänst i en befintlig ASP.NET Core-app finns i Lägga till gRPC-tjänster i en ASP.NET Core-app.

Anvisningar om hur du skapar ett gRPC-projekt finns i Skapa en .NET gRPC-klient och -server i ASP.NET Core.

ASP.NET Core gRPC-Web kontra Envoy

Det finns två alternativ för hur du lägger till gRPC-Web i en ASP.NET Core-app:

  • Stöd för gRPC-Web tillsammans med gRPC HTTP/2 i ASP.NET Core. Det här alternativet använder mellanprogram som tillhandahålls av Grpc.AspNetCore.Web paketet.
  • Använd envoyproxyns gRPC-Web-stöd för att översätta gRPC-Web till gRPC HTTP/2. Det översatta anropet vidarebefordras sedan till ASP.NET Core-appen.

Det finns för- och nackdelar med varje metod. Om en apps miljö redan använder Envoy som proxy kan det vara klokt att även använda Envoy för att tillhandahålla stöd för gRPC-Web. För en grundläggande lösning för gRPC-Web som bara kräver ASP.NET Core är Grpc.AspNetCore.Web ett bra val.

Konfigurera gRPC-Web i ASP.NET Core

gRPC-tjänster som finns i ASP.NET Core kan konfigureras för att stödja gRPC-Web tillsammans med HTTP/2 gRPC. gRPC-Web kräver inga ändringar i tjänsterna. Den enda ändringen är att ange middelware i Program.cs.

Så här aktiverar du gRPC-Web med en ASP.NET Core gRPC-tjänst:

  • Lägg till en referens till Grpc.AspNetCore.Web paketet.
  • Konfigurera appen så att den använder gRPC-Web genom att lägga till UseGrpcWeb och EnableGrpcWeb till Program.cs:
using GrpcGreeter.Services;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddGrpc();

var app = builder.Build();

app.UseGrpcWeb();

app.MapGrpcService<GreeterService>().EnableGrpcWeb();
app.MapGet("/", () => "This gRPC service is gRPC-Web enabled and is callable from browser apps using the gRPC-Web protocol");

app.Run();

Föregående kod:

  • Lägger till mellanprogrammet gRPC-Web UseGrpcWeb, efter routning och före slutpunkter.
  • Anger att endpoints.MapGrpcService<GreeterService>() metoden stöder gRPC-Web med EnableGrpcWeb.

Alternativt kan mellanprogrammet gRPC-Web konfigureras så att alla tjänster stöder gRPC-Web som standard och EnableGrpcWeb inte krävs. Ange new GrpcWebOptions { DefaultEnabled = true } när mellanprogrammet läggs till.

using GrpcGreeter.Services;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddGrpc();

var app = builder.Build();

app.UseGrpcWeb(new GrpcWebOptions { DefaultEnabled = true });

app.MapGrpcService<GreeterService>();
app.MapGet("/", () => "All gRPC service are supported by default in " +
    "this example, and are callable from browser apps using the " +
    "gRPC-Web protocol");

app.Run();

Note

Det finns ett känt problem som gör att gRPC-Web misslyckas när den hanteras av HTTP.sys i .NET Core 3.x.

En lösning för att få gRPC-Web att arbeta med HTTP.sys finns i Grpc-web experimental och UseHttpSys()? (grpc/grpc-dotnet #853).

gRPC-Web och CORS

Webbläsarsäkerhet hindrar en webbsida från att göra begäranden till en annan domän än den som hanterade webbsidan. Den här begränsningen gäller för att göra gRPC-web-anrop med webbläsarappar. En webbläsarapp som hanteras av https://www.contoso.com blockeras till exempel från att anropa gRPC-Web-tjänster som finns på https://services.contoso.com. Resursdelning för korsande ursprung (CORS) kan användas för att lätta på den här begränsningen.

Om du vill tillåta att en webbläsarapp gör GRPC-Web-anrop mellan ursprung konfigurerar du CORS i ASP.NET Core. Använd det inbyggda CORS-stödet och exponera gRPC-specifika rubriker med WithExposedHeaders.

using GrpcGreeter.Services;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddGrpc();

builder.Services.AddCors(o => o.AddPolicy("AllowAll", builder =>
{
    builder.AllowAnyOrigin()
            .AllowAnyMethod()
            .AllowAnyHeader()
            .WithExposedHeaders("Grpc-Status", "Grpc-Message", 
                "Grpc-Encoding", "Grpc-Accept-Encoding", 
                "Grpc-Status-Details-Bin");
}));

var app = builder.Build();

app.UseGrpcWeb();
app.UseCors();

app.MapGrpcService<GreeterService>().EnableGrpcWeb()
                                    .RequireCors("AllowAll");

app.MapGet("/", () => "This gRPC service is gRPC-Web enabled, CORS " +
    "enabled, and is callable from browser apps using the gRPC-Web " +
    "protocol");

app.Run();

Föregående kod:

  • Anropar AddCors för att lägga till CORS-tjänster och konfigurera en CORS-princip som exponerar gRPC-specifika huvuden.
  • Anrop UseCors för att lägga till CORS-mellanprogrammet efter routningskonfigurationen och före konfigurationen av slutpunkter.
  • Anger att endpoints.MapGrpcService<GreeterService>() metoden stöder CORS med RequireCors.

gRPC-Web och direktuppspelning

Traditionell gRPC via HTTP/2 stöder klient-, server- och dubbelriktad direktuppspelning. gRPC-Web erbjuder begränsat stöd för direktuppspelning:

  • gRPC-webbläsarklienter stöder inte anropande klientströmning och dubbelriktade strömningsmetoder.
  • gRPC-Web .NET-klienter stöder inte klientströmning och dubbelriktad strömning via HTTP/1.1.
  • ASP.NET Core gRPC-tjänster som finns i Azure App Service och IIS stöder inte dubbelriktad direktuppspelning.

När du använder gRPC-Web rekommenderar vi endast användning av unary-metoder och metoder för serverströmning.

HTTP protocol

ASP.NET Core gRPC-tjänstmallen, som ingår i .NET SDK, skapar en app som endast har konfigurerats för HTTP/2. Detta är en bra standard när en app endast stöder traditionell gRPC via HTTP/2. gRPC-Web fungerar dock med både HTTP/1.1 och HTTP/2. Vissa plattformar, till exempel UWP eller Unity, kan inte använda HTTP/2. Konfigurera servern för att aktivera HTTP/1.1 och HTTP/2 för att stödja alla klientappar.

Uppdatera standardprotokollet i appsettings.json:

{
  "Kestrel": {
    "EndpointDefaults": {
      "Protocols": "Http1AndHttp2"
    }
  }
}

Du kan också konfigurera Kestrel slutpunkter i startkoden.

För att aktivera HTTP/1.1 och HTTP/2 på samma port krävs TLS för protokollförhandling. Mer information finns i ASP.NET Core gRPC-protokollförhandling.

Anropa gRPC-Web från webbläsaren

Webbläsarappar kan använda gRPC-Web för att anropa gRPC-tjänster. Det finns vissa krav och begränsningar när du anropar gRPC-tjänster med gRPC-Web från webbläsaren:

  • Servern måste innehålla konfiguration för att stödja gRPC-Web.
  • Klientströmning och dubbelriktade strömningsanrop stöds inte. Serverströmning stöds.
  • Att anropa gRPC-tjänster på en annan domän kräver CORS-konfiguration på servern.

JavaScript gRPC-Web-klient

Det finns en JavaScript gRPC-Web-klient. Anvisningar om hur du använder gRPC-Web från JavaScript finns i skriva JavaScript-klientkod med gRPC-Web.

Konfigurera gRPC-Web med .NET gRPC-klienten

.NET gRPC-klienten kan konfigureras för att göra gRPC-Web-anrop. Detta är användbart för Blazor WebAssembly appar som finns i webbläsaren och har samma HTTP-begränsningar för JavaScript-kod. Att anropa gRPC-Web med en .NET-klient är detsamma som HTTP/2 gRPC. Den enda ändringen är hur kanalen skapas.

Så här använder du gRPC-Web:

  • Lägg till en referens till Grpc.Net.Client.Web paketet.
  • Kontrollera att referensen till Grpc.Net.Client paketet är version 2.29.0 eller senare.
  • Konfigurera kanalen så att den GrpcWebHandleranvänder :
var channel = GrpcChannel.ForAddress("https://localhost:53305", new GrpcChannelOptions
{
    HttpHandler = new GrpcWebHandler(new HttpClientHandler())
});

var client = new Greeter.GreeterClient(channel);
var response = await client.SayHelloAsync(
                  new HelloRequest { Name = "GreeterClient" });

Föregående kod:

  • Konfigurerar en kanal för att använda gRPC-Web.
  • Skapar en klient och anropar med hjälp av kanalen.

GrpcWebHandler har följande konfigurationsalternativ:

  • InnerHandler: Den underliggande HttpMessageHandler som gör gRPC HTTP-begäran, till exempel HttpClientHandler.
  • GrpcWebMode: En uppräkningstyp som anger om gRPC HTTP-begäran Content-Type är application/grpc-web eller application/grpc-web-text.
    • GrpcWebMode.GrpcWeb konfigurerar sändning av innehåll utan kodning. Default value.
    • GrpcWebMode.GrpcWebText konfigurerar base64-kodat innehåll. Krävs för serverströmningsanrop i webbläsare.
  • HttpVersion: HTTP-protokoll Version som används för att ange HttpRequestMessage.Version den underliggande gRPC HTTP-begäran. gRPC-Web kräver ingen specifik version och åsidosätter inte standardvärdet om det inte anges.

Important

Genererade gRPC-klienter har synkrona och asynkrona metoder för att anropa unary-metoder. Till exempel SayHello är synkron och SayHelloAsync asynkron. Asynkrona metoder krävs alltid i Blazor WebAssembly. Att anropa en synkron metod i en Blazor WebAssembly-app gör att appen blir svarslös.

Använd gRPC-klientfabrik med gRPC-Web

Skapa en .NET-klient som är kompatibel med gRPC-Web med hjälp av gRPC-klientfabriken:

  • Lägg till paketreferenser till projektfilen för följande paket:
  • Registrera en gRPC-klient med beroendeinmatning (DI) med hjälp av den generiska AddGrpcClient tilläggsmetoden. I en Blazor WebAssembly app registreras tjänster med DI i Program.cs.
  • Konfigurera GrpcWebHandler med hjälp av ConfigurePrimaryHttpMessageHandler tilläggsmetoden.
builder.Services
    .AddGrpcClient<Greet.GreeterClient>(options =>
    {
        options.Address = new Uri("https://localhost:5001");
    })
    .ConfigurePrimaryHttpMessageHandler(
        () => new GrpcWebHandler(new HttpClientHandler()));

Mer information finns i gRPC-klientfabriksintegrering i .NET.

Additional resources

Lär dig hur du konfigurerar en befintlig ASP.NET Core gRPC-tjänst så att den kan anropas från webbläsarappar med hjälp av gRPC-Web-protokollet . gRPC-Web tillåter javaScript i webbläsaren och Blazor appar att anropa gRPC-tjänster. Det går inte att anropa en HTTP/2 gRPC-tjänst från en webbläsarbaserad app. gRPC-tjänster som finns i ASP.NET Core kan konfigureras för att stödja gRPC-Web tillsammans med HTTP/2 gRPC.

Anvisningar om hur du lägger till en gRPC-tjänst i en befintlig ASP.NET Core-app finns i Lägga till gRPC-tjänster i en ASP.NET Core-app.

Anvisningar om hur du skapar ett gRPC-projekt finns i Skapa en .NET gRPC-klient och -server i ASP.NET Core.

ASP.NET Core gRPC-Web kontra Envoy

Det finns två alternativ för hur du lägger till gRPC-Web i en ASP.NET Core-app:

  • Stöd för gRPC-Web tillsammans med gRPC HTTP/2 i ASP.NET Core. Det här alternativet använder mellanprogram som tillhandahålls av Grpc.AspNetCore.Web paketet.
  • Använd envoyproxyns gRPC-Web-stöd för att översätta gRPC-Web till gRPC HTTP/2. Det översatta anropet vidarebefordras sedan till ASP.NET Core-appen.

Det finns för- och nackdelar med varje metod. Om en apps miljö redan använder Envoy som proxy kan det vara klokt att även använda Envoy för att tillhandahålla stöd för gRPC-Web. För en grundläggande lösning för gRPC-Web som bara kräver ASP.NET Core är Grpc.AspNetCore.Web ett bra val.

Konfigurera gRPC-Web i ASP.NET Core

gRPC-tjänster som finns i ASP.NET Core kan konfigureras för att stödja gRPC-Web tillsammans med HTTP/2 gRPC. gRPC-Web kräver inga ändringar i tjänsterna. Den enda ändringen är startkonfigurationen.

Så här aktiverar du gRPC-Web med en ASP.NET Core gRPC-tjänst:

  • Lägg till en referens till Grpc.AspNetCore.Web paketet.
  • Konfigurera appen så att den använder gRPC-Web genom att lägga till UseGrpcWeb och EnableGrpcWeb till Startup.cs:
public void ConfigureServices(IServiceCollection services)
{
    services.AddGrpc();
}

public void Configure(IApplicationBuilder app)
{
    app.UseRouting();

    app.UseGrpcWeb(); // Must be added between UseRouting and UseEndpoints

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapGrpcService<GreeterService>().EnableGrpcWeb();
    });
}

Föregående kod:

  • Lägger till mellanprogrammet gRPC-Web UseGrpcWeb, efter routning och före slutpunkter.
  • Anger att endpoints.MapGrpcService<GreeterService>() metoden stöder gRPC-Web med EnableGrpcWeb.

Alternativt kan mellanprogrammet gRPC-Web konfigureras så att alla tjänster stöder gRPC-Web som standard och EnableGrpcWeb inte krävs. Ange new GrpcWebOptions { DefaultEnabled = true } när mellanprogrammet läggs till.

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddGrpc();
    }

    public void Configure(IApplicationBuilder app)
    {
        app.UseRouting();

        app.UseGrpcWeb(new GrpcWebOptions { DefaultEnabled = true });

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapGrpcService<GreeterService>();
        });
    }
}

Note

Det finns ett känt problem som gör att gRPC-Web misslyckas när den hanteras av HTTP.sys i .NET Core 3.x.

En lösning för att få gRPC-Web att arbeta med HTTP.sys finns i Grpc-web experimental och UseHttpSys()? (grpc/grpc-dotnet #853).

gRPC-Web och CORS

Webbläsarsäkerhet hindrar en webbsida från att göra begäranden till en annan domän än den som hanterade webbsidan. Den här begränsningen gäller för att göra gRPC-web-anrop med webbläsarappar. En webbläsarapp som hanteras av https://www.contoso.com blockeras till exempel från att anropa gRPC-Web-tjänster som finns på https://services.contoso.com. Resursdelning för korsande ursprung (CORS) kan användas för att lätta på den här begränsningen.

Om du vill tillåta att en webbläsarapp gör GRPC-Web-anrop mellan ursprung konfigurerar du CORS i ASP.NET Core. Använd det inbyggda CORS-stödet och exponera gRPC-specifika rubriker med WithExposedHeaders.

public void ConfigureServices(IServiceCollection services)
{
    services.AddGrpc();

    services.AddCors(o => o.AddPolicy("AllowAll", builder =>
    {
        builder.AllowAnyOrigin()
               .AllowAnyMethod()
               .AllowAnyHeader()
               .WithExposedHeaders("Grpc-Status", "Grpc-Message", "Grpc-Encoding", "Grpc-Accept-Encoding");
    }));
}

public void Configure(IApplicationBuilder app)
{
    app.UseRouting();

    app.UseGrpcWeb();
    app.UseCors();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapGrpcService<GreeterService>().EnableGrpcWeb()
                                                  .RequireCors("AllowAll");
    });
}

Föregående kod:

  • Anropar AddCors för att lägga till CORS-tjänster och konfigurera en CORS-princip som exponerar gRPC-specifika huvuden.
  • Anrop UseCors för att lägga till CORS-mellanprogrammet efter routningskonfigurationen och före konfigurationen av slutpunkter.
  • Anger att endpoints.MapGrpcService<GreeterService>() metoden stöder CORS med RequireCors.

gRPC-Web och direktuppspelning

Traditionell gRPC via HTTP/2 stöder klient-, server- och dubbelriktad direktuppspelning. gRPC-Web erbjuder begränsat stöd för direktuppspelning:

  • gRPC-webbläsarklienter stöder inte anropande klientströmning och dubbelriktade strömningsmetoder.
  • gRPC-Web .NET-klienter stöder inte klientströmning och dubbelriktad strömning via HTTP/1.1.
  • ASP.NET Core gRPC-tjänster som finns i Azure App Service och IIS stöder inte dubbelriktad direktuppspelning.

När du använder gRPC-Web rekommenderar vi endast användning av unary-metoder och metoder för serverströmning.

HTTP protocol

ASP.NET Core gRPC-tjänstmallen, som ingår i .NET SDK, skapar en app som endast har konfigurerats för HTTP/2. Detta är en bra standard när en app endast stöder traditionell gRPC via HTTP/2. gRPC-Web fungerar dock med både HTTP/1.1 och HTTP/2. Vissa plattformar, till exempel UWP eller Unity, kan inte använda HTTP/2. Konfigurera servern för att aktivera HTTP/1.1 och HTTP/2 för att stödja alla klientappar.

Uppdatera standardprotokollet i appsettings.json:

{
  "Kestrel": {
    "EndpointDefaults": {
      "Protocols": "Http1AndHttp2"
    }
  }
}

Du kan också konfigurera Kestrel slutpunkter i startkoden.

För att aktivera HTTP/1.1 och HTTP/2 på samma port krävs TLS för protokollförhandling. Mer information finns i ASP.NET Core gRPC-protokollförhandling.

Anropa gRPC-Web från webbläsaren

Webbläsarappar kan använda gRPC-Web för att anropa gRPC-tjänster. Det finns vissa krav och begränsningar när du anropar gRPC-tjänster med gRPC-Web från webbläsaren:

  • Servern måste innehålla konfiguration för att stödja gRPC-Web.
  • Klientströmning och dubbelriktade strömningsanrop stöds inte. Serverströmning stöds.
  • Att anropa gRPC-tjänster på en annan domän kräver CORS-konfiguration på servern.

JavaScript gRPC-Web-klient

Det finns en JavaScript gRPC-Web-klient. Anvisningar om hur du använder gRPC-Web från JavaScript finns i skriva JavaScript-klientkod med gRPC-Web.

Konfigurera gRPC-Web med .NET gRPC-klienten

.NET gRPC-klienten kan konfigureras för att göra gRPC-Web-anrop. Detta är användbart för Blazor WebAssembly appar som finns i webbläsaren och har samma HTTP-begränsningar för JavaScript-kod. Att anropa gRPC-Web med en .NET-klient är detsamma som HTTP/2 gRPC. Den enda ändringen är hur kanalen skapas.

Så här använder du gRPC-Web:

  • Lägg till en referens till Grpc.Net.Client.Web paketet.
  • Kontrollera att referensen till Grpc.Net.Client paketet är version 2.29.0 eller senare.
  • Konfigurera kanalen så att den GrpcWebHandleranvänder :
var channel = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions
    {
        HttpHandler = new GrpcWebHandler(new HttpClientHandler())
    });

var client = new Greeter.GreeterClient(channel);
var response = await client.SayHelloAsync(new HelloRequest { Name = ".NET" });

Föregående kod:

  • Konfigurerar en kanal för att använda gRPC-Web.
  • Skapar en klient och anropar med hjälp av kanalen.

GrpcWebHandler har följande konfigurationsalternativ:

  • InnerHandler: Den underliggande HttpMessageHandler som gör gRPC HTTP-begäran, till exempel HttpClientHandler.
  • GrpcWebMode: En uppräkningstyp som anger om gRPC HTTP-begäran Content-Type är application/grpc-web eller application/grpc-web-text.
    • GrpcWebMode.GrpcWeb konfigurerar sändning av innehåll utan kodning. Default value.
    • GrpcWebMode.GrpcWebText konfigurerar base64-kodat innehåll. Krävs för serverströmningsanrop i webbläsare.
  • HttpVersion: HTTP-protokoll Version som används för att ange HttpRequestMessage.Version den underliggande gRPC HTTP-begäran. gRPC-Web kräver ingen specifik version och åsidosätter inte standardvärdet om det inte anges.

Important

Genererade gRPC-klienter har synkrona och asynkrona metoder för att anropa unary-metoder. Till exempel SayHello är synkron och SayHelloAsync asynkron. Asynkrona metoder krävs alltid i Blazor WebAssembly. Att anropa en synkron metod i en Blazor WebAssembly-app gör att appen blir svarslös.

Använd gRPC-klientfabrik med gRPC-Web

Skapa en .NET-klient som är kompatibel med gRPC-Web med hjälp av gRPC-klientfabriken:

  • Lägg till paketreferenser till projektfilen för följande paket:
  • Registrera en gRPC-klient med beroendeinmatning (DI) med hjälp av den generiska AddGrpcClient tilläggsmetoden. I en Blazor WebAssembly app registreras tjänster med DI i Program.cs.
  • Konfigurera GrpcWebHandler med hjälp av ConfigurePrimaryHttpMessageHandler tilläggsmetoden.
builder.Services
    .AddGrpcClient<Greet.GreeterClient>(options =>
    {
        options.Address = new Uri("https://localhost:5001");
    })
    .ConfigurePrimaryHttpMessageHandler(
        () => new GrpcWebHandler(new HttpClientHandler()));

Mer information finns i gRPC-klientfabriksintegrering i .NET.

Additional resources