如何改写WebApi部分默认规则
标签:
为什么要改最近公司在推广SOA框架,第一次正经接触这种技术(之前也有但还是忽略掉吧),感觉挺好,就想自己也折腾一下,实现一个简单的SOA框架
用过mvc进行开发,印象之中WebApi和Mvc好像是一样的,,带着这样的预设开始玩WebApi,然后被虐得找不到着北。
被虐的原因,是Mvc和WebApi在细节上差别还是有点大,例如:
在Mvc中,一个Controller中的所有公共方法一般情况下可以响应POST方法,而WebApi中不行
在Mvc中,一个Action方法中的参数即可来自Url,也可以来自Form,而WebApi中不是这样,具体的规则好像是除非你在参数中加了[FromBody],否则这个参数永远也无法从Form中获取
这是这两种技术我知道的最大的差别,其他的没发现或者说是没注意,也有可能这些差别是因为我不会用,毕竟接触WebApi时间不长。如果我有些地方说错了,请指正。
就这两个不同点,我查了很多资料,也没有办法解决,第一个还好,加个特性就行了,第二个的话好像就算加了[FromBody]也还是不行,感觉就是一堆限制。接着,既然这么多让我不爽的地方,那我就来改造它吧。
改造的目标,有以下几个:
不再限制控制器必须以Controller结尾,其实这个并不是必须,只是被限制着确实不太舒服
所有方法可以响应所有的请求方法,如果存在方法名相同的方法,那么才需要特性来区分
Action中的参数优先从Url中获取,再从Body中获取,从Body中获取的时候,优先假设Body中的数据是表单参数,若不是则将Body中的数据当作json或xml数据进行获取
定下了目标之后,感觉微软为什么要这样设计WebApi呢,或许它有它的道理。
目标好定,做起来真是头大,一开始想参考公司的SOA框架的实现,但因为我用了OWIN技术来进行宿主,而看了公司的框架好像不是用的这个,总之就是看了半天没看懂应该从哪个地方开始,反而是越看越糊,毕竟不是完全一样的技术,所以还是自己弄吧。
OK,废话了这么多,进入正题吧。首先来一个链接,没了这个文章我就不可能改造成功:
OWIN宿主其实这个网上很多,我主要是为了贴代码,不然的话下面几小节写不下去
[assembly: OwinStartup(typeof(Startup))]//这句是在IIS宿主的时候使用的,作用是.Net会查找Startup类来启动整个服务
namespace Xinchen.SOA.Server
{
public class Startup
{
public void Configuration(IAppBuilder appBuilder)
{
HttpConfiguration config = new HttpConfiguration();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{controller}/{action}"
);
config.Services.Add(typeof(ValueProviderFactory), new MyValueProviderFactory());//自定义参数查找,实现第三个目标
config.Services.Replace(typeof(IHttpControllerSelector), new ControllerSelector(config));//自定义控制器查找,实现第一个目标
config.Services.Replace(typeof(IHttpActionSelector), new HttpActionSelector());//自定义Action查找,实现第二个目标
appBuilder.UseWebApi(config);
}
}
}
省略了部分不太重要的代码,Services.Add和Replace从字面就能明白是什么意思,但我没有试过是否必须要像上面那样写才行
对控制器的限制
public class ControllerSelector : IHttpControllerSelector
{
HttpConfiguration _config;
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/69270.html
- 上一篇:Rewrite中文手册
- 下一篇:IIS 伪静态配置(安装ISAPI