wep api 运行周期

2021-02-16 17:20

阅读:412

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

}

DefaultAssembliesResolver

   默认的AssembliesResolver 为DefaultAssemblierResolver,根据一下代码片段得知,默认返回的是当前程序域的程序集

public class DefaultAssembliesResolver:IAssembliesResolver{

   public virtual ICollection GetAssemblies()

 {

    return AppDomain.CurrentDomain.GetAssemblies().ToList();

 }

}

 

ServeiceContainer 默认的AssembliesResolver就是通过ServicesContainer类型确定

web api的请求相当月一个管道,类似于流水线作业,每个环节都会注册自己的实现类组件类完成自己的工作。这些组件都会实现自己的特定的接口,当在预置的组件无法满足我们的业务需求时,我们可以继承实现自己的组件代码,并进行注册,ServicesContainer其实可以简单理解为这些组件的IOC容器。

 

继承DefaultAssembliesResolver

技术分享图片技术分享图片
 /// 
    /// 继承并添加程序集,到默认程序集
    /// 
    public class WebApiResolver : DefaultAssembliesResolver
    {
        public override ICollection 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 集合

技术分享图片技术分享图片
/// 
    /// Configuration Section 根对象,这个对象必须放在config第一个节点上。
    /// 
    public class AssembliesLoad : ConfigurationSection
    {
        [ConfigurationProperty("", IsDefaultCollection = true)]
        public AssemblyElementCollection GetAssemblyNames
        {
            get { return (AssemblyElementCollection)this[""]; }
        }

        public static AssembliesLoad GetSection()
        {
            return ConfigurationManager.GetSection("AssembliesLoad") as AssembliesLoad;
        }

    }
    /// 
    /// 子集合对象
    /// 
    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对象

技术分享图片技术分享图片
"1.0" encoding="utf-8" ?>
"AssembliesLoad" type="CM.API.AssembliesLoad,CM.API"/>
"v4.0" sku=".NETFramework,Version=v4.5.2" /> "CM.API.dll"/> "home.dll"/>
View Code

Owin 配置对象

技术分享图片技术分享图片
  public class StartUp
    {
        /// 
        /// Owin 配置
        /// 
        /// 
        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);
        }
    }
View Code

两个 实现HttpController 的类

技术分享图片技术分享图片
  public class User1Controller : ApiController
    {
        [HttpGet, HttpPost]
        public string PostGetInfo()
        {
            return "hello";
        }
    }

 public class HomeController : ApiController
    {
        [HttpPost,HttpGet]
        public string Index() {

            return "home welcome!";
        }
    }
View Code

main函数启动api

技术分享图片技术分享图片
 static void Main(string[] args)
        {
            string baseurl = "http://localhost:8099";
            //启动owin host
            
            WebApp.Start(url: baseurl);
            Console.WriteLine("press enter to quite");
            Console.ReadLine();

        }
View Code

 主要参考 :http://www.cnblogs.com/xiangchangdong/p/6768316.html

相关: http://www.cnblogs.com/artech/p/http-controller-how-to-activate.html 


评论


亲,登录后才可以留言!