.net 4 xslt扩展对象

pet*_*ter 3 c# xslt asp.net-4.0 extension-objects

我正在升级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> 
Run Code Online (Sandbox Code Playgroud)

这是初始化:

xmlDataSource.TransformArgumentList.AddExtensionObject("ds:ExtensionObject", new ExtensionObject()); 
xmlDataSource.Data = Cache.FetchPageMenu(); 
Run Code Online (Sandbox Code Playgroud)

ExtensionObject:

public class ExtensionObject {
    public static string HtmlEncode(string input) {
        return "test";
    } 
}
Run Code Online (Sandbox Code Playgroud)

之前我问了一个类似的问题:.net 4 xslt转换扩展功能坏了.对于模糊的调用,答案是对的,但即使使用另一个正确的对象,它也无法正常工作.我没有收到任何错误,只是没有显示数据.

我也试过这个;

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这在控制台应用程序中正常工作,但在Web应用程序中,我得到了一个安全例外,再次没有任何进一步的细节;

[SecurityException:Request failed.]
System.RuntimeMethodHandle.PerformSecurityCheck(Object obj,RuntimeMethodHandleInternal方法,RuntimeType父级,UInt32 invocationFlags)+0
System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object []参数,CultureInfo culture,Boolean skipVisibilityChecks)+323
System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object [] parameters,CultureInfo culture)+38
System.Reflection.MethodBase.Invoke(Object obj,Object [] parameters) +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?

谢谢你...

小智 5

几天后我终于找到了解决方案......

它来自这篇文章:渲染控件会在.Net 4中生成安全异常

为程序集设置[assembly:SecurityRules(SecurityRuleSet.Level1)]并且它可以工作.