質問

私のドキュメントライブラリから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は間違ったPribilegeで実行されていますか?

ありがとうございました

役に立ちましたか?

解決

xDocument.loadの実装は、XMLファイルを取得するための認証済み要求をサポートしていません。

しかし、あなたが撮っているアプローチは、文書が開かれるたびに2つのWeb要求が行われていることを意味するため、もう1つの方法があります。

  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()メソッドにストリームを読み込むとエラーが発生します - msgstr "" "system.xml.linq.xdocument.load(system.xml.xmlReader) 'に最適なオーバーロードされたメソッドmatchが' ''無効な引数"と msgstr "'' 1 ':' system.io.stream 'から' system.xml.xmlReader '" に変換できません。

今やし、私は文書ライブラリ内のファイルの代わりにSharePoint Designerを使用してSharePointサイトのフォルダ構造に追加したばかりのXMLファイルを作成しようとしていましたが、渡すことの違いが表示されます。StreamReaderは、ZIBAのメソッドを使用するときに機能することができましたが、ストリームを受け入れることはできませんでした。/ P>

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