当前位置:首页 > Windows程序 > 正文

如何改写WebApi部分默认规则

2021-03-28 Windows程序

标签:

为什么要改

最近公司在推广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