2013-05-15 3 views
1

XML 파일에서 일부 데이터를 읽고 단어 파일로 저장해야하는 사용자 지정 타이머 작업이 있습니다. 나는이 코드를 간단한 웹 파트에서 테스트했으며 완벽하게 정상적으로 작동한다. 그러나 그것은 맞춤 타이머 작업과 함께 작동하지 않습니다. 여기에 코드가 있습니다 -SharePoint 타이머 작업에서 XML 파일을 읽을 수 없습니다.

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 파일에서 읽을 사용하고 방법입니다. 이것들은 webpart로 완전히 작동합니다. 그러나 타이머 작업에서 사용될 때 "개체 참조가 개체 인스턴스에 설정되지 않았습니다"예외가 발생합니다.

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

C에서 XML 파일을 저장 : 14 디렉토리 \ \ 프로그램 파일 \ 공용 Files \ Microsoft Shared \ 웹 서버 확장 ..... 는 대부분 OWSTimer은 (
는 Server.MapPath에 액세스 할 수 없습니다 "~/AutomatedReport/ConfigFile.xml")

+0

Prashant가 놓쳤던 한 가지 중요한 사실은 실행의 다른 컨텍스트 인 웹 파트의 w3wp.exe와 타이머 작업의 owstimer.exe입니다. – Alexey

+0

또 다른 위험이나 구성 저장 옵션은 더 많은 서버가 팜에 추가되면 모든 변경 사항이 매번 명시 적으로 동기화되지 않는 한 일부는 최신 버전으로 동기화되지 않으며 일부는 파일을 전혀 보유하지 않습니다! – Alexey

관련 문제