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 파일이 올바르게 생성되었습니다. 내가 여기서 어디로 잘못 가고 있니?
Prashant가 놓쳤던 한 가지 중요한 사실은 실행의 다른 컨텍스트 인 웹 파트의 w3wp.exe와 타이머 작업의 owstimer.exe입니다. – Alexey
또 다른 위험이나 구성 저장 옵션은 더 많은 서버가 팜에 추가되면 모든 변경 사항이 매번 명시 적으로 동기화되지 않는 한 일부는 최신 버전으로 동기화되지 않으며 일부는 파일을 전혀 보유하지 않습니다! – Alexey