psa*_*ton 10 xml asp.net asp.net-web-api asp.net-web-api2
我在TopShelf容器中托管了几个webapi微服务,它们接受JSON和XML格式化程序并进行回复.运行一段时间后,XML格式化程序停止将XML请求数据绑定到模型.传递JSON或Form-Data仍然有效.指定Accept: application/xml
导致XML响应的标头.重新启动服务后重播失败的XML请求将返回预期的响应.
问题的根本原因是,SupportedMediaTypes
在服务运行且模型绑定失败时,XmlFormatter 的属性会在某个时刻被清除.
我怎样才能找到清除的东西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());
Run Code Online (Sandbox Code Playgroud)
检查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
Run Code Online (Sandbox Code Playgroud)
该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
Run Code Online (Sandbox Code Playgroud)
为什么该MediaTypeFormatterCollection.FindReader
方法返回优先级较低的格式化程序?
检查MediaTypeFormatterCollection
GitHub上的源代码(感谢Microsoft!),我想看看SupportedMediaTypes
两个实例:
> actionContext.RequestContext.Configuration.Formatters[1].SupportedMediaTypes
Count = 0
> actionContext.RequestContext.Configuration.Formatters[2].SupportedMediaTypes
Count = 2
[0]: {application/xml}
[1]: {text/xml}
Run Code Online (Sandbox Code Playgroud)
在重新启动项目时,Formatters [1]的集合与Formatters [2]的集合相同.
MediaTypeFormatter.SupportedMediaTypes
对项目中属性的唯一引用是在构造函数中RecordSetMediaTypeFormatter
设置自己的属性SupportedMediaTypes
.
什么是SupportedMediaTypes
在运行时清除XmlFormatter的属性?
归档时间: |
|
查看次数: |
131 次 |
最近记录: |