实现服务层与api层共用,也就表明Service层就是api层。

  • 关键类和接口

    • System.Web.Http.Dispatcher.DefaultHttpControllerSelector

    webpai选择控制器的默认实现,可以重写SelectController方法

    • System.Web.Http.Controllers.ApiControllerActionSelector

    webapi选择指定控制器下的action的默认实现,可以重写SelectAction方法。

    • System.Web.Http.ApiController

    api控制器的基类,继承于此的类都可以成为Api控制器

  • 类和接口关系图 api自定义扩展实现

api注册流程

如果实现Servie层的Controller。

  • 所有服务类都需要继承于ApiController类,让服务类拥有控制器的特性 ApiServier类代码(继承ApiController此可,设置服务基类用于后期扩展):
public class ApiService:System.Web.Http.ApiController
{
}

TestServer类代码:

public class TestService:ApiService
{
public string Get()
{
return "Get-Test";
}
}

实现服务类,且具有ApiController的能力

    • 实现ServiceContainer类,实现服务类的缓存,并用于Controller的选择类,获取服务类代码如下:
private void Init()
{
var assembly = System.Reflection.Assembly.GetExecutingAssembly();
var ls = assembly.GetTypes().Where(x => typeof(Services.ApiService).IsAssignableFrom(x));
foreach(var item in ls)
{
_apis.Add(item.FullName, item);
}
}
    • 重写api选择controller类代码:
public class CustomSelectController:System.Web.Http.Dispatcher.DefaultHttpControllerSelector
{
public CustomSelectController(System.Web.Http.HttpConfiguration config) : base(config)
{ } public override HttpControllerDescriptor SelectController(HttpRequestMessage request)
{
var routeData = request.GetRouteData().Values;
foreach( var route in routeData)
{
if(route.Key == "controller")
{
//找controller
var controllerType = ServicesContainer.CreateInstance().Apis
.Where(x => x.Key.ToLower().IndexOf(route.Value.ToString() + "service") > ).FirstOrDefault();
if (controllerType.Value!=null)
{
return new DyControllerDescriptor(request.GetConfiguration(), controllerType.Value);
}
}
} return base.SelectController(request);
}
}

注意:

  1. 选择Controller类必须有一个参数的构造函数,构造函数传入为httpConfiguration类
  2. 重写SelectController方法,实现从ServiceContainer中获取ApiService实现类
  3. 重写ActionSelector类
public class CustomActionActivator:System.Web.Http.Controllers.ApiControllerActionSelector
{
public override HttpActionDescriptor SelectAction(HttpControllerContext controllerContext)
{
if (!(controllerContext.ControllerDescriptor is DyControllerDescriptor))
{
return base.SelectAction(controllerContext);
} var realType = controllerContext.ControllerDescriptor as DyControllerDescriptor; Type[] types = new Type[];
System.Reflection.MethodInfo methodInfo = realType.ControllerInfo.GetMethod("Get",
types); return new DyActionDescriptor(controllerContext.Configuration, controllerContext.ControllerDescriptor, methodInfo);
}
}
  • 注意:

    1. 此类不重写也可以实现ApiService类的执行,此类主要是处理在Action执行前一个些额外操作。
    2. 从中我们也可以看出Action的执行也是需要MethodInfo这个类的实例。
  • Global.cs中注入Api路由时,必须在Mvc注入路由之前

protected void Application_Start()
{
common.ServicesContainer.CreateInstance(); AreaRegistration.RegisterAllAreas(); //必须放在RouteConfig.RegisterRoutes前面
GlobalConfiguration.Configure((config) =>
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
});
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles); GlobalConfiguration.Configuration.Services.Replace(typeof(System.Web.Http.Dispatcher.IHttpControllerSelector),
new common.CustomSelectController(GlobalConfiguration.Configuration));
GlobalConfiguration.Configuration.Services.Replace(typeof(System.Web.Http.Controllers.IHttpActionSelector), new common.CustomActionActivator());
}

运行结果:

