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 무단"예외를 얻을 수 있습니다 ..
내 코드가 잘못 되었습니까?잘못된 pribilege로 실행되는 xdocument입니까?
감사합니다
해결책
xdocument.load (String)의 구현이 XML 파일을 검색하라는 인증 된 요청을 지원하지 않습니다.
그러나 복용중인 접근 방식은 문서가 열릴 때마다 두 개의 웹 요청이 이루어지기 때문에 다른 방법이 있습니다.
- 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 디자이너를 사용하여 SharePoint 사이트의 폴더 구조에 방금 추가 한 XML 파일을 풀려고했지만 나에게는 전달의 차이점이 나타납니다.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
}
}
});
.
이 테스트를 거쳤습니다.