gRPC-Webってのをやってみる。HTMLに埋め込んだJavaScriptから呼び出すにはもう少し手を加える必要があった。
HTMLに埋め込んだJavaScriptから呼び出すにはサーバー側がgRPC-Webじゃないといけないんだけど、前回のままでは同一オリジンポリシーではじかれるってのと、サーバー側がHTTP/2で待っているけど、ブラウザはHTTP/1.1で話しかけるから通じないってのがあってそこに手を入れないといけない。
んで、サーバーの作り方は前回と全く一緒なんだけど、Program.csだけちょこっと追加がある。
同一オリジンポリシーの対策はCORSって言うらしくてMicrosoftの公式サイトを参考に。サーバーがHTTP/1.1をサポートするようにする方法はGeminiに聞いた。
んで、変更点はソースコード内のコメントを見てちょ
Program.cs
- using grpcweb_srv.Services;
-
- var builder = WebApplication.CreateBuilder(args);
-
- // gRPC-Webクライアントとの通信のために、KestrelをHTTP/1.1で動作させるよう設定します。
- builder.WebHost.ConfigureKestrel(options =>
- {
- options.ListenLocalhost(5052, o => o.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http1);
- });
-
- // gRPCサービスとCORSポリシーをアプリケーションに登録します。
- 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();
-
- // gRPC-Webミドルウェアを有効にします。
- app.UseGrpcWeb();
-
- // CORSミドルウェアを有効にします。
- app.UseCors();
-
- // Configure the HTTP request pipeline.
- app.MapGrpcService<GreeterService>().EnableGrpcWeb().RequireCors("AllowAll");
- app.MapGet("/", () => "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909");
-
- app.Run();
これで、dotnet buildからのdotnet runしておく。
0 件のコメント:
コメントを投稿