RC版WebApi参数绑定
之前看了http://www.cnblogs.com/dudu/archive/2012/05/11/asp_net_webapi_httpclient.html写的httpclient+webapi的一个例子,参考他的代码子阶写了一个,结果请求服务获取的参数都是空的,而将参数绑定在url中则可以正常得到参数,折腾好久,终于在网上找到了相关资料,原来RC版WebApi在参数绑定上发生了些变化。
rc版的webapi参数绑定器分为两种:
1.Model Binding
2.Formatters
其中Model Binding仅从url中取值,这点是与mvc的model binding有区别的,
formatters是从request的body中取值,并且是把整个body作为一个(不可为多个)对象解析为一个参数。
/?id=123&name=bob void Action(int id, string name) // 两个参数都是基本类型,则从url中获取
/?id=123&name=bob void Action([FromUri] int id, [FromUri] string name) // 标记为FromUri的参数从url中获取.
void Action([FromBody] string name); // 标记为FromBody的参数从request的body中取值.
public class Customer { // a complex object public string Name { get; set; } public int Age { get; set; } }
/?id=123 void Action(int id, Customer c) // id 从url获取, c 是一个自定义类型,从request的body中取值.
void Action(Customer c1, Customer c2) // 这样的写法是错误的,从request的body中取值的参数只能有一个
void Action([FromUri] Customer c1, Customer c2) // 这样是正确的, c1 从url获取 、 c2 从request的body中取值
void Action([ModelBinder(MyCustomBinder)] SomeType c) //指定一个明确的模型绑定器使用来创建参数.
// 位置属性类型声明应用于所有的参数实例 [ModelBinder(MyCustomBinder)] public class SomeType { }
void Action(SomeType c) // c的类型指定使用model binding.
到此,已经明白为什么RC版下服务获取参数为空了,也知道如何处理了。