ASP.NET 7 操作在使用 NGINX 代理时被调用两次

问题描述 投票:0回答:0

从代理版本调用时,我的 Asp.net 7 控制器中的 Post Action 被调用两次。 当我在 IP:8001 上进行 post 调用时,该函数只被调用一次。 但是在我的 proxieddomain.com 上调用它,该程序似乎正在接收两个请求(一个接一个)。

这是我的 nginx 配置:

upstream webbusiness {
    server 127.0.0.1:8001;
}

location / {
        proxy_pass         https://webbusiness;
        proxy_http_version 1.1;
        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 $scheme;
        proxy_set_header   Accept-Encoding "";
        access_log         /var/log/nginx/access-test.log combined;
    }

使用访问日志我已经验证来自客户端的请求被接收到一次但是在 nginx 代理转发该请求到 asp.net 程序之间的某处,它们被复制了。

ASP.NET 日志:

info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
      Request starting HTTP/1.0 POST https://proxieddomain.com/business/settemplateactive application/x-www-form-urlencoded;+charset=UTF-8 25
info: Microsoft.AspNetCore.Cors.Infrastructure.CorsMiddleware[10]
      No CORS policy found for the specified request.
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
      Executing endpoint 'WebBusiness.Controllers.BusinessController.SetBusinessActiveTemplate (WebBusiness)'
info: Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[102]
      Route matched with {action = "SetBusinessActiveTemplate", controller = "Business"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] SetBusinessActiveTemplate(WebBusiness.Models.Template.SetActiveTemplateDataViewModel) on controller WebBusiness.Controllers.BusinessController (WebBusiness).
info: WebBusiness.Controllers.BusinessController[0]
      Request: POST /business/settemplateactive from redactedpublicip
info: WebBusiness.Controllers.BusinessController[0]
      Header: Accept - application/json, text/javascript, */*; q=0.01
info: WebBusiness.Controllers.BusinessController[0]
      Header: Connection - close
info: WebBusiness.Controllers.BusinessController[0]
      Header: Host - proxieddomain.com
info: WebBusiness.Controllers.BusinessController[0]
      Header: User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36
info: WebBusiness.Controllers.BusinessController[0]
      Header: Accept-Language - en-US,en;q=0.9
info: WebBusiness.Controllers.BusinessController[0]
      Header: Cache-Control - no-cache
info: WebBusiness.Controllers.BusinessController[0]
      Header: Content-Type - application/x-www-form-urlencoded; charset=UTF-8
info: WebBusiness.Controllers.BusinessController[0]
      Header: Cookie - session=redacted
info: WebBusiness.Controllers.BusinessController[0]
      Header: Origin - https://proxieddomain.com
info: WebBusiness.Controllers.BusinessController[0]
      Header: Pragma - no-cache
info: WebBusiness.Controllers.BusinessController[0]
      Header: Referer - https://proxieddomain.com/dashboard/2
info: WebBusiness.Controllers.BusinessController[0]
      Header: Content-Length - 25
info: WebBusiness.Controllers.BusinessController[0]
      Header: X-Real-IP - redactedpublicip
info: WebBusiness.Controllers.BusinessController[0]
      Header: X-Original-Proto - https
info: WebBusiness.Controllers.BusinessController[0]
      Header: sec-ch-ua - "Chromium";v="112", "Google Chrome";v="112", "Not:A-Brand";v="99"
info: WebBusiness.Controllers.BusinessController[0]
      Header: X-Requested-With - XMLHttpRequest
info: WebBusiness.Controllers.BusinessController[0]
      Header: sec-ch-ua-mobile - ?0
info: WebBusiness.Controllers.BusinessController[0]
      Header: sec-ch-ua-platform - "Windows"
info: WebBusiness.Controllers.BusinessController[0]
      Header: sec-fetch-site - same-origin
info: WebBusiness.Controllers.BusinessController[0]
      Header: sec-fetch-mode - cors
info: WebBusiness.Controllers.BusinessController[0]
      Header: sec-fetch-dest - empty
info: WebBusiness.Controllers.BusinessController[0]
      Header: X-Original-For - 127.0.0.1:55018
info: Microsoft.AspNetCore.Mvc.Infrastructure.SystemTextJsonResultExecutor[1]
      Executing JsonResult, writing value of type '<>f__AnonymousType0`2[[System.Boolean, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.Int32, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]'.
info: Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[105]
      Executed action WebBusiness.Controllers.BusinessController.SetBusinessActiveTemplate (WebBusiness) in 422.4906ms
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
      Executed endpoint 'WebBusiness.Controllers.BusinessController.SetBusinessActiveTemplate (WebBusiness)'
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
      Request finished HTTP/1.0 POST https://proxieddomain.com/business/settemplateactive application/x-www-form-urlencoded;+charset=UTF-8 25 - 0 - application/json;+charset=utf-8 428.8991ms
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
      Request starting HTTP/1.0 POST https://proxieddomain.com/business/settemplateactive application/x-www-form-urlencoded;+charset=UTF-8 25
info: Microsoft.AspNetCore.Cors.Infrastructure.CorsMiddleware[10]
      No CORS policy found for the specified request.
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
      Executing endpoint 'WebBusiness.Controllers.BusinessController.SetBusinessActiveTemplate (WebBusiness)'
info: Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[102]
      Route matched with {action = "SetBusinessActiveTemplate", controller = "Business"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] SetBusinessActiveTemplate(WebBusiness.Models.Template.SetActiveTemplateDataViewModel) on controller WebBusiness.Controllers.BusinessController (WebBusiness).
info: WebBusiness.Controllers.BusinessController[0]
      Request: POST /business/settemplateactive from redactedpublicip
info: WebBusiness.Controllers.BusinessController[0]
      Header: Accept - application/json, text/javascript, */*; q=0.01
