已经检查过这个问题,但没有回答。
背景
我有一个使用 ASP.NET Web API 编写的功能齐全的 RESTful Web 服务,它目前有效地支持CORS,以便从支持 CORS 的浏览器进行跨域访问。问题是当前的业务需求需要支持不支持 CORS 的浏览器。除了支持 CORS 之外,我还在我的 Web 服务中添加JSON-P支持,并且通过动作选择器和类型格式化程序的魔力,我的实际 Web 服务代码还没有改变......。
目前,我使用嵌套的 POCO 对象(包含其他对象的对象)作为参数,例如,用于我的 Post 操作。由于我支持 XML 和 JSON 传入,因此 POST 数据可以很好地反序列化为 POCO 对象,因为 XML 和 JSON 都支持嵌套反序列化。但是为了支持 JSON-P,我现在必须通过查询参数模拟 POST。通过 httpMethod 查询参数和自定义操作选择器成功访问 Post 操作方法。
问题)
首先,我在阅读其他问题的回复后问这个问题,如果我没有请求正文,注册的类型格式化程序甚至会访问查询参数以进行反序列化吗?JSON-P 请求将是一个没有正文的简单 GET 请求,因此我什至不确定是否可以在我的操作参数中包含 POCO,并使用 GET 请求和仅查询参数对其进行反序列化。
编辑:看起来我可以使用自定义格式化程序并使用 QueryStringMapping 来做一些 MediaTypeFormatter 魔术。不过还不确定。
其次,是否可以将查询参数反序列化为 POCO 对象的嵌套属性?如果是这样,查询参数的命名约定是什么?例如,如果 action 参数的类型为 Message,则 Bob 的 XML 将被反序列化为 Message.User.FirstName。
编辑:FormUrlEncodedMediaTypeFormatter
如果我可以将其重定向为使用查询字符串而不是正文,则具有我想要的一些功能。但我也不想要一个JToken
对象——我想要我的 POCO,但我想我可以JToken
用 JSON.NET 反序列化 a。所以我可能会从FormUrlEncodedMediaTypeFormatter
相关的内部类中窃取代码FormUrlEncodedJson
来制作自定义格式化程序。只需要首先确保问题#1 是可能的。
示例 POCO
public class User
{
public string FirstName { get; set;}
}
public class Message
{
public User User { get; set; }
}
示例“标准”RESTful POST
POST /api/messages
Content-Type: text/xml
<Message><User><FirstName>Bob</FirstName></User></Message>
假设的 JSON-P 模拟 POST 示例
<script type="text/javascript"
src="https://api.mydomain.com/api/messages?callback=MyCallback&httpMethod=Post&User.FirstName=Bob">
</script>
编辑:总体目标:如果可能,我现在尝试不理会操作方法,因为它们当前处理支持 RESTful CORS 的请求。我的目标是在不更改方法签名的情况下为调用添加 JSON-P 支持。我已经完成了大部分工作。当它是 JSON-P 请求时,我所剩下的就是能够将查询参数反序列化为操作方法参数。