C# 500-请求超时

C# 500-请求超时,c#,asp.net,azure,C#,Asp.net,Azure,我有一个脚本可以运行大约4mins30s,我在我的aspx网页的配置页面中将默认超时时间更改为3600秒 它没有返回500-IIS 8上的开发版本和上载版本的请求超时错误 然而,当我将其上传到azure的实时站点时,它返回500-请求超时错误 Azure是否覆盖这些设置 配置: <configuration> <system.web> <httpRuntime executionTimeout="3600" /> <sessionSt

我有一个脚本可以运行大约4mins30s,我在我的aspx网页的配置页面中将默认超时时间更改为3600秒

它没有返回500-IIS 8上的开发版本和上载版本的请求超时错误

然而,当我将其上传到azure的实时站点时,它返回500-请求超时错误

Azure是否覆盖这些设置

配置:

<configuration>
  <system.web>
    <httpRuntime executionTimeout="3600" />
    <sessionState timeout="360" />
    <compilation debug="false" targetFramework="4.0">
      <assemblies>
        <add assembly="System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
        <add assembly="System.Web.Extensions.Design, Version=4.0.0.0, Culture=neutral/>
      </assemblies>
    </compilation>
  </system.web>
</configuration>


您很可能正在运行应用程序服务中硬编码的230秒超时

有关更多信息,请参见此问题:


尝试将长时间运行的任务作为WebJob,并将结果发布到队列或表中。或者发布到表/Blob(如果大量重用数据,甚至可能是Redis),并用队列消息发出信号。

如果您的web应用程序有任何代码需要这么长时间,则将其移动到web作业,至少避免对应用程序可伸缩性造成任何影响

1-创建一个web作业并移动需要很长时间的代码

2-使web作业侦听队列

3-在您的web应用程序中,用户提交后,在队列中插入包含所需详细信息的消息


4-如果您需要通知用户进程已完成,然后使用Signal,从JavaScript连接到集线器,并在web作业代码顶部发布一条消息,这将立即通知用户当我们使用较旧版本的SDK(2.3)时,Azure也有同样的问题还有一个进行webservice调用的负载平衡器。这对您来说可能不同,因为您正在执行数据库查询。负载平衡器的默认超时为4分钟。更新到SDK的较新版本并使用idleTimeoutInMinutes的端点设置,最多可以在超时前30分钟(我想)

行动: 您正在Azure中托管云服务

结果: 您的客户端会调用您的云服务,如果云服务调用时间超过4分钟,则您的客户端会一直挂起,直到客户端超时

原因: Azure云服务负载平衡器中TCP连接的默认空闲超时为4分钟

决议: 您需要升级到至少2.4 Azure SDK,然后可以启用CSDEF文件的idletimeoutminutes属性,以控制Azure负载平衡器在重置该连接之前让这些空闲TCP连接保持活动状态的时间

<Endpoints>
  <InputEndpoint name="Endpoint1" protocol="http" port="80" idleTimeoutInMinutes="6" />
</Endpoints>

新:Azure负载平衡器的可配置空闲超时

如果您使用的是Azure Web App,并且收到了此错误。这是因为azure中负载平衡上的web应用默认超时设置为230秒,即3.8分钟。如果您的应用程序响应请求的时间超过此时间,则会出现此错误


要解决此问题,请检查任何逻辑处理是否需要很长时间才能完成,并在代码中返回响应。

您在浏览器中遇到此错误吗?或者你是从其他地方调用此页面?我在浏览器中找到了它,有点像一个错误页面。你的应用程序是如何部署的?它是作为Web应用程序运行还是在VM/云服务中运行?@GauravMantri它是作为Web应用程序运行的我试图搜索此问题,Azure负载平衡器中似乎有4分钟的默认限制。任何超过该值的请求都将超时。我也读到了改变这种行为的可能性(),但它只涉及虚拟机和云服务。建议使用许多其他解决方法(如request.KeepAlive=true)。我建议您搜索“Azure Web App请求超时”,您将发现许多与此问题相关的问题。
ConcurrentDictionary<int, Dictionary<DateTime, float>> d_PhoneNo_DateDataList = new ConcurrentDictionary<int, Dictionary<DateTime, float>>();

string sqlcommand = "SELECT ---- FROM ---- INNER JOIN ---- ON ---- = ---- WHERE PhoneNo=@PhoneNo AND date BETWEEN @Date1 AND @Date2";
string strConnectionString = ConfigurationManager.ConnectionStrings["----"].ConnectionString;

using (SqlConnection conn = new SqlConnection(strConnectionString))
{
    Dictionary<DateTime, float> d_DateTime_Data;

    using (SqlCommand cmd = new SqlCommand(sqlcommand, conn))
    {
        cmd.Parameters.Add("@PhoneNo", SqlDbType.Int);
        cmd.Parameters.AddWithValue("@Date1", dateStart);
        cmd.Parameters.AddWithValue("@Date2", dateEnd.AddDays(1));
        conn.Open();

        Parallel.For(0, phoneNo.Count, (index) =>
        {
            d_DateTime_Data = new Dictionary<DateTime, float>();
            cmd.Parameters["@PhoneNo"].Value = phoneNo[index];
            cmd.ExecuteNonQuery();
            using (SqlDataReader reader = cmd.ExecuteReader())
            {
                while (reader.Read())
                {
                    d_DateTime_Data.Add(DateTime.Parse(reader["Date"].ToString()), float.Parse(reader["Data"].ToString()));
                }
            }
            d_PhoneNo_DateDataList.TryAdd(phoneNo[index], d_DateTime_Data);
        });
        conn.Close();
    }
}
<Endpoints>
  <InputEndpoint name="Endpoint1" protocol="http" port="80" idleTimeoutInMinutes="6" />
</Endpoints>