【问题标题】:Increase azure web app request timeout增加 azure web 应用请求超时
【发布时间】:2015-12-21 16:56:03
【问题描述】:

有没有办法增加 azure web 应用的请求超时?

如果我将请求延迟超过 2 分钟左右,则请求将失败且没有错误(返回空白页)或模糊 503 响应。

    public ActionResult Index()
    {
        System.Threading.Thread.Sleep(230000);
        return View();
    }

我有一些长时间运行的请求需要运行(上传大文件/大 pdf 转换作业) - 有什么办法可以解决这个问题吗?我宁愿避免使用虚拟机托管是可能的。我尝试将 Web 应用程序扩展到基本或标准计划,但似乎没有任何区别。

【问题讨论】:

  • 你有没有想过这个问题?我有同样的问题。
  • 不,最终不得不在虚拟机上托管

标签: asp.net-mvc azure


【解决方案1】:
az webapp config appsettings set --resource-group <you-resource-group-name> --name <your-app-name> --slot <your-slot-name> --settings WEBSITES_CONTAINER_START_TIME_LIMIT=1800

https://docs.microsoft.com/en-us/archive/blogs/waws/things-you-should-know-web-apps-and-linux

"如果您的容器启动时间较长,请增加启动时间限制。 适用于容器的 Web 应用 当我们启动您的容器时,我们将等待它启动和初始化。一旦容器运行并且我们收到对 ping 的响应,我们认为启动成功,以便我们知道它已准备好响应 HTTP 流量。我们将等待 230 秒以使其发生。如果我们在 230 秒内没有成功启动,我们会认为有问题,我们会停止容器。

我们意识到某些容器可能需要更多的时间才能启动,因此我们允许您将 230 秒的等待时间增加到 1800 秒的限制。要进行配置,请添加一个名为 WEBSITES_CONTAINER_START_TIME_LIMIT 的应用设置,并将其设置为您希望我们等待容器启动的秒数(最多 1800 秒),如下图所示。"

【讨论】:

    【解决方案2】:

    您可以在这里使用我的技巧代码来绕过 230 秒的限制。总而言之,我们只是一直写空的html值“\r\n”来响应让ALB知道我们正在返回数据,但实际上我们正在处理请求。

    Sample code

    【讨论】:

    • 多么讨厌的把戏。讨厌我的意思是我把它留到以后。
    • 我想你可以通过 TCP Keep-Alive 来达到同样的效果。
    • 您的代码中似乎存在问题:未使用waitStep。
    • @quinvit 能否分享整个技巧代码
    【解决方案3】:

    您可以使用自动化脚本部署网络应用,并在“资源”下添加这一行:

            {
              "name": "WEBSITES_CONTAINER_START_TIME_LIMIT",
              "value": 1800
            },
    

    默认值为 230,但可以增加到 1800。 您还可以在应用程序设置下添加一个名为 WEBSITES_CONTAINER_START_TIME_LIMIT 的新设置,并使用您想要的秒数。

    【讨论】:

    【解决方案4】:

    不,您不能增加 Azure 应用服务的超时时间(它是 230 秒)。您可以迁移到托管在您可以控制这些设置的 VM 上的云服务或 IIS。您还可以移动到异步模型,在该模型中,客户端发出请求,获取某种票证或标识符,可以轮询返回以查看处理是否完成。有许多 Web 应用程序的异步类型模型示例可供您选择。 参考:https://social.msdn.microsoft.com/Forums/en-US/05f254a6-9b34-4eb2-a5f7-2a82fb40135f/time-out-after-230-seconds?forum=windowsazurewebsitespreview

    【讨论】:

    • Sanders 您能否为此提供指向 Microsoft 文档的链接?我正在尝试通过 Azure 应用服务上传文件的类似场景,从我看到的限制似乎是 5 分钟左右,而不是 2 分钟。
    • 在线更新。 230 秒是默认值。
    • 我做了一些测试,超时实际上是240秒(4分钟)。
    • 根据我的经验,超时时间是 120 秒(2 分钟),在带有 docker 容器的 linux 应用服务上。
    • 将超时值默认设置为 5 分钟的配置属性是什么? @JeffSanders-MSFT
    【解决方案5】:

    您必须在 web.config 中进行一些更改

    <system.webServer> 
    
    <monitoring> 
    
    <triggers>
    
    <statusCode>
    
    <addstatusCode="500"subStatusCode="0"win32StatusCode="0"
    
    count="10"timeInterval="00:00:30" /> 
    
    </statusCode>
    
    </triggers>
    
    <actionsvalue="Recycle" /> 
    
    </monitoring> 
    

    更多:

    Connection Timeout (Timeout Expired) on Azure Web App Site

    【讨论】:

    • 那些似乎不是我的 web.config 文件的有效标签...元素 'system.webServer' 的子元素 'monitoring' 无效。
    • 请在 之前使用
    • 之后
    • 这不符合 OP 的要求。您的回答会回收应用程序池,这将取消正在进行的任何操作。这违背了目的。
    【解决方案6】:

    如果应该长时间运行,请尝试将您的操作设为异步以避免 Web 服务器上的死锁:

    public async Task<ActionResult> Index()
    {
        await Task.Delay(230000);
        return View();
    }
    

    您可以在控制器的代码中设置脚本超时:

    HttpContext.Current.Server.ScriptTimeout = 300;
    

    请注意,HttpContext 是在每个请求的基础上实例化的,因此它会在下一个请求时恢复为默认值

    【讨论】:

    • 不幸的是,这也不起作用public async Task&lt;ActionResult&gt; Index() { HttpContext.Server.ScriptTimeout = 100000; System.Threading.Thread.Sleep(400000); return View(); }
    • @woggles 您是否将此代码托管在任何我可以尝试的地方?
    • 刚刚部署到webapplication45946.azurewebsites.net,它不会永远存在,但无论我在哪里部署网络应用程序,它都会失败 - 如果我将它托管在虚拟机上,我只能让它成功运行
    【解决方案7】:

    希望这会对https://azure.microsoft.com/en-us/blog/new-configurable-idle-timeout-for-azure-load-balancer/ 有所帮助。但我认为在执行一些繁重的工作时保留请求是个坏主意。恕我直言,您最好执行后台作业并不时从客户端检查它的状态。

    【讨论】:

    • 我已经阅读了该链接 - 其中是否适用于 azure Web 应用程序?我是否应该尝试为可能发生超时的特定操作配置 TCP Keep-Alive?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 2013-06-01
    相关资源
    最近更新 更多