【问题标题】:Grpc server not listening to port 5001 when run as a Windows service作为 Windows 服务运行时,Grpc 服务器未侦听端口 5001
【发布时间】:2020-11-11 22:06:53
【问题描述】:

我从以下页面在 Visual Studio 2019 中创建了 GrpcGreeter 和 GrpcGreeterClient 项目:

[https://docs.microsoft.com/en-us/aspnet/core/tutorials/grpc/grpc-start?view=aspnetcore-5.0&tabs=visual-studio][1]

我对这些示例所做的唯一更改是,为了让 GrpcGreeter 应用程序作为 Windows 服务运行,我在 IHostBuilder CreateHostBuilder 中添加了“.UseWindowsService()”。我在 VS 中将两者都发布到本地文件夹,并为部署模式选择了自包含。

从 VS 环境运行或直接运行已发布的 GrpcGreeter.exe 和 GrpcGreeterClient.exe 时,服务器和客户端使用 https://localhost:5001 可以正常工作。

然后我使用“Sc create”通过 GrpcGreeter.exe 成功创建了 Windows 服务。然后在“服务”窗口中我启动了该服务。

问题在于,当作为 Windows 服务运行时,GrpcGreeter.exe 不会侦听端口 5001,如 netstat -anb 所示(显然它确实侦听端口 5354)。当然,当我运行 GrpcGreeterClient.exe 时,它​​不会连接。当 GrpcGreeter.exe 不是作为 Windows 服务运行时,netstat 显示它正在侦听 5001,并且 GrpcGreeterClient.exe 与它对话正常。

每当我在“服务”窗口启动服务时,查看事件查看器会立即出现 3 个错误。我在下面缩写它们。


第一: 错误应用程序名称:GrpcGreeter.exe,版本:1.0.0.0,时间戳:0x5f6b3846 错误模块名称:ntdll.dll,版本:10.0.19041.546,时间戳:0xd49544eb 异常代码:0xc0000374 故障偏移:0x000e6763 ...

第二次: 故障桶,类型0 事件名称:FaultTolerantHeap 回应:不可用 驾驶室编号:0

问题签名: P1:GrpcGreeter.exe ...

第三次: 故障桶2242750238749681031,类型1 活动名称:APPRCASH 回应:不可用 驾驶室编号:0

问题签名: P1:GrpcGreeter.exe ...


请帮忙。谢谢。

【问题讨论】:

  • 5354 通常是多播 DNS 响应器,所以我不相信是 your 代码在该端口上监听。
  • 同样的问题,我在 EC2 安全组中打开了 5001 端口,但仍然无法从本地连接。但启动服务后windows事件没有错误。有什么线索吗?

标签: service grpc


【解决方案1】:

这是一篇非常古老的帖子,但我在使用 gRPC 部署 Windows 服务时也遇到了这个问题。不确定它是否能解决您的问题,但我的问题是,当您部署到 Windows 服务时,它需要配置证书。本文档 here 在“使用配置设置 HTTPS 证书”部分下进行了说明

所以我使用 openssl 创建了一个自签名证书,您也可以在其中引用 here,然后只需将 .pfx 文件添加到 kestrel 配置中,如 Microsoft documentation 所示,构建它并将其发布为 windows服务。之后,只需使用

继续正常的服务创建过程
sc create 
// and then
sc start

windows 服务现在应该可以与 gRPC 服务器一起运行,没有任何问题(至少对我而言)。需要注意的一点是,由于这是一个不完全可信的自签名证书,所以当前端尝试与服务器通信时,它会出现关于证书的错误。你只需要相信它就可以了。

在浏览器上,只需转到托管 gRPC 的链接,例如 https://localhost:5001,单击高级并信任它。

在我的例子中,我使用的是 electron + angular,所以我只需要添加我从 here 获得的这段代码 sn-p。现在我的前端可以和windows服务中的gRPC服务器正常通信了。

// ignore self signed certificate in dev mode
    if (process.env.NODE_ENV === 'development') {
        // SSL/TSL: this is the self signed certificate support
        app.on('certificate-error', (event, webContents, url, error, certificate, callback) => {
            // On certificate error we disable default behaviour (stop loading the page)
            // and we then say "it is all fine - true" to the callback
            event.preventDefault();
            callback(true);
        });
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-28
    • 2012-06-12
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 2019-03-30
    相关资源
    最近更新 更多