Я создал пользовательский HTMLHelper
, который должен обрабатывать XML. Метод принимает XML и путь к файлу XSL
и должен возвращать HTML.
. При доступе к странице я получаю сообщение об ошибке
XmlException: Из соображений безопасности DTD в этом документе XML запрещен. Чтобы включить обработку DTD, установите для свойства DtdProcessing в XmlReaderSettings значение Parse и передайте настройки в метод XmlReader.Create.
Как вы можете видеть в моем коде ниже, я устанавливаю DtdProcessing
в Parse
в XmlReaderSettings
(как предполагает исключение), который, как я думал, решит проблему. При ближайшем рассмотрении происходит исключение в строке:
transformObj.Load(xsltPath);
Но я не вижу, как передать этому методу XmlReaderSettings
, чтобы установить свойство DtdProcessing
. Единственные перегрузки XslCompiledTransform.Load
, которые принимают объект настроек, ожидают объект XsltSettings
, у которого нет свойства DtdProcessing
.
Полный метод выглядит следующим образом:
public static IHtmlContent RenderXml(this IHtmlHelper htmlHelper, string xml, string xsltPath)
{
XsltArgumentList args = new XsltArgumentList();
// Create XslCompiledTransform object to load and compile XSLT file.
XslCompiledTransform transformObj = new XslCompiledTransform();
transformObj.Load(xsltPath);
// Create XMLReaderSetting object to assign DtdProcessing, Validation type
XmlReaderSettings xmlSettings = new XmlReaderSettings();
xmlSettings.DtdProcessing = DtdProcessing.Parse;
xmlSettings.MaxCharactersFromEntities = 1024; // Prevent DoS attacks
xmlSettings.ValidationType = ValidationType.DTD;
// Create XMLReader object to Transform xml value with XSLT setting
XmlReader reader = XmlReader.Create(new StringReader(xml), xmlSettings);
using (reader)
{
StringWriter writer = new StringWriter();
transformObj.Transform(reader, args, writer);
// Generate HTML string from StringWriter
HtmlString htmlString = new HtmlString(writer.ToString());
return htmlString;
}
}
И, на мой взгляд, я использую:
@Html.RenderXml(ViewBag.XML as string, ViewBag.XSL as string);
Я рассмотрел совет в ответах на на этот вопрос , но, насколько я могу судить, я уже принял предложенные шаги. Принятый ответ на этот вопрос MSDN , кажется, намекает на ответ, но я не смог понять, как его использовать.