Angular + .NET Core ERR_CONNECTION_REFUSED 来自远程

Posted

技术标签:

【中文标题】Angular + .NET Core ERR_CONNECTION_REFUSED 来自远程【英文标题】:Angular + .NET Core ERR_CONNECTION_REFUSED from remote 【发布时间】:2020-12-08 16:28:25 【问题描述】:

我有一个 .NET Core 后端、一个 Angular 前端和一个 NGNIX 作为反向代理。我在 Windows 10 下运行系统,我在其中使用 FolderProfile 发布了后端,将其复制到 PC 并通过 exe 启动它。前端的网络服务器是一个 IIS。我通过命令行启动 NGNIX。

如果我在本地 PC 上的浏览​​器中调用前端,一切正常。我可以通过 HTTP://localhost:4200 成功访问和使用该页面,正确的 URL 为 HTTP://test.example.net:4200 和 HTTPS://test.example.net。

如果我现在从远程 PC 调用该页面,我会在浏览器控制台中看到“加载资源失败:net::ERR_CONNECTION_REFUSED”。显示 Angular 页面,但与后端的通信似乎不起作用。我使用 HTTP://test.example.net:4200 还是 HTTPS://test.example.net 都没有关系。防火墙中的端口(443、4200、5000)是开放的。

在后台我做了以下调整:

virtual public void ConfigureServices(IServiceCollection services)

    services.AddCors(options =>
    
        options.AddPolicy(name: MyAllowSpecificOrigins,
                            builder =>
                            
                                builder.AllowAnyOrigin();
                                builder.AllowAnyHeader();
                                builder.AllowAnyMethod();
                            );
    );
    
    services.AddMvc().SetCompatibilityVersion(...);
    ...


virtual public void Configure(IApplicationBuilder app, IHostEnvironment env)

    ...
    app.UseCors(MyAllowSpecificOrigins);
    app.UseHttpsRedirection();
    
    app.UseAuthentication();

    app.UseMvc();
    ...

这是来自前端的 web.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.webServer>
  <httpProtocol>
    <customHeaders>
      <add name="Access-Control-Allow-Headers" value="*" />
      <add name="Access-Control-Allow-Methods" value="POST,GET,OPTIONS,PUT,DELETE" />
      <add name="Access-Control-Allow-Origin" value="*" />
      <add name="Access-Control-Allow-Credentials" value="true" />    
    </customHeaders>
  </httpProtocol>
  <rewrite>
    <rules>
      <rule name="Angular Routes" stopProcessing="true">
        <match url=".*" />
        <conditions logicalGrouping="MatchAll">
          <add input="REQUEST_FILENAME" matchType="IsFile" negate="true" />
          <add input="REQUEST_FILENAME" matchType="IsDirectory" negate="true" />
        </conditions>
        <action type="Rewrite" url="/index.html" />
      </rule>
    </rules>
  </rewrite>
</system.webServer>
</configuration>    

这里是 nginx.conf:

worker_processes  1;

events  


http 

  map $http_upgrade $connection_upgrade 
      default upgrade;
      ''      close;
    
    
  upstream test.example.net 
    server 127.0.0.1:4200;
    #server test.example.net:4200;
    #server test.example.net;
  
   
  server 
    listen 443 ssl; 
    
    server_name test.example.net;
    keepalive_timeout   70;
    
    ssl_certificate C:\\nginx-1.18.0\\conf\\certs\\cert.crt;
    ssl_certificate_key C:\\nginx-1.18.0\\conf\\certs\\cert.key;
    
    ssl_prefer_server_ciphers on;
    ssl_session_timeout 10m;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;

    # intermediate configuration. tweak to your needs.
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';

    
    location / 
        proxy_pass http://test.example.net;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
    
  

远程PC上的浏览器显示如下:

希望有人知道问题出在哪里

【问题讨论】:

使用外部接口时,与后端的连接似乎存在问题。所以我建议你检查 NGINX 和 IIS 的配置。检查 NGINX 配置文件中的 listen 指令,确保它不会限制到 localhost 的连接。 @NikitaK 我添加了 nginx.conf。 Listen 仅包含:listen 443 ssl; 【参考方案1】:

从浏览器中显示的错误来看,客户端应用程序无法连接后端 Web 服务器。 我们需要将 App 的 URL 更改为实际的 URL 地址,而不是 localhost。 尝试将 Angular 应用程序中的 URL 更改为指向实际域名而不是 localhost:4200,以及 IIS 中的配置。https://support.aspnetzero.com/QA/Questions/6395/Failed-to-load-resource-netERRCONNECTIONREFUSED 如果问题仍然存在,请随时告诉我。

【讨论】:

【参考方案2】:

根据 Abrahams 的回答,对我来说,在 Angular + .NET5 应用程序中,它通过将 environment.prod.ts 中的 api URL 设置为:

导出常量环境 = 生产:真实, apiUrl: '/api', ...

还有 launchSettings.json 之类的:

“API”: "commandName": "项目", “dotnetRunMessages”:“真”, “启动浏览器”:假, "launchUrl": "招摇", "applicationUrl": "http://localhost:5000", “环境变量”: "ASPNETCORE_ENVIRONMENT": "发展"

【讨论】:

以上是关于Angular + .NET Core ERR_CONNECTION_REFUSED 来自远程的主要内容,如果未能解决你的问题,请参考以下文章

用VSCode开发一个asp.net core2.0+angular5项目: Angular5+asp.net core 2.0 web api文件上传

asp.net core + angular2 JWT 承载

ASP.NET Core和Angular 2双剑合璧

如何使用 Angular 取消 .Net Core Web API 请求?

IIS 上的 Net Core Cors 和 Angular 应用程序

从 Angular 到 Net Core HTTP 404 发布错误