【发布时间】:2012-10-21 02:49:48
【问题描述】:
已经检查this question但没有回答。
背景
我有一个使用 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,但我想我可以用JSON.NET 反序列化JToken。所以我可能会从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 请求时,我所剩下的就是能够将查询参数反序列化为操作方法参数。
【问题讨论】:
标签: asp.net-web-api jsonp