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();
}
}
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
wep api 运行周期的更多相关文章
- MVC5项目中添加Wep API
一.查看MVC版本,决定你有没有必要看这篇文章 打开web.config,看到以下内容 <dependentAssembly> <assemblyIdentity name=&quo ...
- ASP.NET(C#) Web Api通过文件流下载文件到本地实例
下载文件到本地是很多项目开发中需要实现的一个很简单的功能.说简单,是从具体的代码实现上来说的,.NET的文件下载方式有很多种,本示例给大家介绍的是ASP.NET Web Api方式返回HttpResp ...
- Asp.Net Web API 2第四课——HttpClient消息处理器
Asp.Net Web API 导航 Asp.Net Web API第一课:入门http://www.cnblogs.com/aehyok/p/3432158.html Asp.Net Web A ...
- 如何在Mvc 6 中创建 Web Api以及如何脱离IIS实现自我托管
微软推出的Asp.net vNext(asp.net 5.0)的其中的一个目标就是统一mvc 和web api 的框架.接下来我就演示一下一下几个内容 1,怎么在Asp.net mvc 6 中创建简单 ...
- ASP.NET MVC4中调用WEB API的四个方法
http://tech.it168.com/a2012/0606/1357/000001357231_all.shtml [IT168技术]当今的软件开发中,设计软件的服务并将其通过网络对外发布,让各 ...
- mvc Web api 如何在控制器中调用
关于如何调用 mvc Web api 的方法,网上一搜就是一大把,基本都是在前台jq中调用的,但是如何在后台调用呢? 本楼主做了一下测试,仅供参考. 先写一个简单的api,如下:[域1] namesp ...
- Web API 2:Action的返回类型
Web API 2:Action的返回类型 Web API控制器中的Action方法有如下几种返回类型: void HttpResponseMessage IHttpActionResult 其它类型 ...
- Mvc 6 中创建 Web Api
如何在Mvc 6 中创建 Web Api以及如何脱离IIS实现自我托管 微软推出的Asp.net vNext(asp.net 5.0)的其中的一个目标就是统一mvc 和web api 的框架.接下来我 ...
- Asp.Net Web API 2(CRUD操作)第二课
Asp.Net Web API 2(CRUD操作)第二课 Asp.Net Web API 导航 Asp.Net Web API第一课:入门http://www.cnblogs.com/aehyok ...
随机推荐
- SSM-Spring-18:Spring中aspectJ的XML版
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- aspectJ的xml版是开发中最常用的: 下面直接已案例入手,毕竟繁琐的日子不多了 案例:两个接口,俩个实现 ...
- D. Kuro and GCD and XOR and SUM
Kuro is currently playing an educational game about numbers. The game focuses on the greatest common ...
- 聊一聊顺序消息(RocketMQ顺序消息的实现机制)
当我们说顺序时,我们在说什么? 日常思维中,顺序大部分情况会和时间关联起来,即时间的先后表示事件的顺序关系. 比如事件A发生在下午3点一刻,而事件B发生在下午4点,那么我们认为事件A发生在事件B之前, ...
- 浅谈MySQL存储引擎-InnoDB&MyISAM
存储引擎在MySQL的逻辑架构中位于第三层,负责MySQL中的数据的存储和提取.MySQL存储引擎有很多,不同的存储引擎保存数据和索引的方式是不同的.每一种存储引擎都有它的优势和劣势,本文只讨论最常见 ...
- 文件上传--基于Spring MVC框架+SmartUpload
这篇文章是介绍文件上传的,由于在spring MVC上实现起来和直接在servlet中写有些不同,所以特地写了一下这篇文章,关于不同点,大家可以先阅读一下上一篇文章.好了,下面直接上代码. jab包是 ...
- spring的依赖注入是什么意思
最近学习spring框架,对依赖注入有些模糊,遂上网翻阅资料,做了下列总结,原博客为CSDN 南夏的 spring的依赖注入是什么意思,侵删! Spring 能有效地组织J2EE应用各层的对象.不管是 ...
- 查看centos系统位数和强制关闭yum
一个小命令查看centos 是什么多少位系统 getconf LONG_BIT 方法二: [root@linuxzgf ~]#uname -m 如果有x86_64就是64位的,没有就是32位的后面是X ...
- 【BZOJ 3626】 [LNOI2014]LCA【在线+主席树+树剖】
题目链接: TP 题解: 可能是我比较纱布,看不懂题解,只好自己想了…… 先附一个离线版本题解[Ivan] 我们考虑对于询问区间是可以差分的,然而这并没有什么卵用,然后考虑怎么统计答案. 首先LC ...
- [Usaco2015 Jan]Grass Cownoisseur 图论 tarjan spfa
先缩点,对于缩点后的DAG,正反跑spfa,枚举每条边进行翻转即可 #include<cstdio> #include<cstring> #include<iostrea ...
- BZOJ_2343_[Usaco2011 Open]修剪草坪 _单调队列_DP
BZOJ_2343_[Usaco2011 Open]修剪草坪 _单调队列_DP 题意: N头牛,每头牛有一个权值,选择一些牛,要求连续的不能超过k个,求选择牛的权值和最大值 分析: 先考虑暴力DP,f ...