在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.
相关产品推荐
相关产品推荐

