Asp.Net中的线程被中止web服务
在我的WebService
中我有一个WebMethod
。此方法包含一个foreach
循环,其中我循环成千上万条记录并添加到Sitecore
,然后写入日志。Asp.Net中的线程被中止web服务
[WebMethod(EnableSession = true)]
public int Copy()
{
foreach (Item item in subItems) //subitems are around 1L
{
CopyLanguage();
}
}
代码复制数据(异常陷入此方法)
private void CopyLanguage()
{
string message = "success";
using (new SecurityDisabler())
{
try
{
//Copying Data
}
catch (Exception ex)
{
message = ex.Message;
}
finally
{
Log(message);
}
}
}
复制数据
void Copy(Sitecore.Data.Items.Item item, Sitecore.Globalization.Language sourceLanguage,
Sitecore.Globalization.Language targetLanguage)
{
//get a reference to the master DB
Sitecore.Data.Database masterDB = Sitecore.Configuration.Factory.GetDatabase("master");
Sitecore.Data.Items.Item targetItem = masterDB.Items[item.ID, targetLanguage];
Sitecore.Data.Items.Item sourceItem = masterDB.Items[item.ID, sourceLanguage];
if (targetItem == null || sourceItem == null || sourceItem.Versions.Count == 0)
return;
//Disable the security context
using (new Sitecore.SecurityModel.SecurityDisabler())
{
try
{
if (targetItem.Versions.Count == 0)
{
//add a version if none exist
targetItem = targetItem.Versions.AddVersion();
}
//edit item in target language
targetItem.Editing.BeginEdit();
sourceItem.Fields.ReadAll();
//copy over all fields from source to target language
//we omit internal fields which start with __
foreach (Sitecore.Data.Fields.Field field in sourceItem.Fields)
{
if (!field.Shared && !field.Name.StartsWith("__") && field.Name.Trim() != "")
{
targetItem.Fields[field.Name].SetValue(field.Value, true);
}
}
targetItem.Editing.EndEdit();
targetItem.Editing.AcceptChanges();
}
catch (Exception ex)
{
targetItem.Editing.CancelEdit();
}
}
书写日志文件文件
private void Log(string message)
{
// Writing Log to text file
}
日志文件打印 “成功”,但一段时间后,抛出一个错误
错误:
线程已被中止
堆栈跟踪
系统.Data.SqlClient.SqlParameter.set_SqlDbType(SqlDbType value)
在Sitecore.Data.SqlServer.SqlServerDataApi.CreateParameter(字符串 名称,对象的值)在 Sitecore.Data.DataProviders.Sql.SqlDataApi.CreateCommand(字符串SQL, 对象[]参数)在 Sitecore.Data.DataProviders。 Sql.SqlDataApi。 <> c__DisplayClass12.b__10()
我已经在Stackoverflow中搜索并得到了这个link。 这里我必须在服务本身中循环。
我已经通过设置
<httpRuntime targetFramework="4.5.2" executionTimeout="600"/>
他并没有帮助我尝试了第二个选项。
是否有解决问题或异常
ThreadAbortException
后继续循环的方式是一个特殊的例外,即在每个catch块结束时会自动重新抛出,除非你叫Thread.ResetAbort()
。 尝试在catch块中调用Thread.ResetAbort()
。
添加'Thread.ResetAbort()'后,我没有收到'错误',但它已停止工作 –
你的意思是你不能捕获复制数据错误? –
是的,在调用'ResrtAbort'方法后,我觉得没有任何处理正在进行。 –
因此,它是在服务内部错误,而不是服务被调用的地方? – Adam
您使用的是数据读取器还是数据集? – riteshmeher
@riteshmeher我简化了代码。这不是来自'datareader'或'dataset',而是'Sitecore'。 –