一段时间后,ASP.net WebApi2中的XML模型绑定失败

我有几个托管在TopShelf容器中的webapi微服务,它们接受和回复JSON和XML格式器。 运行一段时间后,XML格式器停止将XML请求数据绑定到模型。 传递JSON或表单数据仍然有效 。 指定一个Accept: application/xml标题,这将导致XML响应。 重新启动服务重新发送失败的XML请求将返回预期的响应

问题的根本原因在于服务正在运行且模型绑定失败时,XmlFormatter的SupportedMediaTypes属性被清除。

我如何才能找到清除SupportedMediaTypes


在调查问题时请注意。

我无法在任何可以连接调试器的环境中复制该问题。

当我在本地调试时,其中一项服务开始失败。 从我所看到的,它选择DataContractSerializer而不是XmlSerializer进行反序列化。

Startup类按此顺序添加格式化程序:

config.Formatters.Clear();
config.Formatters.Add(new RecordSetMediaTypeFormatter<RecordAssociation>());
config.Formatters.Add(new XmlMediaTypeFormatter { UseXmlSerializer = true });
config.Formatters.Add(new XmlMediaTypeFormatter { UseXmlSerializer = false });
config.Formatters.Add(new JsonMediaTypeFormatter());

在HttpConfiguration中检查格式化程序的顺序显示XmlSerializer格式化程序具有优先级:

> actionContext.RequestContext.Configuration.Formatters
Count = 4
    [0]: {API.Formatters.RecordSetMediaTypeFormatter<API.Contract.DataObjects.RecordAssociation>}
    [1]: {System.Net.Http.Formatting.XmlMediaTypeFormatter}
    [2]: {System.Net.Http.Formatting.XmlMediaTypeFormatter}
    [3]: {System.Net.Http.Formatting.JsonMediaTypeFormatter}
> (actionContext.RequestContext.Configuration.Formatters[1] as System.Net.Http.Formatting.XmlMediaTypeFormatter).UseXmlSerializer
true
> (actionContext.RequestContext.Configuration.Formatters[2] as System.Net.Http.Formatting.XmlMediaTypeFormatter).UseXmlSerializer
false

UseXmlSerializer == true格式化程序表明它可以读取类型,但UseXmlSerializer == false格式化程序由集合选择,即使使用System.Object

> actionContext.RequestContext.Configuration.Formatters[1].CanReadType(typeof(System.Object))
true
> (actionContext.RequestContext.Configuration.Formatters.FindReader(typeof(System.Object), System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/xml")) as System.Net.Http.Formatting.XmlMediaTypeFormatter).UseXmlSerializer
false

为什么MediaTypeFormatterCollection.FindReader方法返回较低优先级的格式化程序?

检查GitHub上MediaTypeFormatterCollection的源代码(谢谢微软!),我想看看这两个实例的SupportedMediaTypes

> actionContext.RequestContext.Configuration.Formatters[1].SupportedMediaTypes
Count = 0
> actionContext.RequestContext.Configuration.Formatters[2].SupportedMediaTypes
Count = 2
    [0]: {application/xml}
    [1]: {text/xml}

在重新启动项目时,Formatters [1]的集合与Formatters [2]的集合相同。

项目中唯一对MediaTypeFormatter.SupportedMediaTypes属性的引用是RecordSetMediaTypeFormatter在其构造函数中设置其自己的SupportedMediaTypes

什么是在运行时清除XmlFormatter的SupportedMediaTypes属性?

链接地址: http://www.djcxy.com/p/20407.html

上一篇: XML model binding fails in ASP.net WebApi2 after a time

下一篇: ASP.NET WebAPI OData 406