我正在尝试从我的文档库中打开XML文件。我在我知道存在的文件上运行一些代码为“提升特权”。

我写下的代码是:

 SPSecurity.RunWithElevatedPrivileges(() =>
                {
                    using (SPSite sito = new SPSite("SITE URL"))
                    {
                        using (SPWeb web = sito.OpenWeb())
                        {
                            SPList lista = web.Lists.TryGetList("DOCUMENT LIBRARY NAME");

                            foreach (SPFile file in lista.RootFolder.Files)
                            {
                                String fileUrl = web.Url + "/" + lista.RootFolder.Url + "/" + file.Url;
                                var ret = XDocument.Load(fileUrl);
                            }

                        }
                    }
                });
.

当我到达xdocument.load命令时,我得到“401未经授权”的例外..

我的代码有问题吗?xdocument是错误的刺激吗?

非常感谢

有帮助吗?

解决方案

我猜xdocument.load(string)的实现不支持检索XML文件的经过身份验证的请求。 但是,还有另一种方式,因为您所采用的方法将意味着每次打开文档时,都会进行两个Web请求。

  1. 一个使用spfile对象构建URL
  2. 使用步骤1中内置的URL访问SPFile对象。

    如何构建FileURL变量,使用Xdocument.load()的另一个过载?这次而不是在流对象中的URI传递。

    您拥有所需的所有信息,可以做到这一点: -

    SPFileCollection filesInFolder = lista.RootFolder.Files;
    foreach(SPFile file in filesInFolder)
    {
        using(Stream fileStream = file.OpenBinaryStream())
        {
             XDocument xmlDocument = XDocument.Load(fileStream);
             fileStream.Close()
        }
    }
    
    .

    我没有尝试过代码,但让我们知道你是如何进入的。 还要运行spdisposecheck以确保这不会导致任何内存泄漏。

其他提示

我发现了,通过正确的转换,我可以在“正常”应用程序中,我可以管理流。

我现在使用的代码(和工作是:

SPSecurity.RunWithElevatedPrivileges(() =>
                {
                    using (SPSite sito = new SPSite("SITE URL"))
                    {
                        using (SPWeb web = sito.OpenWeb())
                        {
                            SPList lista = web.Lists.TryGetList("DOCUMENT LIBRARY NAME");

                            foreach (SPFile file in lista.RootFolder.Files)
                            {
                                MemoryStream mStream = new MemoryStream(file.OpenBinary());
                                StreamReader reader = new StreamReader(mStream, true);
                                XDocument documento = XDocument.Load(reader, LoadOptions.None);
                                //MY CODE
                            }

                        }
                    }
                });
.

Simon Doy的方法对我不起作用 - 如果我在流中读入Xdocument.load()方法 - 我会得到错误 “”system.xml.linq.xdocument.load(system.xml.xmlreader)“的最佳过载方法匹配”有一些无效的参数“和 “参数'1':无法从'system.io.stream'转换为'system.xml.xmlReader'”

现在授予,我试图在使用SharePoint Designer中加入XML文件,我刚刚添加到SharePoint站点的文件夹结构,而不是文档库中的文件,但它看起来会传递一个StreamReader非常重要,因为我能够在使用Ziba的方法时可以工作,但它不接受流 - 它只具有URI,Textreader或XmlReader选项(可以是StreamReader的形式)。

string siteUrl = SPContext.Current.Site.Url;
string xmlpath = siteUrl + @"/includes/XML/myFile.xml";
SPSecurity.RunWithElevatedPrivileges(delegate() 
    {
        using (SPSite site = new SPSite(siteUrl))
        {
            using (SPWeb web = site.OpenWeb())
            {
                SPFile file = web.GetFile(xmlpath);
                MemoryStream mStream = new MemoryStream(file.OpenBinary());
                StreamReader reader = new StreamReader(mStream, true);
                XDocument doc = XDocument.Load(reader, LoadOptions.None);
                //MY CODE
            }
        }
    });
.

这已经过测试并工作。

许可以下: CC-BY-SA归因
scroll top