info: WebBusiness.Controllers.BusinessController[0]
      Header: Connection - close
info: WebBusiness.Controllers.BusinessController[0]
      Header: Host - proxieddomain.com
info: WebBusiness.Controllers.BusinessController[0]
      Header: User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36
info: WebBusiness.Controllers.BusinessController[0]
      Header: Accept-Language - en-US,en;q=0.9
info: WebBusiness.Controllers.BusinessController[0]
      Header: Cache-Control - no-cache
info: WebBusiness.Controllers.BusinessController[0]
      Header: Content-Type - application/x-www-form-urlencoded; charset=UTF-8
info: WebBusiness.Controllers.BusinessController[0]
      Header: Cookie - session=redacted
info: WebBusiness.Controllers.BusinessController[0]
      Header: Origin - https://proxieddomain.com
info: WebBusiness.Controllers.BusinessController[0]
      Header: Pragma - no-cache
info: WebBusiness.Controllers.BusinessController[0]
      Header: Referer - https://proxieddomain.com/dashboard/2
info: WebBusiness.Controllers.BusinessController[0]
      Header: Content-Length - 25
info: WebBusiness.Controllers.BusinessController[0]
      Header: X-Real-IP - redactedpublicip
info: WebBusiness.Controllers.BusinessController[0]
      Header: X-Original-Proto - https
info: WebBusiness.Controllers.BusinessController[0]
      Header: sec-ch-ua - "Chromium";v="112", "Google Chrome";v="112", "Not:A-Brand";v="99"
info: WebBusiness.Controllers.BusinessController[0]
      Header: X-Requested-With - XMLHttpRequest
info: WebBusiness.Controllers.BusinessController[0]
      Header: sec-ch-ua-mobile - ?0
info: WebBusiness.Controllers.BusinessController[0]
      Header: sec-ch-ua-platform - "Windows"
info: WebBusiness.Controllers.BusinessController[0]
      Header: sec-fetch-site - same-origin
info: WebBusiness.Controllers.BusinessController[0]
      Header: sec-fetch-mode - cors
info: WebBusiness.Controllers.BusinessController[0]
      Header: sec-fetch-dest - empty
info: WebBusiness.Controllers.BusinessController[0]
      Header: X-Original-For - 127.0.0.1:55020
info: Microsoft.AspNetCore.Mvc.Infrastructure.SystemTextJsonResultExecutor[1]
      Executing JsonResult, writing value of type '<>f__AnonymousType0`2[[System.Boolean, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.Int32, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]'.
info: Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[105]
      Executed action WebBusiness.Controllers.BusinessController.SetBusinessActiveTemplate (WebBusiness) in 2.6584ms
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
      Executed endpoint 'WebBusiness.Controllers.BusinessController.SetBusinessActiveTemplate (WebBusiness)'
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
      Request finished HTTP/1.0 POST https://proxieddomain.com/business/settemplateactive application/x-www-form-urlencoded;+charset=UTF-8 25 - 200 - application/json;+charset=utf-8 3.2520ms

日志确实确认有两个请求正在处理,我注意到的另一件事是,第一个请求永远不会发送回客户端,而是第二个请求发送回客户端。 我们可以看到 Header: X-Original-For 对两个请求都有不同的端口,所以会不会是 nginx 导致了这个问题?

我已经转发了在我的项目中配置的标头,使用:

app.UseForwardedHeaders(new ForwardedHeadersOptions
{
    ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});

我试过弄乱我的 nginx 配置,但我似乎无法弄清楚到底发生了什么,在 asp.net 中更改我转发的标头配置

现在似乎只有这个动作被请求了两次,而不是任何其他的。

c# asp.net nginx proxy reverse-proxy
© www.soinside.com 2019 - 2024. All rights reserved.