1 程序集解析
2.HttpController类型的解析
3.HttpController 的选择
4.HttpController的创建
二,web api的承载宿主,iis selfhost、OwinSelfHost
iis是传统的发布方式,可以和网站集成。
selfHost可以脱离iis,实现控制台程序承载iis。
OwinSelfHost,不仅脱离iis,还可以实现跨平台。
所有的api被访问,都要实现IhttpController。httpController激活系统处于消息处理管道的尾端HttpRoutingDispatcher来完成的。而httpRoutingDispatcher是利用HttpControllerDispatcher来完成对目标HttpController的激活和执行。
激活目标httpController的前提是能够正确解析出HttpController的真实类型,而类型解析需要加载程序集。所以我们需要首先了解一个用于解析程序集的对象AssembliesResolver。
在Asp.net web api的httpController激活系统中,AssembliesResolver为目标的HttpController的类型解析提供候选测程序集。
也即是 httpController类型的选择范围仅限于在通过AssembliesResolver提供的程序集中的所有的实现了IhttpController接口的类型。
AssembliesResolver 类型,所有的AssembliesResolver均实现了IAssembliesResolver接口,根据程序发射得到代码片段可知,IAssembliesResolver提供的是程序集列表
public interface IAssembliesResolver
{
ICollection<Assembly> GetAssemblies();
}
DefaultAssembliesResolver
默认的AssembliesResolver 为DefaultAssemblierResolver,根据一下代码片段得知,默认返回的是当前程序域的程序集
public class DefaultAssembliesResolver:IAssembliesResolver{
public virtual ICollection<Assembly> GetAssemblies()
{
return AppDomain.CurrentDomain.GetAssemblies().ToList<Assembly>();
}
}
ServeiceContainer 默认的AssembliesResolver就是通过ServicesContainer类型确定
web api的请求相当月一个管道,类似于流水线作业,每个环节都会注册自己的实现类组件类完成自己的工作。这些组件都会实现自己的特定的接口,当在预置的组件无法满足我们的业务需求时,我们可以继承实现自己的组件代码,并进行注册,ServicesContainer其实可以简单理解为这些组件的IOC容器。
继承DefaultAssembliesResolver
/// <summary> /// 继承并添加程序集,到默认程序集 /// </summary> public class WebApiResolver : DefaultAssembliesResolver { public override ICollection<Assembly> GetAssemblies() { AssembliesLoad settings = AssembliesLoad.GetSection();//这里将程序集,是取的配置文件 configSections if (null != settings) { foreach (AssemblyElement item in settings.GetAssemblyNames) { AssemblyName assemblyName = AssemblyName.GetAssemblyName(item.AssemblyName); if (!AppDomain.CurrentDomain.GetAssemblies().Any(assembly=>AssemblyName.ReferenceMatchesDefinition(assembly.GetName(),assemblyName))) { AppDomain.CurrentDomain.Load(assemblyName); } } } return base.GetAssemblies(); } }
ConfigSection 类型实体,以继collection 集合
/// <summary> /// Configuration Section 根对象,这个对象必须放在config第一个节点上。 /// </summary> public class AssembliesLoad : ConfigurationSection { [ConfigurationProperty("", IsDefaultCollection = true)] public AssemblyElementCollection GetAssemblyNames { get { return (AssemblyElementCollection)this[""]; } } public static AssembliesLoad GetSection() { return ConfigurationManager.GetSection("AssembliesLoad") as AssembliesLoad; } } /// <summary> /// 子集合对象 /// </summary> public class AssemblyElementCollection : ConfigurationElementCollection { protected override ConfigurationElement CreateNewElement() { return new AssemblyElement(); } protected override object GetElementKey(ConfigurationElement element) { AssemblyElement serverTypeElement = (AssemblyElement)(element); return serverTypeElement.AssemblyName; } } //实体对象 public class AssemblyElement : ConfigurationElement { [ConfigurationProperty("assemblyName", IsRequired = true)] public string AssemblyName { get { return (string)this["assemblyName"]; } set { this["assemblyName"] = value; } } }
Config对象
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="AssembliesLoad" type="CM.API.AssembliesLoad,CM.API"/> </configSections> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /> </startup> <AssembliesLoad> <add assemblyName="CM.API.dll"/> <add assemblyName="home.dll"/> </AssembliesLoad> </configuration>
Owin 配置对象
public class StartUp { /// <summary> /// Owin 配置 /// </summary> /// <param name="appBuilder"></param> public void Configuration(IAppBuilder appBuilder) { HttpConfiguration config = new HttpConfiguration(); config.Routes.MapHttpRoute(name:"defaultApi",routeTemplate:"api/{controller}/{id}",defaults:new {id=RouteParameter.Optional}); config.Services.Replace(typeof(IAssembliesResolver), new WebApiResolver()); appBuilder.UseWebApi(config); } }
两个 实现HttpController 的类
public class User1Controller : ApiController { [HttpGet, HttpPost] public string PostGetInfo() { return "hello"; } } public class HomeController : ApiController { [HttpPost,HttpGet] public string Index() { return "home welcome!"; } }
main函数启动api
static void Main(string[] args) { string baseurl = "http://localhost:8099"; //启动owin host WebApp.Start<StartUp>(url: baseurl); Console.WriteLine("press enter to quite"); Console.ReadLine(); }
主要参考 :http://www.cnblogs.com/xiangchangdong/p/6768316.html
相关: http://www.cnblogs.com/artech/p/http-controller-how-to-activate.html