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