1

SharePoint MOSS 2007 カスタム Web パーツに XSLT ファイルを読み込もうとしていますが、XSLT ファイルにアクセスしようとすると 401 エラーが発生します。デフォルトの資格情報を提供しようとしましたが、デバッグ中に検査すると空です。

カスタム Web パーツから XSLT ファイルを読み込む方法を知っている人はいますか? 前もって感謝します。

    XmlUrlResolver resolver = new XmlUrlResolver();
    resolver.Credentials = CredentialCache.DefaultNetworkCredentials;

    XsltSettings settings = new XsltSettings(true, true);  

    XslCompiledTransform oXSLTranform = new XslCompiledTransform();

    string siteUrl = SPContext.Current.Site.Url;
    if (siteUrl.EndsWith("/"))
        siteUrl = siteUrl.Remove(siteUrl.LastIndexOf("/"));

    siteUrl += "/Style Library/XSL Style Sheets/THM1News.xslt";

    oXSLTranform.Load(siteUrl ,settings, resolver);

このコードは 401 エラーを返します。

リモート サーバーがエラーを返しました: (401) 権限がありません。

[WebException: リモート サーバーがエラーを返しました: (401) Unauthorized.] System.Net.HttpWebRequest.GetResponse() +5313085 System.Xml.XmlDownloadManager.GetNonFileStream(Uri uri, ICredentials credentials) +69 System.Xml.XmlDownloadManager.GetStream (Uri uri、ICredentials 資格情報) +3929007 System.Xml.XmlUrlResolver.GetEntity(Uri absoluteUri、String role、Type ofObjectToReturn) +54 System.Xml.Xsl.Xslt.XsltLoader.CreateReader(Uri uri、XmlResolver xmlResolver) +26 System. Xml.Xsl.Xslt.XsltLoader.Load(コンパイラ コンパイラ、オブジェクト スタイルシート、XmlResolver xmlResolver) +315 System.Xml.Xsl.Xslt.Compiler.Compile(オブジェクト スタイルシート、XmlResolver xmlResolver、QilExpression& qil) +41 System.Xml.Xsl. XslCompiledTransform.CompileXsltToQil(Object スタイルシート、XsltSettings 設定、XmlResolver stylesheetResolver) +59 System.Xml.Xsl.XslCompiledTransform.LoadInternal(Object stylesheet, XsltSettings settings, XmlResolver stylesheetResolver) +66 System.Xml.Xsl.XslCompiledTransform.Load(String stylesheetUri, XsltSettings settings, XmlResolver stylesheetResolver) +38 NewsGallery.AjaxNewsWebPart.AjaxNewsControl.RenderContents(HtmlTextWriter出力) +403 System .Web.UI.WebControls.WebControl.Render(HtmlTextWriter ライター) +32 System.Web.UI.Control.RenderControlInternal(HtmlTextWriter ライター、ControlAdapter アダプター) +27 System.Web.UI.Control.RenderControl(HtmlTextWriter ライター、ControlAdapter アダプター) +99 System.Web.UI.Control.RenderControl(HtmlTextWriter ライター) +25 System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter ライター、ICollection の子) +134 System.Web.UI.Control.RenderChildren(HtmlTextWriter ライター) +19 System.Web.UI.WebControls.WebControl.RenderContents(HtmlTextWriter ライター) +10 System.Web.UI.WebControls.WebControl.Render(HtmlTextWriter ライター) +32 Microsoft.SharePoint.WebPartPages.WebPart.RenderWebPart(HtmlTextWriter 出力) +36 Microsoft.SharePoint.WebPartPages.WebPart.RenderWebPartInternal(HtmlTextWriterライター) +139 Microsoft.SharePoint.WebPartPages.WebPart.Render(HtmlTextWriter ライター) +93 System.Web.UI.Control.RenderControlInternal(HtmlTextWriter ライター、ControlAdapter アダプター) +27 System.Web.UI.Control.RenderControl(HtmlTextWriter ライター、 ControlAdapter アダプター) +99 System.Web.UI.Control.RenderControl(HtmlTextWriter ライター) +25 Microsoft.SharePoint.WebPartPages.SPChrome.RenderPartContents(HtmlTextWriter 出力、WebPart パーツ) +66Render(HtmlTextWriter ライター) +32 Microsoft.SharePoint.WebPartPages.WebPart.RenderWebPart(HtmlTextWriter 出力) +36 Microsoft.SharePoint.WebPartPages.WebPart.RenderWebPartInternal(HtmlTextWriter ライター) +139 Microsoft.SharePoint.WebPartPages.WebPart.Render(HtmlTextWriter ライター) +93 System.Web.UI.Control.RenderControlInternal(HtmlTextWriter ライター、ControlAdapter アダプター) +27 System.Web.UI.Control.RenderControl(HtmlTextWriter ライター、ControlAdapter アダプター) +99 System.Web.UI.Control.RenderControl(HtmlTextWriter ライター) ) +25 Microsoft.SharePoint.WebPartPages.SPChrome.RenderPartContents(HtmlTextWriter 出力、WebPart パーツ) +66Render(HtmlTextWriter ライター) +32 Microsoft.SharePoint.WebPartPages.WebPart.RenderWebPart(HtmlTextWriter 出力) +36 Microsoft.SharePoint.WebPartPages.WebPart.RenderWebPartInternal(HtmlTextWriter ライター) +139 Microsoft.SharePoint.WebPartPages.WebPart.Render(HtmlTextWriter ライター) +93 System.Web.UI.Control.RenderControlInternal(HtmlTextWriter ライター、ControlAdapter アダプター) +27 System.Web.UI.Control.RenderControl(HtmlTextWriter ライター、ControlAdapter アダプター) +99 System.Web.UI.Control.RenderControl(HtmlTextWriter ライター) ) +25 Microsoft.SharePoint.WebPartPages.SPChrome.RenderPartContents(HtmlTextWriter 出力、WebPart パーツ) +66WebPartPages.WebPart.Render(HtmlTextWriter ライター) +93 System.Web.UI.Control.RenderControlInternal(HtmlTextWriter ライター、ControlAdapter アダプター) +27 System.Web.UI.Control.RenderControl(HtmlTextWriter ライター、ControlAdapter アダプター) +99 System.Web .UI.Control.RenderControl(HtmlTextWriter ライター) +25 Microsoft.SharePoint.WebPartPages.SPChrome.RenderPartContents(HtmlTextWriter 出力、WebPart パーツ) +66WebPartPages.WebPart.Render(HtmlTextWriter ライター) +93 System.Web.UI.Control.RenderControlInternal(HtmlTextWriter ライター、ControlAdapter アダプター) +27 System.Web.UI.Control.RenderControl(HtmlTextWriter ライター、ControlAdapter アダプター) +99 System.Web .UI.Control.RenderControl(HtmlTextWriter ライター) +25 Microsoft.SharePoint.WebPartPages.SPChrome.RenderPartContents(HtmlTextWriter 出力、WebPart パーツ) +66

