You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Azure Function中使用OkObjectResult返回XML的问题

在Azure Function中返回预封装XML字符串的正确方法

问题场景

需要在返回IActionResult的静态函数(Azure Function环境,非控制器)中返回一段预封装的XML字符串。XML内容如下:

<Test code="0"><MyChild>123</MyChild></Test>

代码中存储该XML时需转义双引号,示例:

string myxml = "<Test code=\"0\"><MyChild>123</MyChild></Test>";

尝试使用XmlDocument返回时遇到错误:

System.Private.DataContractSerialization: 类型“System.Xml.XmlElement”(数据协定名称为“XmlElement:http://schemas.datacontract.org/2004/07/System.Xml”)是未预期的。请将所有静态未知的类型添加到已知类型列表中——例如,使用KnownTypeAttribute特性,或将它们添加到传递给DataContractSerializer的已知类型列表中。

解决方案

方法一:使用ContentResult直接返回XML字符串

OkObjectResult会默认使用序列化器处理对象,而我们已有现成的XML字符串,直接用ContentResult返回原始内容并指定正确的Content-Type是最直接的方式:

public static IActionResult MyFunction()
{
    // 预封装的XML字符串(已正确转义双引号)
    string myxml = "<Test code=\"0\"><MyChild>123</MyChild></Test>";
    
    return new ContentResult
    {
        Content = myxml,
        ContentType = "application/xml",
        StatusCode = StatusCodes.Status200OK
    };
}

方法二:若坚持使用OkObjectResult

如果必须用OkObjectResult,直接返回XML字符串即可,不需要封装成XmlDocument(避免序列化错误):

public static IActionResult MyFunction()
{
    string myxml = "<Test code=\"0\"><MyChild>123</MyChild></Test>";
    return new OkObjectResult(myxml)
    {
        ContentTypes = { "application/xml" }
    };
}

错误原因说明

使用XmlDocument作为OkObjectResult的参数时,系统会尝试用DataContractSerializer序列化该对象,但XmlDocument的结构无法被该序列化器正确处理,因此抛出类型未预期的错误。我们不需要序列化XML对象,直接返回已构建好的XML字符串即可避免这个问题。

内容的提问来源于stack exchange,提问作者S. B.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 05:15:43