2013-05-15 2 views
1

У меня есть задание таймера, которое должно читать некоторые данные из файла XML и сохранять его в текстовом файле. Я протестировал этот код в простой веб-части, и он отлично работает. Однако он не работает с пользовательским заданием таймера. Вот код -Невозможно прочитать из XML-файла в задании таймера SharePoint

public override void Execute(Guid targetInstanceId) 
    { 
     #if (DEBUG) 
      System.Diagnostics.Trace.Assert(false); 
     #endif 


     // get a reference to the current site collection's content database 
     SPWebApplication webApplication = this.Parent as SPWebApplication; 
     SPContentDatabase contentDb = webApplication.ContentDatabases[targetInstanceId]; 


     //Define a string builder object 
     StringBuilder stringBuilder = new System.Text.StringBuilder(); 
     //double revenue = 0; 
     //creating object of configuration class 

     //Reading page size from xml configuration file 
     int intPageLimit = weeklyConfig.readPageSize(); 
     //Reading column name from xml configuration file 
     List<string> strList = weeklyConfig.readColumnName(); 
     //Reading list name from xml configuration file 
     string strListName = weeklyConfig.readListName(); 
     //Reading Library name from xml 
     string strLibraryName = weeklyConfig.readLibraryName(); 
     stringBuilder.Append(intPageLimit); 
     foreach (string str in strList) 
     { 
      stringBuilder.Append(str); 
     } 
     stringBuilder.Append(strListName); 
     stringBuilder.Append(strLibraryName); 
     SPFolder customerDocLib = null; 
     customerDocLib = contentDb.Sites[0].RootWeb.Folders["Reports"]; 
     byte[] byteArray = Encoding.ASCII.GetBytes(stringBuilder.ToString()); 
     MemoryStream stream = new MemoryStream(byteArray); 
     string fileName = "TestReport_" + DateTime.Now.ToString("MMddyyyyhhmmss") + ".doc";//Creating .doc file 
     customerDocLib.Files.Add(fileName, stream);//writing memory stream to doc file and saving it into SharePoint document library 
    } 

Вот код, который создает XML-файл. Я добавил этот код в приемник событий на уровне функции. Я сохраняю этот файл XML в виртуальном каталоге inetpub, где развертывается мой семейство сайтов. Путь - C: /inetpub/wwwroot/wss/VirtualDirectories/38118/Configuration/ConfigFile.xml

public static void CreateConfigFile(String path) 
    { 
     //Use an xml Writer 
     using (XmlWriter writer = XmlWriter.Create(path + "/ConfigFile.xml")) 
     { 
      //Start the Xml Document 
      writer.WriteStartDocument(); 
      //Create Root element 
      writer.WriteStartElement("Root"); 
      //Write Element in the root element 
      writer.WriteElementString("PageSize", "33"); 
      writer.WriteElementString("Column", "Title"); 
      writer.WriteElementString("Column", "SalesPerson"); 
      writer.WriteElementString("Column", "SalesTarget"); 
      writer.WriteElementString("Column", "Achieved"); 
      writer.WriteElementString("Column", "UnitPrice"); 
      writer.WriteElementString("Column", "TotalRevenue"); 
      writer.WriteElementString("ListName", "SalesList"); 
      writer.WriteElementString("LibraryName", "Reports"); 
      //End the root element 
      writer.WriteEndElement(); 
      //End the Xml Document 
      writer.WriteEndDocument(); 
     } 



    } 

Эти методы я использую для чтения из файла XML. Они отлично работают с веб-частью. Но он дает исключение «Ссылка на объект, не установленную для экземпляра объекта» при использовании в задании таймера.

public class configuration : LayoutsPageBase 
{ 
    public List<string> readColumnName() 
    { 
     XmlReader reader = XmlReader.Create(Server.MapPath("~/AutomatedReport/ConfigFile.xml")); 
     List<string> listColumnName = new List<string>(); 
     string element = ""; 
     while (reader.Read()) 
     { 
      if (reader.NodeType == XmlNodeType.Element) 
      { 
       element = reader.Name; 
      } 

      else if (reader.NodeType == XmlNodeType.Text) 
      { 
       switch (element) 
       { 
        case "Column": listColumnName.Add(reader.Value.ToString()); 
         break; 
       } 
      } 
     } 
     return listColumnName; 
    } 

Это только один из методов, которые я использую для чтения. Это чтение имен столбцов списка.

XML-файл генерируется должным образом. Где я здесь не так?

ответ

1

Сохраните файл XML в C: \ Program Files \ Common Files \ Microsoft Shared \ Web Server Extensions \ 14 каталог ..... В основном OWSTimer не имеют доступа к
Server.MapPath ("~/AutomatedReport/ConfigFile.xml")

+0

Важная вещь, которую Prashant отсутствовал, - это другой контекст исполнения: w3wp.exe в веб-части и owstimer.exe в задании таймера. – Alexey

+0

Другой риск или вариант конфигурации конфигурации заключается в том, что если к ферме добавляется больше серверов, некоторые из них не будут синхронизироваться с последней версией, а некоторые не будут иметь файл вообще, если все изменения явно не синхронизируются каждый раз! – Alexey

 Смежные вопросы

  • Нет связанных вопросов^_^