文章目录
.Net6 WebAPI 手动开启gRPC服务
引用包
开启服务
// Add services to the container.
builder.Services.AddGrpc();
配置gRPC通道
// Configure the HTTP request pipeline.
app.MapGrpcService<DataReceiver>();
完整代码
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Add services to the container.
builder.Services.AddGrpc();
builder.Services.AddSignalR();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
//if (app.Environment.IsDevelopment())
//{
app.UseSwagger();
app.UseSwaggerUI();
//}
app.UseStaticFiles();
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
// Configure the HTTP request pipeline.
app.MapGrpcService<DataReceiver>();
app.Run();
}
}
以上内容完成以后,按照上一篇文章http://t.csdn.cn/M6nZV进行配置协议和服务类就可以用了。
总结
新建一个Service.cs类,继承自生成的类后,重写处理方法(如果没有生成就先编译一下工程文件)
public class GreeterService : Greeter.GreeterBase
{
private readonly ILogger<GreeterService> _logger;
public GreeterService(ILogger<GreeterService> logger)
{
_logger = logger;
}
public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
{
Console.WriteLine($"接收到请求!{request.Name}");
return Task.FromResult(new HelloReply
{
Message = "Hello " + request.Name
});
}
public override Task<Empty> SayBye(Empty request, ServerCallContext context)
{
return base.SayBye(request, context);
}
}
注意命名空间
必须重写proto中定义的所有方法
在GreeterService 中重写所有定义的方法
否在在客户端调用服务端方法的时候,会出现异常。
再通过对源码查看以后,发现所有的异常都是在自动生成代码中生成的,因为在自动生成的代码中所有的方法都抛出了一个异常,而没有写实现内容。
其实这样做不是一个好的方式,生成的工具可以考虑生成一个抽象类,定义所有方法是抽象方法,这样用户在继承后,IDE就会提示错误,不用等到调用时才知道错了。