HttpContext.Response.Redirect(url,false);在Amazon AWS环境中导致504错误

时间:2018-02-22 10:40:20

标签: asp.net-mvc amazon-web-services sitecore http-status-codes page-lifecycle

我有下一个设置:

  • Sitecore(基于ASP.Net的CMS)托管的7.2 x 2内容交付服务器 在亚马逊AWS中。
  • Sitecore之前的亚马逊网络服务(AWS)弹性负载均衡器(ELB) 服务器。
  • 在AWS之前缓存Akamai(不应该影响我猜)

接下来有2个控制器操作:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MyAction1()
{
  return Redirect("some url");  
}

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MyAction2()
{
  Response.Redirect("some url");
  return Redirect("some url");  
}

两个动作在本地都可以正常工作。但首先在AWS托管(MyAction1)上工作并不起作用。它从ELB抛出504错误(网关超时)(超时1分钟)。 我决定比较Response.Redirect("some url");return Redirect("some url");之间的差异。 以下是Redirect("some url")的反编译代码:

    if (context == null)
    {
        throw new ArgumentNullException("context");
    }
    if (context.IsChildAction)
    {
        throw new InvalidOperationException(MvcResources.RedirectAction_CannotRedirectInChildAction);
    }
    string url = UrlHelper.GenerateContentUrl(this.Url, context.HttpContext);
    context.Controller.TempData.Keep();
    if (this.Permanent)
    {
        context.HttpContext.Response.RedirectPermanent(url, false);
        return;
    }
    context.HttpContext.Response.Redirect(url, false);

我将此代码付诸实践并逐行检查。当endResponse中的context.HttpContext.Response.Redirect(url, false)参数为false时,操作开始导致504错误。换句话说:

此代码有效:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MyAction1()
{
  Response.Redirect("some url", true);
  return Redirect("some url");  
}

并且此代码导致504错误

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MyAction2()
{
  Response.Redirect("some url", false);
  return Redirect("some url");  
}

根据endResponse参数值,调用Response.End()。如果没有调用,我得到504错误。我想知道是什么导致这种行为。我将调查可能导致Request长时间运行的此操作后可执行的内容。但是,由于代码在本地工作正常,我怀疑AWS ELB是否可以自行处理302请求而无需转回浏览器并导致问题。我也尝试过:在没有ELB的RDP上在AWS环境中运行此代码,它工作正常。因此,AWS ELB很可能存在问题。

任何建议,可能出错?我应该在哪里看看?

0 个答案:

没有答案