我正在升级asp.net v3.5网络应用程序。到v4,我在XmlDataSource对象上使用的XSLT转换遇到了一些问题。
XSLT文件的一部分:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ExtensionObject="ds:ExtensionObject">
<xsl:output method="xml" indent="yes" encoding="utf-8"/>
<xsl:template match="/Menus">
<MenuItems>
<xsl:call-template name="MenuListing" />
</MenuItems>
</xsl:template>
<xsl:template name="MenuListing">
<xsl:apply-templates select="Menu" />
</xsl:template>
<xsl:template match="Menu">
<MenuItem>
<xsl:attribute name="Text">
<xsl:value-of select="ExtensionObject:HtmlEncode(MenuTitle)"/>
</xsl:attribute>
<xsl:attribute name="ToolTip">
<xsl:value-of select="MenuTitle"/>
</xsl:attribute>
</MenuItem>
</xsl:template>
</xsl:stylesheet>
这是初始化:
xmlDataSource.TransformArgumentList.AddExtensionObject("ds:ExtensionObject", new ExtensionObject());
xmlDataSource.Data = Cache.FetchPageMenu();
ExtensionObject:
public class ExtensionObject {
public static string HtmlEncode(string input) {
return "test";
}
}
之前我问了一个类似的问题:.net 4 xslt transformation Extension Function broken。对于模糊的调用,答案是对的,但即使使用另一个正确的对象,它也无法正常工作。我没有收到任何错误,只是没有显示数据。
我也尝试了这个;
static void test() {
// Create the XslCompiledTransform and load the stylesheet.
XslCompiledTransform xslt = new XslCompiledTransform(true);
xslt.Load(System.Web.Hosting.HostingEnvironment.MapPath("~/transforms/menu.xslt"));
// Create an XsltArgumentList.
XsltArgumentList xslArg = new XsltArgumentList();
xslArg.AddExtensionObject("ds:ExtensionObject", new ExtensionObject());
using (XmlWriter w = XmlWriter.Create("output.xml")) {
// Transform the file.
xslt.Transform(Cache.FetchPageMenu(), xslArg, w);
}
}
这在控制台应用程序中正常工作,但在Web应用程序中,我得到了一个安全例外,再次没有任何进一步的细节;
[SecurityException:请求失败。]
System.RuntimeMethodHandle.PerformSecurityCheck(对象 obj,RuntimeMethodHandleInternal 方法,RuntimeType父级,UInt32 invocationFlags)+0
System.Reflection.RuntimeMethodInfo.Invoke(对象 obj,BindingFlags invokeAttr,Binder binder,Object []参数, CultureInfo文化,布尔 skipVisibilityChecks)+323
System.Reflection.RuntimeMethodInfo.Invoke(对象 obj,BindingFlags invokeAttr,Binder binder,Object []参数, 文化信息文化)+38
System.Reflection.MethodBase.Invoke(对象 obj,Object []参数)+35
System.Xml.Xsl.XsltOld.FuncExtension.Invoke(XsltContext xsltContext,Object [] args, XPathNavigator docContext)+164
MS.Internal.Xml.XPath.FunctionQuery.Evaluate(创建XPathNodeIterator nodeIterator)+430
我正在以完全信任的方式运行本地asp.net v4 IIS7。
ExtensionObjects有什么问题。另外,为什么调试这么困难,是否有一个很好的工具来调试带有扩展对象的xslt?
感谢agian ..
答案 0 :(得分:5)
几天后我终于找到了解决方案......
来自这篇文章:Rendering a control generates security exception in .Net 4
为程序集设置[assembly:SecurityRules(SecurityRuleSet.Level1)],它可以正常工作。