.Net WebApi 初探
实现服务层与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);
}
}
注意:
- 选择Controller类必须有一个参数的构造函数,构造函数传入为httpConfiguration类
- 重写SelectController方法,实现从ServiceContainer中获取ApiService实现类
- 重写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);
}
}
注意:
- 此类不重写也可以实现ApiService类的执行,此类主要是处理在Action执行前一个些额外操作。
- 从中我们也可以看出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 初探的更多相关文章
- ASP.NET MVC学习系列(一)-WebAPI初探
由于即将要接手的新项目计划用ASP.NET MVC3来开发,所以最近一段时间一直在看相关的书或文章.因为之前在大学里也曾学习过MVC2开发,也做过几个简单的MVC2的小型测试项目,不过在后来工作以后主 ...
- asp.net webapi初探(一)
本人对webapi尚没有深入研究,初次接触发现了在数据请求时的几点现象. 先切入代码 1.如果action中开头带有Get默认就是get方式,不带Get默认就是post方式 public string ...
- WebAPI初探
由于即将要接手的新项目计划用ASP.NET MVC3来开发,所以最近一段时间一直在看相关的书或文章.因为之前在大学里也曾学习过MVC2开发,也做过几个简单的MVC2的小型测试项目,不过在后来工作以后主 ...
- .net core WebAPI 初探及连接MySQL
1. 前言 笔者最近跟着微软官方文档学习.net core WebAPI,但发现其对 WebAPI 连接数据库.读取数据库方面讲得不够细致明了.写此文的目的,即实现 .net core WebAPI ...
- WebApi初探之路由配置
本文介绍了ASP.NET Web API路由HTTP请求控制器. 如果你熟悉ASP.NET MVC,Web API路由是和MVC路由非常相似的.主要差别是Web API使用HTTP方法而不是URI路径 ...
- ASP.NET MVC学习系列 WebAPI初探
转自http://www.cnblogs.com/babycool/p/3922738.html 一.无参数Get请求 一般的get请求我们可以使用jquery提供的$.get() 或者$.ajax( ...
- WebApi初探之基本操作(CRUD)
public class ProductsController : ApiController { static List<Product> products = new List< ...
- ASP.NET MVC学习系列(二)-WebAPI请求
继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现 ...
- ASP.NET MVC学习系列(二)-WebAPI请求(转)
转自:http://www.cnblogs.com/babycool/p/3922738.html 继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的g ...
随机推荐
- Windows10远程报错:由于CredSSP加密Oracle修正导致远程失败
解决方案:Windows 10 家庭版,没有 gpedit.msc,只能修改本地电脑的注册表,在本地“运行”输入: regedit 按以下目录进入:HKEY_LOCAL_MACHINE\Softw ...
- 通过zabbix的API接口获取服务器列表
Zabbix API说明 1) 基于Web的API,作为Web前端的一部分提供,使用JSON-RPC 2.0协议 2) 身份认证Token:在访问Zabbix中的任何数据之前,需要登录并获取身份验证令 ...
- Tomcat 配置文件server.xml详解
前言 Tomcat隶属于Apache基金会,是开源的轻量级Web应用服务器,使用非常广泛.server.xml是Tomcat中最重要的配置文件,server.xml的每一个元素都对应了Tomcat中的 ...
- POJ 3751 JAVA
题意: 对于给定的采用”yyyy/mm/dd”加24小时制(用短横线”-”连接)来表示日期和时间的字符串, 请编程实现将其转换成”mm/dd/yyyy”加12小时制格式的字符串,末尾加上pm或者am. ...
- Interpreting NotifyCollectionChangedEventArgs zz
If you’ve ever consumed INotifyCollectionChanged.CollectionChanged, then you’ve run into some inadeq ...
- python-MYSQL(包括ORM)交互
1.首先,我们必须得连上我们的MYSQL数据库.个人遇到连不上MYSQL数据的问题主要有:数据库的权限问题.数据库表权限的问题 同时获取数据库中的数据等. //==================== ...
- C语言中数组使用负数值的标记
·引 对数组的认知 在c语言中,我们经常使用的一个结构便是数组,在最开始学习数组的时候,它被描述成这样(以一维二维数组为例):一维数组是若干个数连续排列在一起的集合,我们可以通过0-N的标记(N为数组 ...
- Cause: java. lang.InstantiationException: tk.mybatis.mapper.provider.base.BaseInsertProvider
相信现在Java Web开发都是用的mybatis吧,而用到mybatis很多人都不会错过通用mapper吧! (纯属瞎扯淡...qwq). 如我上一篇博客所写,目前公司新项目,使用了通用mapper ...
- Android滑动列表(拖拽,左滑删除,右滑完成)功能实现(1)
场景: 近期做的TODO APP需要在主页添加一个功能,就是可以左滑删除,右滑完成.看了一下当前其他人做的例如仿探探式的效果,核心功能基本一样,但是和我预想的还是有少量区别,于是干脆自己重头学一遍如何 ...
- IDEA 使用Mybatis效率飞起来的必备工具:MybatisCodeHelperPro 最新破解版,亲测可用!
IDEA 2018.3.5 最新版本亲测可用. Git地址:https://github.com/pengzhile/MyBatisCodeHelper-Pro-Crack/releases 下载最新 ...