动态WebApi
动态WebApi实现了直接对Service的调用,其实没有跨过ApiController,只是我们自己创建出ApiController
实现主要分以下几步
一 对默认WebApi服务的替换
ApiGlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerSelector), new AbpHttpControllerSelector(ApiGlobalConfiguration.Configuration));
ApiGlobalConfiguration.Configuration.Services.Replace(typeof(IHttpActionSelector), new AbpApiControllerActionSelector());
ApiGlobalConfiguration.Configuration.Services.Replace(typeof(HttpControllerActivator), new AbpControllerActivator());
二 路由
定义好路由
ApiGlobalConfiguration.Configuration.Routes.MapHttpRoute(
"DynamicWebApi",
"apiservice/{service}/{action}/{id}",
new { id = RouteParameter.Optional }
);
三 缓存Service
找出所有需要做成动态WebApi的Service,哪些是Controller哪些是Action事先准备好
var controllerInfo = new DynamicApiControllerInfo("Order", typeof(DynamicApiController<IOrderService>));
foreach (var methodInfo in DynamicApiControllerActionHelper.GetMethodsOfType(typeof(IOrderService)))
{
controllerInfo.Actions[methodInfo.Name] = new DynamicApiActionInfo(methodInfo.Name, HttpMethod.Get, methodInfo);
}
DynamicApiControllerManager.Register(controllerInfo);
四 使用OWIN来替代IIS
什么是 OWIN ?
OWIN 的全称是 "Open Web Interface for .NET", OWIN 在 .NET Web 服务器和 .NET Web 应用之间定义了一套标准的接口, 其目的是为了实现服务器与应用之间的解耦, 鼓励为 .NET Web 应用开发简单模块。
为什么使用 OWIN
OWIN 定义了 .NET Web 服务器与 .NET Web 应用之间的标准接口, 将应用与服务器 解耦, 使得便携式 .NET Web 应用以及跨平台的愿望成为现实, 标准的 OWIN 应用可以在任何 OWIN 兼容的服务器上运行, 不再依赖与 Windows 和 IIS 。
OWIN使用
应用启动时调用
const string url = "http://localhost:8080/";
var startOpts = new StartOptions(url);
using (WebApp.Start<Startup>(startOpts))
{
Console.WriteLine("Server run at " + url + " , press Enter to exit.");
Console.ReadKey();
}
Startup
public class Startup
{
public void Configuration(IAppBuilder appBuilder)
{
appBuilder.UseWebApi(ApiGlobalConfiguration.Configuration);
}
}
调用效果

