ASP.Net React项目调试时抛出HttpRequestException异常求助
ASP.NET + React SpaProxy HTTPS重定向失败(SocketException 10061)排查方案
问题核心
从日志看,SpaProxy尝试连接localhost:44437时被主动拒绝,说明React开发服务器未在该端口监听,或SpaProxy配置的目标端口/协议与实际不符。HTTP能正常访问是因为ASP.NET自身的Kestrel服务独立运行,不受SpaProxy状态影响。
错误日志
System.Net.Http.HttpRequestException: 无法建立连接,因为目标计算机主动拒绝了连接。(localhost:44437) ---> System.Net.Sockets.SocketException (10061): 无法建立连接,因为目标计算机主动拒绝了连接。 at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, CancellationToken cancellationToken) at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 token) at System.Net.Sockets.Socket.<ConnectAsync>g__WaitForConnectWithCancellation|277_0(AwaitableSocketAsyncEventArgs saea, ValueTask connectTask, CancellationToken cancellationToken) at System.Net.Http.HttpConnectionPool.ConnectToTcpHostAsync(String host, Int32 port, HttpRequestMessage initialRequest, Boolean async, CancellationToken cancellationToken) --- End of inner exception stack trace --- at System.Net.Http.HttpConnectionPool.ConnectToTcpHostAsync(String host, Int32 port, HttpRequestMessage initialRequest, Boolean async, CancellationToken cancellationToken) at System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken) at System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken) at System.Net.Http.HttpConnectionPool.AddHttp11ConnectionAsync(HttpRequestMessage request) at System.Threading.Tasks.TaskCompletionSourceWithCancellation`1.WaitWithCancellationAsync(CancellationToken cancellationToken) at System.Net.Http.HttpConnectionPool.GetHttp11ConnectionAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken) at System.Net.Http.HttpConnectionPool.SendWithVersionDetectionAndRetryAsync(HttpRequestMessage request, Boolean async, Boolean doRequestAuth, CancellationToken cancellationToken) at System.Net.Http.DiagnosticsHandler.SendAsyncCore(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken) at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken) at System.Net.Http.HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken) at Microsoft.AspNetCore.SpaProxy.SpaProxyLaunchManager.IsSpaProxyRunning(CancellationToken cancellationToken) Microsoft.AspNetCore.SpaProxy.SpaProxyMiddleware: Information: SPA proxy is not ready. Returning temporary landing page. Microsoft.AspNetCore.Server.Kestrel.Http2: Trace: Connection id "0HMRBQ8D1FNKS" sending HEADERS frame for stream ID 47 with length 35 and flags END_HEADERS. Microsoft.AspNetCore.Server.Kestrel.Http2: Trace: Connection id "0HMRBQ8D1FNKS" sending DATA frame for stream ID 47 with length 3 and flags NONE. Microsoft.AspNetCore.Server.Kestrel.Http2: Trace: Connection id "0HMRBQ8D1FNKS" sending DATA frame for stream ID 47 with length 502 and flags NONE. Microsoft.AspNetCore.Server.Kestrel.Http2: Trace: Connection id "0HMRBQ8D1FNKS" sending DATA frame for stream ID 47 with length 0 and flags END_STREAM. Microsoft.AspNetCore.Server.Kestrel.Http2: Trace: Connection id "0HMRBQ8D1FNKS" received WINDOW_UPDATE frame for stream ID 0 with length 4 and flags 0x0. Microsoft.AspNetCore.Hosting.Diagnostics: Information: Request finished HTTP/2 GET https://localhost:7112/ - - - 200 - text/html 4137.3539ms
排查步骤
1. 确认React开发服务器的实际运行端口
- 检查React项目根目录的
.env/.env.development文件,查看是否有PORT=44437配置。如果没有,React默认使用3000端口,需对应调整SpaProxy配置。 - 单独启动React项目(执行
npm start),查看控制台输出的访问地址,确认实际端口是否与日志中的44437一致。
2. 校验SpaProxy配置
- 打开ASP.NET项目的
appsettings.Development.json,找到SpaProxy节点:"SpaProxy": { "TargetUri": "https://localhost:44437" }- 确保
TargetUri的端口与React dev server实际端口一致。 - 如果React dev server未启用HTTPS,将
TargetUri改为HTTP协议(如http://localhost:44437)。
- 确保
- 检查
Properties/launchSettings.json中的SpaProxyLaunchCommand,确保是正确启动React的命令(如"SpaProxyLaunchCommand": "npm start")。
3. 验证端口监听状态
- Windows:执行命令
netstat -ano | findstr :44437,若无输出则无进程监听该端口;若有输出,检查PID对应的进程是否为React的node.exe。 - macOS/Linux:执行
lsof -i :44437或ss -tulpn | grep :44437,确认端口是否被正确进程占用。 - 若端口被无关进程占用,杀掉该进程或修改React/SpaProxy的端口配置。
4. 检查React HTTPS配置
- 若SpaProxy要连接HTTPS的React dev server,需在React项目的
package.json中修改start命令:"scripts": { "start": "HTTPS=true react-scripts start" } - 首次启动HTTPS的React dev server会生成自签名证书,需手动信任该证书(可通过浏览器访问React的HTTPS地址,按照提示安装证书)。
5. 清理缓存与重启服务
- 清理React项目依赖:
rm -rf node_modules package-lock.json && npm install(Windows用rd /s /q node_modules && del package-lock.json && npm install)。 - 清理ASP.NET项目:
dotnet clean && dotnet build。 - 关闭所有相关进程(
node.exe、dotnet.exe),重新启动整个解决方案。
6. 确认SpaProxy版本兼容性
- 检查ASP.NET项目
csproj文件中的Microsoft.AspNetCore.SpaProxy包版本,确保与.NET版本匹配(如.NET 6对应6.x版本,.NET 7对应7.x版本)。 - 若版本不匹配,执行
dotnet add package Microsoft.AspNetCore.SpaProxy --version [对应版本号]更新包。
内容的提问来源于stack exchange,提问作者iTz_Ben
相关产品推荐
相关产品推荐

