zoukankan      html  css  js  c++  java
  • wep api 运行周期

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

    <?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>
    View Code

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

  • 相关阅读:
    SVN还原项目到某一版本(转)
    C# Web Service 不使用服务引用直接调用方法(转)
    动态调用webservice时 ServiceDescriptionImporter类在vs2010无法引用的解决方法 (转)
    log4net示例2-日志输入存入Access(转)
    C# log4net 配置及使用详解--日志保存到文件和Access(转)
    未能解析引用的程序集......因为它对不在当前目标框架“.NETFramework,Version=v4.0,Profile=Client”中的 (转)
    Hello log4net——做一个实用好用的log4net的demo(转)
    JS移动客户端--触屏滑动事件
    js生成二维码实例
    触屏版类似刷新页面文本框获取焦点的同时弹出手机键盘的做法
  • 原文地址:https://www.cnblogs.com/Blogs-Wang/p/8333919.html
Copyright © 2011-2022 走看看