4

2 に答える 2

1

代わりにこの方法論を使用しました:

StringReader xmlReader = new StringReader(rawXML);
XPathDocument xmlDoc = new XPathDocument(xmlReader);

XslCompiledTransform myXslTransformer = new XslCompiledTransform();
XmlUrlResolver xmlResolver = new XmlUrlResolver();
xmlResolver.Credentials = CredentialCache.DefaultCredentials;
XsltSettings settings = new XsltSettings(true, true);

// Load XSL
SPSecurity.RunWithElevatedPrivileges(delegate()
{
    myXslTransformer.Load(XslPath, settings, xmlResolver);
});


// Create the output stream
StringWriter sWriter = new StringWriter();
XmlTextWriter writer = new XmlTextWriter(sWriter);

// Transform
myXslTransformer.Transform(xmlDoc, null, writer);

writer.Close();

string transformedXML = sWriter.ToString();

そして、それはうまくいきました。

于 2012-05-15T12:57:49.130 に答える
1

少し前に同じ問題に遭遇しました。これは、投稿してからしばらく経っていることを確認するのに役立たないかもしれませんが、他の誰かを助けるかもしれません.

この 401 エラーの原因となる明白な状況 (つまり、スタイル ライブラリの xslt に公開されたメジャー バージョンがない、または xslt を取得しないユーザー アカウントで xslt をプルする Web パーツ ページにアクセスする) を既に排除していると想定しています。最初にスタイル ライブラリにアクセスできます。また、少なくとも 1 つの Web フロント エンドと、コンテンツ データベースをホストする別の db サーバーを備えたファーム環境があり、Web アプリケーションは匿名アクセスに対して有効になっておらず、認証方式は NTLM (kerberos ではない) と統合された Windows であると仮定しています。承認と偽装が有効になっています。

