2016-06-21 55 views
2

在我的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"/> 

他並沒有幫助我嘗試了第二個選項。

是否有解決問題或異常

+0

因此,它是在服務內部錯誤,而不是服務被調用的地方? – Adam

+0

您使用的是數據讀取器還是數據集? – riteshmeher

+0

@riteshmeher我簡化了代碼。這不是來自'datareader'或'dataset',而是'Sitecore'。 –

回答

0

ThreadAbortException後繼續循環的方式是一個特殊的例外,即在每個catch塊結束時會自動重新拋出,除非你叫Thread.ResetAbort()。 嘗試在catch塊中調用Thread.ResetAbort()

+0

添加'Thread.ResetAbort()'後,我沒有收到'錯誤',但它已停止工作 –

+0

你的意思是你不能捕獲複製數據錯誤? –

+0

是的,在調用'ResrtAbort'方法後,我覺得沒有任何處理正在進行。 –