Asp.net web api ASP.NET Web API将查询参数反序列化为嵌套的POCO操作参数

Asp.net web api ASP.NET Web API将查询参数反序列化为嵌套的POCO操作参数,asp.net-web-api,jsonp,Asp.net Web Api,Jsonp,已经检查过了,但没有回答 背景 我有一个使用ASP.NETWebAPI编写的功能齐全的RESTfulWeb服务,它目前有效地支持从支持CORS的浏览器进行跨源访问。问题是当前的业务需求需要支持不支持CORS的浏览器。除了支持CORS之外,我还向我的web服务添加了支持,通过动作选择器和类型格式化程序的魔力,我的实际web服务代码还没有改变 目前,我使用嵌套的POCO对象(包含其他对象的对象)作为参数,例如,我的Post操作。由于我支持XML和JSON传入,POST数据可以很好地反序列化到POCO

已经检查过了,但没有回答

背景

我有一个使用ASP.NETWebAPI编写的功能齐全的RESTfulWeb服务,它目前有效地支持从支持CORS的浏览器进行跨源访问。问题是当前的业务需求需要支持不支持CORS的浏览器。除了支持CORS之外,我还向我的web服务添加了支持,通过动作选择器和类型格式化程序的魔力,我的实际web服务代码还没有改变

目前,我使用嵌套的POCO对象(包含其他对象的对象)作为参数,例如,我的Post操作。由于我支持XML和JSON传入,POST数据可以很好地反序列化到POCO对象中,因为XML和JSON都支持嵌套反序列化。但是为了支持JSON-P,我现在必须通过查询参数模拟POST。通过一个httpMethod查询参数和一个自定义操作选择器,可以成功地访问Post-action方法

问题

首先,在阅读了对其他问题的回答后,我问这个问题,如果我没有请求主体,注册的类型格式化程序是否会访问查询参数进行反序列化?JSON-P请求将是一个没有主体的简单GET请求,因此我甚至不确定是否可以在我的操作参数中包含POCO,并使用GET请求和仅查询参数对其进行反序列化

编辑:看起来我可能能够使用自定义格式化程序和QueryStringMapping实现一些MediaTypeFormatter魔法。不过还不确定

第二,是否可以将查询参数反序列化为POCO对象的嵌套属性?如果是这样,查询参数的命名约定是什么?例如,如果操作参数的类型为Message,则Bob的XML将反序列化为Message.User.FirstName

编辑
FormUrlEncodedMediaTypeFormatter
具有我想要的一些功能,如果我可以重定向它以使用查询字符串而不是正文的话。但我也不想要
JToken
对象——我想要我的POCO,但我认为我可以用JSON.NET反序列化
JToken
。因此,我可能会从
FormUrlEncodedMediaTypeFormatter
和relate内部类
FormUrlEncodedJson
中窃取代码,以创建自定义格式化程序。首先要确定问题1是可能的

示例POCO

示例“标准”RESTful POST

POST/api/messages
内容类型:text/xml
上下快速移动
示例假设JSON-p模拟POST



编辑:总体目标:如果可能的话,我现在尝试不使用操作方法,因为它们当前处理支持RESTful CORS的请求。我的目标是在不更改方法签名的情况下向调用添加JSON-P支持。我已经完成了大部分工作;我只剩下在JSON-P请求时能够将查询参数反序列化为操作方法参数。

尝试将[FromUri]添加到操作定义中,即:

public HttpResponseMessage YourAction([FromUri] YourModel model)
{
...
}

此时,我似乎必须在API中创建两个不同的路径。由于请求参数反序列化的工作方式,以及模型绑定与媒体类型格式化程序的不同,以及在这一特定领域缺乏挂钩,我不能有一个Web API方法,也不能根据各种请求因素从查询字符串或内容中获取参数。

如果可能的话,我现在尝试不使用操作方法,因为它们当前处理RESTful CORS启用的请求。我的目标是在不更改方法签名的情况下向调用添加JSON-P支持。我已经完成了大部分工作;我所剩下的就是能够在JSON-P请求时将查询参数反序列化为操作方法参数。我将把这个添加到描述中以澄清。谢谢
POST /api/messages
Content-Type: text/xml

<Message><User><FirstName>Bob</FirstName></User></Message>
<script type="text/javascript"
   src="https://api.mydomain.com/api/messages?callback=MyCallback&httpMethod=Post&User.FirstName=Bob">
</script>
public HttpResponseMessage YourAction([FromUri] YourModel model)
{
...
}