ここで理解しておく必要があるのは、Web パーツ コード内から oXSLTranform.Load(xsltUrl) を呼び出すと、偽装されたユーザーの資格情報で実行されているコードが、実際にはアウト オブ バンド リクエスト (リクエストが直接来ない) を作成していることです。ブラウザーから) 物理的に Web サーバー上ではなく、データベース内に存在するファイルの場合。要求を行った Web フロント エンドの IIS ログを見ると、通常の 401.2 に続いて 401.1 (通常の NTLM ハンドシェイクの要求と応答のシーケンス) が表示されますが、次の応答も予期されたものではなく 401.1 になります。 200.0 は、空の cs-username ヘッダーを使用して要求が行われたためです (想定される偽装ユーザー名ではなく)。このアウトオブバンド リクエストのセキュリティ コンテキストは委任できず (kerberos が有効になっていないため)、Web アプリケーションに対して匿名アクセスも有効になっていないため、ファイルのリクエストは 401 ステータスで拒否されるため、空です。これを機能させるには、明示的なネットワーク資格情報オブジェクト (new NetworkCredential(username, password, domain) など) をリゾルバーに渡す必要があります。

これが私がそれを解決した方法です...

string siteUrl = SPContext.Current.Site.Url;
SPWeb rootWeb = SPContext.Current.Site.RootWeb;

if (siteUrl.EndsWith("/")) 
    siteUrl = siteUrl.Remove(siteUrl.LastIndexOf("/"));

string xmlFileUrl = siteUrl + "/data.xml";
string xsltFileUrl = siteUrl + "/transform.xslt";

if (rootWeb != null)
{
    var xmlDoc = new XmlDocument();
    var xslDoc = new XmlDocument();

    SPFile xmlDataFile = rootWeb.GetFile(xmlFileUrl);  // since you are
    // using the SP OM to extract the file from the doc library item you
    // are going under the impersonated user credential. No need to elevate
    // permissions

    if (xmlDataFile != null)
    {
        Stream xmlDataStream = xmlDataFile.OpenBinaryStream();
        xmlDoc.Load(xmlDataStream);
        xmlDataStream.Close();
    }

    SPFile xsltTransformFile = rootWeb.GetFile(xsltFileUrl);

    if (xsltTransformFile != null)
    {
        Stream xsltStream = xsltTransformFile.OpenBinaryStream();
        xslDoc.Load(xsltStream);
        xsltStream.Close();
    }

    // You now have your xmlDoc and xslDoc you can run your transform
    // without having to provide a resolver
    TransformXml(xmlDoc.outerXml, xslDoc.outerXml, false);
}

private string TransformXml(string xml, string xslt, bool bDebug)
{
    StringReader xsltInput = new StringReader(xslt);
    StringReader xmlInput = new StringReader(xml);
    XmlTextReader xsltReader = new XmlTextReader(xsltInput);
    XmlTextReader xmlReader = new XmlTextReader(xmlInput);

    // Create required writer for output   
    StringWriter stringWriter = new StringWriter();
    XmlTextWriter transformedXml = new XmlTextWriter(stringWriter);

    // Create a XslCompiledTransform to perform transformation   
    XslCompiledTransform xsltTransform = new XslCompiledTransform(bDebug);            
    xsltTransform.Load(xsltReader);
    xsltTransform.Transform(xmlReader, transformedXml);
}
于 2011-06-09T22:21:42.827 に答える