同一IIS 10中Blazor与gRPC服务HTTPS通信失败求助
问题描述
在Windows Server 2022的IIS 10环境中,同时托管两个.NET应用:
- Blazor Server网站
- 独立的gRPC服务
两者运行在独立的应用池身份下,内网单独访问网站或服务均正常,但出现以下异常: - 用Visual Studio的IIS Express托管网站时,能正常连接IIS上的gRPC服务
- 将网站部署到IIS后,网站无法通过HTTPS与gRPC服务通信,抛出SSL连接错误——即使是简单的GET请求(gRPC已映射
/到GET接口)也失败。
错误日志
fail: Grpc.Net.Client.Internal.GrpcCall[6] Error starting gRPC call. System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception. ---> System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.. ---> System.Net.Sockets.SocketException (10054): An existing connection was forcibly closed by the remote host. --- End of inner exception stack trace --- at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, CancellationToken cancellationToken) at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource<System.Int32>.GetResult(Int16 token) at System.Net.Security.SslStream.<FillHandshakeBufferAsync>g__InternalFillHandshakeBufferAsync|189_0[TIOAdapter](TIOAdapter adap, ValueTask`1 task, Int32 minSize) at System.Net.Security.SslStream.ReceiveBlobAsync[TIOAdapter](TIOAdapter adapter)
已尝试操作:更换SSL证书、预加载客户端证书,问题未解决。
排查与解决方案
针对同一IIS下不同应用池的.NET应用HTTPS通信失败问题,按以下步骤排查:
1. 检查证书私钥权限
确认gRPC服务SSL绑定使用的证书,其私钥权限已授予网站应用池的身份账户:
- 打开
证书管理器→ 找到对应证书 → 右键所有任务→管理私钥 - 添加网站应用池账户(格式:
IIS AppPool\你的网站应用池名称),赋予读取权限
2. 调整应用池快速失败保护设置
检查gRPC服务的应用池是否因快速失败保护被停止:
- 打开IIS管理器 → 应用池 → 选中gRPC服务的应用池 → 高级设置
- 找到
快速失败保护,临时设置为禁用,测试是否恢复通信
3. 配置.NET客户端HTTPS参数
在Blazor Server网站的Program.cs中,调整gRPC客户端的HTTPS请求设置:
var httpClientHandler = new HttpClientHandler(); // 启用TLS 1.2/1.3(适配IIS默认安全配置) httpClientHandler.SslProtocols = System.Security.Authentication.SslProtocols.Tls12 | System.Security.Authentication.SslProtocols.Tls13; var grpcClient = new YourGrpcServiceClient(GrpcChannel.ForAddress("https://你的服务地址", new GrpcChannelOptions { HttpClient = new HttpClient(httpClientHandler) }));
注:若使用自签证书,可临时添加
httpClientHandler.ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator;跳过验证,但生产环境需替换为受信任证书。
4. 检查端口占用情况
确认gRPC服务的HTTPS端口未被其他进程占用:
- 执行命令:
netstat -ano | findstr :你的服务端口 - 确保只有w3wp.exe(IIS进程)占用该端口
5. 启用IIS失败请求跟踪
启用失败请求跟踪获取详细日志,定位SSL握手失败原因:
- 打开IIS管理器 → 选中gRPC服务网站 → 功能视图 → 双击
失败请求跟踪规则 - 添加规则:设置状态代码为
400-599,勾选SSL,启用跟踪 - 触发网站请求,查看生成的跟踪日志,排查具体错误点
内容的提问来源于stack exchange,提问作者Ice-T
相关产品推荐
相关产品推荐

