【问题标题】:gRPC and MVC in same ASP.NET Core 3.0 ApplicationgRPC 和 MVC 在同一个 ASP.NET Core 3.0 应用程序中
【发布时间】:2019-11-15 08:31:32
【问题描述】:
我正在构建需要通过 gRPC 和 Rest 访问的小型、单一用途的微服务。我们正在 ASP.NET Core 3.0 上实现。我意识到这是非常新鲜的东西,并且一直在寻找一些相当完整的参考实现来演示如何完成这项工作。
我有一个小型 .NET 服务(业务逻辑),称为 IOrders。现在我想针对这个后端服务连接 gRPC 和 MVC (HTTP)。
任何示例、github 存储库、要关注或查看的博客将不胜感激。
【问题讨论】:
-
这是 link 用于 Asp.net Core 3 预览版 3 附带的版本的 gRPC。
-
这是 ASP.NE Core 3,1 - link 中 gRPC 的实现指南。你会发现它很有用。
标签:
asp.net-mvc
asp.net-core
asp.net-web-api
grpc
【解决方案1】:
我遇到了完全相同的问题。我正在运行.NET Core 3.0 和 Grpc.AspNetCore 版本 2.23.1。最大的问题是在没有 SSL 的情况下启动它(不推荐用于 prod 环境)。使用证书我发现这个github Secure_gRpc 是一个很好的例子。
通过这种方式可以实现在没有 ssl 的情况下运行开发环境。
Program.cs 文件。关键方面是设置HttpProtocols.Http1AndHttp2。我还删除了证书只是为了让它运行。取消注释下一行以使用 SSL 和证书
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>()
.ConfigureKestrel(options =>
{
options.Limits.MinRequestBodyDataRate = null;
options.ListenLocalhost(8008, listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http1AndHttp2;
listenOptions.UseHttps(adapterOptions =>
{
adapterOptions.ClientCertificateMode = ClientCertificateMode.NoCertificate;
adapterOptions.ServerCertificate = null;
});
//listenOptions.UseHttps("<path to .pfx file>", "<certificate password>");
});
});
});
}
Startup.cs 非常简单。如果修改 Startup.cs 文件添加服务的顺序非常重要,记住这一点非常重要。如果它不起作用,请尝试其他订单和/或查找官方文档。
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddGrpc((options => { options.EnableDetailedErrors = true; }));
services.AddMvc(options => options.EnableEndpointRouting = false);
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseMvcWithDefaultRoute();
app.UseEndpoints(endpoints =>
{
endpoints.MapGrpcService<GreeterService>();
});
}
}