.Net WebApi 初探的更多相关文章

  1. ASP.NET MVC学习系列(一)-WebAPI初探

    由于即将要接手的新项目计划用ASP.NET MVC3来开发,所以最近一段时间一直在看相关的书或文章.因为之前在大学里也曾学习过MVC2开发,也做过几个简单的MVC2的小型测试项目,不过在后来工作以后主 ...

  2. asp.net webapi初探(一)

    本人对webapi尚没有深入研究,初次接触发现了在数据请求时的几点现象. 先切入代码 1.如果action中开头带有Get默认就是get方式,不带Get默认就是post方式 public string ...

  3. WebAPI初探

    由于即将要接手的新项目计划用ASP.NET MVC3来开发,所以最近一段时间一直在看相关的书或文章.因为之前在大学里也曾学习过MVC2开发,也做过几个简单的MVC2的小型测试项目,不过在后来工作以后主 ...

  4. .net core WebAPI 初探及连接MySQL

    1. 前言 笔者最近跟着微软官方文档学习.net core WebAPI,但发现其对 WebAPI 连接数据库.读取数据库方面讲得不够细致明了.写此文的目的,即实现 .net core WebAPI ...

  5. WebApi初探之路由配置

    本文介绍了ASP.NET Web API路由HTTP请求控制器. 如果你熟悉ASP.NET MVC,Web API路由是和MVC路由非常相似的.主要差别是Web API使用HTTP方法而不是URI路径 ...

  6. ASP.NET MVC学习系列 WebAPI初探

    转自http://www.cnblogs.com/babycool/p/3922738.html 一.无参数Get请求 一般的get请求我们可以使用jquery提供的$.get() 或者$.ajax( ...

  7. WebApi初探之基本操作(CRUD)

    public class ProductsController : ApiController { static List<Product> products = new List< ...

  8. ASP.NET MVC学习系列(二)-WebAPI请求

    继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现 ...

  9. ASP.NET MVC学习系列(二)-WebAPI请求(转)

    转自:http://www.cnblogs.com/babycool/p/3922738.html 继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的g ...

随机推荐

  1. 原生js添加博客点击鼠标出小心心效果~~

    昨天刚申请成功JS权限,心血来潮想添加点东西,记得之前看到别人家博客首页点击鼠标的时候会出现炫酷的 “小心心”,自己也来搞一个.没有用jquery啥的框架,原生js写起来麻烦了点,不过主要是怕博客首页 ...

  2. java新手入门

    参考地址 java博客 1.jdk    安装 /usr/libexec/java_home -V   查询jdk的版本 2.tomcat  安装教程 配置 mkdir -p /Library/Tom ...

  3. Ajax 的异步调用和批量修改

    AJAX的异步调用的分层 有四个jsp页面,在index.jsp页面上 要在dataDiv出显示调用的的数据回显到此处,可以让showStudent2.jsp页面的数据回调到此处,$("#d ...

  4. 多人合作项目如何去管理git仓库

    前记:在git之前依稀记得有SVN去管理代码仓库,现在多用git去管理我们的代码:现在一般的项目大多数是多人同时开发,这样就会存在一个问题就是如何去协调开发:这也是lz当前使用git开发管理的些许经验 ...

  5. 编程菜鸟的日记-初学尝试编程-C++ Primer Plus 第6章编程练习9

    #include <iostream> #include <fstream> #include <cstdlib> #include <string> ...

  6. 微信网页悬浮窗交互效果的web实现

    一.微信的悬浮窗交互效果 微信更新后,发现多了个悬浮窗功能.公众号阅读,网页浏览回退后默认会出现.再点击,可以回到刚才阅读的地方.于是,再也不会遇到回复老婆的信息,再切换回来重新找刚才阅读东西的麻烦了 ...

  7. vue 路由跳转,传参

    一.直接跳转 //js1.this.$router.push('/ad_new') //html 2.<router-link to="/ad_check"> < ...

  8. 【高并发架构】Redis特点及构件模型

    数据结构 redis 相比 memcached 来说,拥有更多的数据结构,能支持更丰富的数据操作.如果需要缓存能够支持更复杂的结构和操作, redis 会是不错的选择. redis 主要有以下几种数据 ...

  9. laravel 目录权限

    chown -R www:www /data/wwwroot   #变更目录所有者并向下传递 find /data/wwwroot/ -type d -exec chmod 755 {} \;   # ...

  10. PDF转换成Word,ppt转换成word

    pdf与word我没找到直接转换的方式,不过可以用间接方式嘛! pdf ==>picture ==>word!ppt转word的原理也是先把ppt转成图片,再把图片插入word! 先准备好 ...