load - Sharepoint Webpart loading XSLT file returns 401 -
i trying load xslt file in sharepoint moss 2007 custom webpart, getting 401 error while trying access xslt file. tried providing default credentials empty upon inspection during debugging.
does know how can load xslt file custom webpart? in advance.
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);
this code returns 401 error:
the remote server returned error: (401) unauthorized.
[webexception: remote server returned error: (401) unauthorized.] system.net.httpwebrequest.getresponse() +5313085 system.xml.xmldownloadmanager.getnonfilestream(uri uri, icredentials credentials) +69 system.xml.xmldownloadmanager.getstream(uri uri, icredentials credentials) +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(compiler compiler, object stylesheet, xmlresolver xmlresolver) +315 system.xml.xsl.xslt.compiler.compile(object stylesheet, xmlresolver xmlresolver, qilexpression& qil) +41 system.xml.xsl.xslcompiledtransform.compilexslttoqil(object stylesheet, xsltsettings settings, 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 output) +403 system.web.ui.webcontrols.webcontrol.render(htmltextwriter writer) +32 system.web.ui.control.rendercontrolinternal(htmltextwriter writer, controladapter adapter) +27 system.web.ui.control.rendercontrol(htmltextwriter writer, controladapter adapter) +99 system.web.ui.control.rendercontrol(htmltextwriter writer) +25 system.web.ui.control.renderchildreninternal(htmltextwriter writer, icollection children) +134 system.web.ui.control.renderchildren(htmltextwriter writer) +19 system.web.ui.webcontrols.webcontrol.rendercontents(htmltextwriter writer) +10 system.web.ui.webcontrols.webcontrol.render(htmltextwriter writer) +32 microsoft.sharepoint.webpartpages.webpart.renderwebpart(htmltextwriter output) +36 microsoft.sharepoint.webpartpages.webpart.renderwebpartinternal(htmltextwriter writer) +139 microsoft.sharepoint.webpartpages.webpart.render(htmltextwriter writer) +93 system.web.ui.control.rendercontrolinternal(htmltextwriter writer, controladapter adapter) +27 system.web.ui.control.rendercontrol(htmltextwriter writer, controladapter adapter) +99 system.web.ui.control.rendercontrol(htmltextwriter writer) +25 microsoft.sharepoint.webpartpages.spchrome.renderpartcontents(htmltextwriter output, webpart part) +66
i came across same issue while ago. might not out seeing it's been while since posted might else.
i'm assuming you've eliminated obvious situations that'll cause 401 error - namely, xslt in style library not having published major version or accessing webpart page pulls xslt under user account not have access style library in first place. i'm assuming have farm environment atleast 1 web front end , separate db server host content db, web application not enabled anonymous access , authentication scheme integrated windows ntlm (not kerberos) authorization , impersonation enabled.
what need understand here when call oxsltranform.load(xslturl) within webpart code, code running under credentials of impersonated user formulating out-of-band request (request not coming directly browser) file resides in database , not physically on web server. if @ iis log on web front end make request, you'll see normal 401.2 followed 401.1 (normal ntlm handshake request-response sequence) next response 401.1 instead of expected 200.0 because request made cs-username header empty (instead of expected impersonated user name). empty because security context of out-of-band request cannot delegated (since kerberos not enabled) , since anonymous access not enabled web application, request file denied 401 status. you'll need pass explicit network credential object (as in new networkcredential(username, password, domain)) resolver make work , that's no go.
here's how solved it...
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 // using sp om extract file doc library item // going under impersonated user credential. no need 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(); } // have xmldoc , xsldoc can run transform // without having provide 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 output stringwriter stringwriter = new stringwriter(); xmltextwriter transformedxml = new xmltextwriter(stringwriter); // create xslcompiledtransform perform transformation xslcompiledtransform xslttransform = new xslcompiledtransform(bdebug); xslttransform.load(xsltreader); xslttransform.transform(xmlreader, transformedxml); }
Comments
Post a Comment