動態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
