new WebApiResolver());appBuilder.UseWebApi(config);}} View

时间:2021-08-06 05:36:52

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(); } }

View Code

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; } } }

View Code

Config东西