문제

문서 라이브러리에서 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 파일을 검색하라는 인증 된 요청을 지원하지 않습니다.

그러나 복용중인 접근 방식은 문서가 열릴 때마다 두 개의 웹 요청이 이루어지기 때문에 다른 방법이 있습니다.

  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 디자이너를 사용하여 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
            }
        }
    });
.

이 테스트를 거쳤습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 sharepoint.stackexchange
scroll top