You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一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握手失败原因:

  1. 打开IIS管理器 → 选中gRPC服务网站 → 功能视图 → 双击失败请求跟踪规则
  2. 添加规则:设置状态代码为400-599,勾选SSL,启用跟踪
  3. 触发网站请求,查看生成的跟踪日志,排查具体错误点

内容的提问来源于stack exchange,提问作者Ice-T

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 11:16:25