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

时间:2012-10-31 15:31:27

标签: asp.net-web-api jsonp

已经检查this question但没有回答。

背景

我有一个使用ASP.NET Web API编写的功能齐全的RESTful Web服务,它目前支持CORS有效地支持来自支持CORS的浏览器的跨域访问。问题是当前的业务需求需要支持不支持CORS的浏览器。我正在为我的Web服务添加JSON-P支持,除了支持CORS,还有动作选择器和类型格式化器,我的实际Web服务代码还没有改变....

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

问题(S)

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

编辑:看起来我可以使用自定义格式化程序并使用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请求时将查询参数反序列化为操作方法参数。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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