我有一个运行大约4分30秒的脚本,我在aspx网页的配置页面中将默认超时时间更改为3600秒
它没有返回500 - IIS 8上的开发版本和上载版本的请求超时错误。
然而,当我将它上传到azure的实际网站时,它会返回500 - 请求超时错误。
Azure是否会覆盖这些设置?
CONFIGS:
<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>
编辑:
我将SCM_COMMAND_IDLE_TIMEOUT添加到具有3600值的azure应用程序设置中,但它没有修复错误,现在尝试提高我的代码性能:
原文:
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
Dictionary<int, Dictionary<DateTime, float>> d_PhoneNo_DateDataList = new Dictionary<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();
for (int i = 0; i < phoneNo.Count; i++)
{
d_DateTime_Data = new Dictionary<DateTime, float>();
cmd.Parameters["@PhoneNo"].Value = phoneNo[i];
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.Add(phoneNo[i], d_DateTime_Data);
}
conn.Close();
}
}
我尝试将ParallelDictionary与Parallel.For一起使用,但它会产生DataReader的问题
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();
}
}
答案 0 :(得分:11)
如果您的网络应用程序包含需要很长时间的任何代码,那么请将其移至Web作业,至少避免对应用程序可伸缩性产生任何影响。
1-创建一个Web作业并移动需要很长时间的代码。
2-让Web作业侦听队列
3-在您的网络应用程序中,在用户提交后,在队列中插入包含所需详细信息的消息
4-如果您需要通知用户有关该过程的完成情况,请使用SignalR,从您的JavaScript连接到集线器,并在Web作业代码中发布消息,这将立即通知用户< / p>
答案 1 :(得分:8)
您最有可能遇到App Service中硬编码的230秒超时。
有关详情,请参阅此问题:
Azure ASP .net WebApp The request timed out
尝试将长时间运行的任务作为WebJob并将结果发布到队列或表中。或者发布到Table / Blob(如果你重复使用数据,甚至可能是Redis)并使用Queue消息发出信号。
答案 2 :(得分:1)
当我们使用较旧版本的SDK(2.3)和负载平衡器进行Web服务调用时,我们遇到了与Azure相同的问题。这可能与您不一样,因为您正在进行数据库查询。负载均衡器的默认超时为4分钟。更新到更新版本的SDK并使用idleTimeoutInMinutes的端点设置允许在超时前最多30分钟(我认为)。
您正在Azure中托管云服务
您有客户呼叫您的云服务,如果云服务呼叫的时间超过4分钟,那么您的客户就会挂起,直到客户端超时为止。
Azure云服务负载均衡器中TCP连接的默认空闲超时为4分钟。
您需要升级到至少2.4 Azure SDK,然后您可以启用CSDEF文件的idleTimeoutInMinutes属性来控制Azure负载均衡器在重置该连接之前让这些空闲TCP连接保持活动状态的时间。
<Endpoints>
<InputEndpoint name="Endpoint1" protocol="http" port="80" idleTimeoutInMinutes="6" />
</Endpoints>
新增功能:Azure负载均衡器的可配置空闲超时 http://azure.microsoft.com/blog/2014/08/14/new-configurable-idle-timeout-for-azure-load-balancer/
答案 3 :(得分:0)
如果您正在使用Azure Web App并得到此错误。这是由于默认情况下,负载均衡中为Web应用设置的默认负载均衡超时时间为230秒,即3.8分钟。如果您的应用花了更多时间,那么这次需要响应该请求,您会收到此错误。
要解决此问题,请检查逻辑处理是否需要很长时间才能完成并返回代码中的响应。