У меня есть основное веб-приложение .net с XmlDocument, оно не возвращает декларацию даже без изменений.
У меня есть этот код
[HttpPost]
[Consumes("application/xml")]
[Produces("application/xml")]
public ActionResult<XmlDocument> GW1()
{
XmlDocument xmlDocRec = new XmlDocument();
xmlDocRec.Load(Request.Body);
return Ok(xmlDocRec);
}
Запрос
<?xml version = "1.0" encoding = "utf-8"?>
<GR User = "User1" PropertyCode = "90001045">
<GW>1</GW>
</GR>
Ответ
<GR User = "User1" PropertyCode = "90001045">
<GW>1</GW>
</GR>
У меня это в автозагрузке
services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.AddXmlSerializerFormatters();
Мне нужен ответ <?xml version = "1.0" encoding = "utf-8"?>, но я не знаю, почему он не возвращается. В xmlDocRec.InnerXml и xmlDocRec.OuterXml существует.
У меня нет класса как параметров и ответа, я не могу использовать его по требованию, для этого я использую Request.Body
Очевидно, я работаю с xmlDocRec, добавляю и обновляю элементы, но результат тот же. Когда я работаю с xmlDocRec, xmlDocRec.InnerXml и xmlDocRec.OuterXml содержат <?xml version = "1.0" encoding = "utf-8" standalone = "no"?>. Позже мне нужно будет удалить standalone = "no", потому что ответа не должно быть.
--- Редактировать
Не знаю, правильно ли это, но пока я использую это
[HttpPost]
public ContentResult GW1()
{
XmlDocument xmlDocRec = new XmlDocument();
xmlDocRec.Load(Request.Body);
return new ContentResult
{
ContentType = "application/xml",
Content = xmlDocRec.OuterXml,
StatusCode = 200
};
}
При этом мне не нужны Consumes, Produces и AddXmlSerializerFormatters при запуске.
Если кто-то знает способ получше, я готов попробовать.
Да, мне нужно использовать XmlDocument





Возможно, вы захотите создать свой ответ с явными значениями свойств, установленными в классе XmlDeclaration.
I suggest you take a look at the XmlDeclaration Class
[HttpPost]
[Consumes("application/xml")]
[Produces("application/xml")]
public ActionResult<XmlDocument> EchoXmlAndChangeEncoding()
{
string requestXML = Request.Body;
XmlDocument doc = new XmlDocument();
doc.Load(new StringReader(requestXML));
// Grab the XML declaration.
XmlDeclaration xmldecl = doc.ChildNodes.OfType<XmlDeclaration>().FirstOrDefault();
xmldecl.Encoding = "UTF-8";
xmldecl.Standalone = null; // <-- or do whatever you need
... // set other declarations here
// Output the modified XML document
return Ok(doc.OuterXml);
}
Я прочитал этот пост, но для этого нужен ´XmlElement root = doc.DocumentElement; doc.InsertBefore (xmldecl, root); ´ но с этим выдает ошибку: Невозможно вставить узел в указанное место. Поскольку выходы, InnerXml и OuterXml показывают его, а return - нет.
@ M.Mis - учитывая, что вам нужен более четкий ответ (а не подсказка), я обновил свой ответ, чтобы показать вам весь метод.
Спасибо, но ничего не изменилось, даже строка requestXML = Request.Body выкинула ошибку. doc.OuterXml возвращает строку с объявлением, а не xml, но, как говорится в моем исходном вопросе, мой код с объявлением возврата OuterXml тоже. Думаю, у меня проблема с конфигурацией, но я не знаю, что мне не хватает
Вы можете попытаться настроить свой XmlSerializerOutputFormatter в методе ConfigureServices с помощью XmlWriterSettings.OmitXmlDeclaration и установить для него значение false, поскольку по умолчанию для него установлено значение true.
private void ConfigureXmlOutpuFormatter(MvcOptions options)
{
XmlWriterSettings settings = new XmlWriterSettings
{
OmitXmlDeclaration = false
};
options.OutputFormatters.Add(new XmlSerializerOutputFormatter(settings));
}
Обязательно ли использовать XmlDocument? А как насчет XDocument?