在SharePoint上未经授权XDocument.load
-
10-12-2019 - |
题
我正在尝试从我的文档库中打开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请求。
- 一个使用spfile对象构建URL
- 使用步骤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
}
}
});
.
这已经过测试并工作。