最近我们从ASP.NET Web服务获取System.Threading.ThreadAbortExceptions,每晚都会将数据发布到付款服务器。
webservice是一个标准的.asmx页面,可以从另一个客户端调用。
在页面内部,我有一个foreach循环,它遍历数据库中的许多支付行:
foreach (var obtRow in readyToBeCaptured)
{
try
{
status = dibs.GetPagePost(...);
// handle status here
}
catch (ThreadAbortException tex)
{
SingletonLogger.Instance.Error(string.Format("Transactionhandler - Could not Capture, Thread was aborted. {0}", tex.Message), tex);
}
catch (Exception ex)
{
SingletonLogger.Instance.Error(string.Format("Transactionhandler - Could not Capture, statuscode: {0}, message: {1}.", status, ex.Message), ex);
}
}
奇怪的是,当发生此错误时,我从catch(ThreadAbortException tex)块获取一个日志条目,但随后代码中断,并在调用树的另一个try catch块中被捕获。理想情况下,我会让foreach循环中的代码继续
这是GetPagePost方法
private bool GetPagePost(string url, NameValueCollection nameValueCollection, string userName, string password)
{
WebClient client = new WebClient();
if (userName != "")
{
client.Credentials = new NetworkCredential(userName, password);
}
foreach (string str in nameValueCollection.AllKeys)
{
this._callCollection.Add(str, nameValueCollection[str]);
}
StringBuilder builder = new StringBuilder();
builder.Append("DIBS.NET/1.2.0 ( ");
builder.Append("OS ").Append(Environment.OSVersion.Platform).Append(" ").Append(Environment.OSVersion.Version).Append("; ");
builder.Append(".NET CLR ").Append(Environment.Version).Append("; ");
builder.Append("User ").Append(Environment.UserName).Append("; ");
builder.Append("Domain ").Append(Environment.UserDomainName).Append("; ");
builder.Append(" ) ");
client.Headers.Add("User-Agent", builder.ToString());
try
{
byte[] bytes = client.UploadValues(url, "POST", nameValueCollection);
this._httpStatus = 200;
this._httpBody = Encoding.UTF8.GetString(bytes);
return true;
}
catch (WebException exception)
{
this._httpBody = exception.Message;
this._httpStatus = (int) exception.Status;
}
catch (UriFormatException exception2)
{
this._httpBody = exception2.Message;
this._httpStatus = -9999;
}
catch (Exception exception3)
{
this._httpBody = exception3.Message;
this._httpStatus = -99999;
}
return false;
}}
为什么会出现此错误?如何防止代码突破foreach循环? 我一直在关注StackOverflow上的其他一些帖子,但它们似乎与我不使用的Reponse.Redirect的使用有关。
谢谢
/延
答案 0 :(得分:4)
我有类似的问题。我认为IIS终止你的线程需要太长时间。根据您的描述“我有一个遍历数据库中许多支付行的foreach循环”,您可以重新构建应用程序以单独处理每一行。创建一个web方法将行发送到客户端,然后让客户端一次迭代一个事务并在不同的web方法中处理它们。然后,您可以处理发生的异常并继续运行。您甚至可以使用Parallel.ForEach
一次处理多个答案 1 :(得分:1)
最近几天我遇到了与Web服务类似的问题,并解决了在此行中添加</system.web>
web.config的问题:<httpRuntime executionTimeout="600"/>
。
600是asp.net关闭的秒数。默认值为110秒。
它在此解释better它的作用。
答案 2 :(得分:0)
尝试RND之后尝试一些操作:
httpRuntime targetFramework =“ 4.5” maxRequestLength =“ 4000” executionTimeout =“ 45”
ref:http://dotnetvisio.blogspot.com/2013/07/solution-for-thread-being-aborted-call.html