1

我有一个自定义计时器作业,它应该从 XML 文件中读取一些数据并将其保存在 word 文件中。我在一个简单的 Web 部件中测试了这段代码,它工作得非常好。但是,它不适用于自定义计时器作业。这是代码 -

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 文件已正确生成。我在哪里错了?

4

2 回答 2

1

将您的 XML 文件保存在 C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14 目录中..... 大多数情况下,OWSTimer 无权访问
Server.MapPath("~/AutomatedReport/ConfigFile.xml" )

于 2013-05-15T06:04:23.773 回答
0

查看https://spg.codeplex.com以获得更好的配置存储选项。

于 2013-05-15T06:46:47.607 回答