asp.net 程序安装nuget包: Grpc.AspNetCore, Grpc.AspNetCore.Server.Reflection
修改 program 设置:
<ItemGroup> <Protobuf Include="**/*.proto" OutputDir="Protos" CompileOutputs="false" GrpcServices="Server" /> </ItemGroup>
添加 proto 文件:
syntax="proto3"; option csharp_namespace ="MyProject.Protos"; package MyProject;service MyAuth{// 登录 rpc Login (LoginRequest) returns (LoginReply); }messageLoginRequest{string LoginName = 1;string Pwd = 2; }message LoginReply{int32 Code = 1;string Msg = 2; }
添加服务:
public class MyAuthService : MyAuth.MyAuthBase{public override async Task<LoginReply> Login(LoginRequest req, ServerCallContext context){return new LoginReply() ;}}
program.cs:
public class Program{public static void Main(string[] args){var builder = WebApplication.CreateBuilder(args);builder.Services.AddControllersWithViews();builder.Services.AddGrpc();//builder.Services.AddGrpcReflection();builder.Services.AddRazorPages();var app = builder.Build();app.MapGrpcReflectionService().AllowAnonymous();app.MapGrpcService<HospitalService>();if (!app.Environment.IsDevelopment()){app.UseExceptionHandler("/Error"); app.UseHsts();}app.UseHttpsRedirection();app.UseStaticFiles();app.UseRouting();app.UseAuthorization();app.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");app.MapControllers();app.MapRazorPages(); app.Run();}}
客户端配置:
添加nuget引用:Grpc.Net.Client, Grpc.Tools
添加服务期配置的proto文件,在program中设置:
<Protobuf Include="Protos\myauth.proto" GrpcServices="Client" />
调用服务:
private static void GetJWT(){using (var channel = GrpcChannel.ForAddress("https://localhost:443/", new GrpcChannelOptions()//没有正式的证书时,需要配置options{HttpHandler = new HttpClientHandler{ ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator }})){var client = new MyAuth.MyAuthClient(channel);LoginRequest req = new LoginRequest() { LoginName = "", Pwd = "" };var reply = client.Login(req);Console.WriteLine($"{JsonConvert.SerializeObject(reply)}");}}