请求分析
http://localhost:8080/apiservice/Order/GetOrderDetail?s=1111
- Order是Controller,也对应IOrderService这个Service
- GetOrderDetail是Action,也对应IOrderService中的GetOrderDetail方
- s=1111为参数
执行顺序
- 先进入AbpHttpControllerSelector,筛选出动态api的请求,
- 再进入AbpControllerActivator,创建出ApiController
- 再进入AbpApiControllerActionSelector,找出Action。
- 最后进入DyanamicHttpActionDescriptor执行Action,也就是执行对应Service的方法
示例代码:https://github.com/sunven/Abp1
Reference
动态WebApi的更多相关文章
- ABP项目中使用Swagger生成动态WebAPI
本文是根据角落的白板报的<使用ABP实现SwaggerUI,生成动态webapi>一文的学习总结,感谢原文作者角落的白板报. 1 安装Swashbuckle.core 1.1 选择WebA ...
- ABP源码分析三十五:ABP中动态WebAPI原理解析
动态WebAPI应该算是ABP中最Magic的功能之一了吧.开发人员无须定义继承自ApiController的类,只须重用Application Service中的类就可以对外提供WebAPI的功能, ...
- ABP之动态WebAPI(一)
ABP的动态WebApi实现了直接对服务层的调用(其实病没有跨过ApiController,只是将ApiController公共化,对于这一点的处理类似于MVC,对服务端的 调用没有跨过HttpHan ...
- ABP中动态WebAPI原理解析
ABP中动态WebAPI原理解析 动态WebAPI应该算是ABP中最Magic的功能之一了吧.开发人员无须定义继承自ApiController的类,只须重用Application Service中的类 ...
- ABP之动态WebAPI
ABP之动态WebAPI ABP的动态WebApi实现了直接对服务层的调用(其实病没有跨过ApiController,只是将ApiController公共化,对于这一点的处理类似于MVC,对服务端的 ...
- 最新版ABP 动态WebAPI 日期转json带T的解决方案| ABP DateTIme Json format
ABP动态webapi返回的json数据中,日期时间带T还有毫秒数的问题,在以往的版本中可以使用下面方法解决: 在XXXAbpWebApiModule中加上下面的代码: 很老的很老的版本有效: pub ...
- ASP.NET Core 奇淫技巧之动态WebApi
一.前言 接触到动态WebApi(Dynamic Web API)这个词的已有几年,是从ABP框架里面接触到的,当时便对ABP的这个技术很好奇,后面分析了一波,也尝试过从ABP剥离一个出来作为独立组件 ...
- 【5000 Stars 福利】微信接口动态 WebApi 使用说明
前言 作为中国 C# 开源项目中 Watch/Star/Fork 最高的项目之一,Senparc.Weixin SDK 凝聚了盛派微信团队持续7年的付出,和大量开发者的无私贡献,以及数万开发者的使用 ...
- 动态 WebApi 引擎使用教程(3行代码完成动态 WebApi 构建)
目录 什么是 WebApiEngine? 开源地址 使用方法 使用 [ApiBind] 标签让任何方法变成 WebApi 对 API 进行分类 自定义 API 名称 复制特性 为整个类配置 WebAp ...
随机推荐
- Iptables详解七层过滤
<Iptables详解七层过滤> 一.防火墙简介 防火墙其实就是一个加固主机或网络安全的一个设备或者软件而已,通过防火墙可以隔离风险区域与安全区域的连接,同时不会妨碍风险区域的访问.当然需 ...
- npoi导入导出
NPOI是指构建在POI 3.x版本之上的一个程序,NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作. NPOI是一个开源的Java读写Excel.WORD等微软OLE ...
- 如何访问 Service?- 每天5分钟玩转 Docker 容器技术(99)
前面我们已经学习了如何部署 service,也验证了 swarm 的 failover 特性.不过截止到现在,有一个重要问题还没有涉及:如何访问 service?这就是本节要讨论的问题. 为了便于分析 ...
- 安卓开源框架SlidingMenu使用
在安卓开发中,会使用很多的开源框架,这篇博文讲的是SlidingMenu--侧边栏 SlidingMenu的是一种比较新的设置界面或配置界面效果,在主界面左滑或者右滑出现设置界面, 能方便的进行各种操 ...
- linux grep 从入门到精通
linux grep 从入门到精通 一.初级 搜索日志 grep "186" catalina.out 在新输出日志中监听固定字符串 tail -f catalina.out | ...
- HDU2546--饭卡(01背包)
饭卡 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
- MYSQL 主从复制---原理
复制的核心步骤 在主库上把数据更改记录到二进制日志(Binary Log)中; 备库将主库上的日志复制到自己的中继日志(Relay Log)中; 备库读取中继日志中的事件,将其重放到备库数据之上; 下 ...
- memcache调整value大小限制
> *事件背景: 当Redis有问题时按预案就会切换到本机memcache,但是我们首页 key:value现 在是1.5M同时memcache item限制是1M,导致首页写入memcache ...
- mysql读写分离的操作动作依据(读写分离基本依据)
读的操作: 1.select 2.show 3.explain explain显示了MySQL如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 4.desc ...
- Python 冒泡法排序
def sequence(disorder='', separators=''): arrays = disorder.split(separators) def desc(): for i in r ...