1

已经检查过这个问题,但没有回答。

背景

我有一个使用 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 请求时,我所剩下的就是能够将查询参数反序列化为操作方法参数。

4

2 回答 2

2

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

public HttpResponseMessage YourAction([FromUri] YourModel model)
{
...
}
于 2012-10-31T21:28:30.827 回答
1

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

于 2012-11-30T14:53:30.967 回答