.net 4 xslt объекты расширения
Я нахожусь в процессе обновления веб-приложения asp.net v3.5. до v4, и я столкнулся с некоторыми проблемами с преобразованиями XSLT, которые я использую для объектов XmlDataSource.
Часть файла 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. Ответ был неоднозначным в отношении неоднозначного вызова, но даже с другим правильным объектом он просто не будет работать. Я не получаю никаких ошибок, просто данные не отображаются.
Я также попробовал это;
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);
}
}
Это работает правильно в консольном приложении, но в веб-приложении я получаю исключение безопасности, опять же без каких-либо дополнительных подробностей;
[SecurityException: запрос не выполнен.]
System.RuntimeMethodHandle.PerformSecurityCheck (объектный объект, метод RuntimeMethodHandleInternal, родительский элемент RuntimeType, invocationFlags UInt32) +0
System.Reflection.RuntimeMethodInfo.Invoke (Object obj, BindingFlags invokeAttr, Binder Binder, параметры Object[], CultureInfo culture, Логическое skipVisibilityChecks) +323
System.Reflection.RuntimeMethodInfo.Invoke (Object obj, BindingFlags invokeAttr, Binder Binder, параметры Object[], CultureInfo culture) +38
System.Reflection.MethodBase.Invoke (параметры объекта, параметры объекта []) +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 с объектами расширения?
Спасибо, аган..
1 ответ
Через несколько дней я наконец нашел решение...
Это произошло из этого поста: рендеринг элемента управления создает исключение безопасности в.Net 4
Установите [Assembly: SecurityRules(SecurityRuleSet.Level1)] для сборки, и она работает.