OWIN的理解和实践(二) – Host和Server的开发
对于开发人员来说,代码就是最好的文档,如上一篇博文所说,下面我们就会基于Kanata项目的一些具体调用代码,来进一步深入理解OWIN的实现和作用.
今天我们先针对Host和Server来实现一个简单的应用.
我们的开发环境是: VS2013 Update 3, .Net Framework 4.5.1
Host开发
如上篇博文提及,Host具有如下特点:
- 实现一个宿主进程
- 负责Server的启动和关闭
- 负责Middleware和Application的装载
最简单的宿主进程就是Console Application,那么我们从建立Console程序开始

注意这个程序和它的入口类(一般是Program.cs)就是我们所说的Host宿主进程的实现.
而具体的Host和Server的实现我们就需要借助Kanata项目的实现了.
首先通过Nuget获取Kanata的Host实现. 包名为: Microsoft.Owin.Hosting

注: 目前版本为3.0.1, Owin的2个核心组件: Owin和Microsoft.Owin会被同时载入.
WebApp.Start
Host的主要用途是启动和关闭Server, 这个功能的实现类就是在Microsoft.Owin.Hosting下的WebApp类, 请看类结构:

我们可以看到,WebApp只有若干个Start函数,辅助于StartOptions类,依靠这2个类,就能完成Host对Server的启动和关闭.
Start函数有好几个重载,我们来看一个最为典型的实现. (其他实现大同小异,如果要使用请参阅相关文档)
public static System.IDisposable Start(Microsoft.Owin.Hosting.StartOptions options, System.Action<IAppBuilder> startup)
- Options参数定义了Server启动所需的参数.
- Startup参数是一个以Owin.IAppbuilder接口为参数的函数,通过这个函数,完成对Server所需Middleware的加载工作,这也是Host的关键作用之一!
- 函数返回一个实现IDisposable接口的类, 可以预见的是,当这个类Dispose的时候,被这个函数启动的Server也会同时关闭和消亡.
StartOptions
我们先来看下这个StartOptions中2个比较关键的属性:
public System.Collections.Generic.IList<string> Urls { get; }
Urls参数是以http标准url为格式字符串来定义Server监听的HostName和Port.
标准格式是 http(s)://hostname:port ; 比如 http://localhost:8080 ; https://192.168.1.1:9000;
注意,Urls可以加多个,表示支持不同的hostname和port映射. 另外, 还支持http://*:9000 这样的格式,表示映射所有HostName,这个和IIS映射配置其实是类似的.
public string ServerFactory { set; get; }
关键的来了,这个就是Server实现类的assembly name, 大家不难想到,通过这个属性,Host和Server是完全解耦的. 我们的这个Host可以和任何符合Owin接口的Server实现进行组合. 当然,目前还是使用自家的Server实现,请看下节.
Server实现和引用
Http Server并不是一两句代码可以实现的, 这里我们还是继续站在Kanata的肩膀上,借用它的Server实现. 他的Server实现包名为 : Microsoft.Owin.Host.HttpListener (我认为这里的Host改名为Server更加贴切)
首先还是使用Nuget获取该Server组件

安装,并引入项目,有了Server的实现,下面我们来完成StartOptions的定义代码:
//初始化StartOptions参数
StartOptions options = new StartOptions();
//服务器Url设置
options.Urls.Add("http://localhost:9000");
options.Urls.Add("http://192.168.1.1:8080");
//Server实现类库设置
options.ServerFactory = "Microsoft.Owin.Host.HttpListener";
需要注意的是,我这里特地放了2个port不同的地址,这2个Url都能起到效果; 另外Microsoft.Owin.Host.HttpListener 其实是默认的Host ServerFatory实现(最后一行代码可以省略); 但我们必须理解,这里是可以解耦的,我们完全可以桥接其他的Server实现.
Startup函数和使用
Startup函数非常的简单,就是一个只有一个没有返回值的,只有一个Owin.IAppBuilder参数的函数(函数名任意,不一定要叫Startup). 如以下代码:
private static void Startup(Owin.IAppBuilder app)
{
//这里通过app句柄,为当前Server加入所有需要的middleware
}
在这个函数中,通过app参数提供的句柄,一步步的加入Server所需要的所有Middleware,当然这些Middleware都是可自由组合,自由拆卸的,非常的灵活.
Server的启动和关闭
有了Options和Startup函数,我们就可以启动我们的Server了,整合的代码如下:
/// <summary>
/// Owin Host 主进程入口函数
/// </summary> static void Main()
{
//初始化StartOptions参数
StartOptions options = new StartOptions(); //服务器Url设置
options.Urls.Add("http://localhost:9000");
options.Urls.Add("http://192.168.1.1:8080"); //Server实现类库设置
options.ServerFactory = "Microsoft.Owin.Host.HttpListener";
//以当前的Options和Startup启动Server
using (WebApp.Start(options, Startup))
{
//显示启动信息,通过ReadLine驻留当前进程
Console.WriteLine("Owin Host/Server started,press enter to exit it...");
Console.ReadLine();
}//Server在Dispose中关闭
} private static void Startup(Owin.IAppBuilder app)
{
//这里通过app句柄,为当前Server加入所有需要的middleware
}
Server的关闭很简单,当using的结尾触发Dispose时,该Server被自动关闭.
Server是独立线程运行的,所以宿主进程必须驻留,这里用Console.ReadLine()驻留当前线程,保证Server长期运行.
其他注意点
- 很多机器上出现权限不够情况,请用管理员账号运行VS2013.
- 用浏览器访问2个地址时发现可以联通,但Reponse为空,这符合上一篇中说提到的: Server仅仅是一个空的实现,在没有任何Middleware装载的情况下(我们的Startup函数为空),所有的Request都只能获得一个空的Response这一论点.
- 加入不同的Middleware能够实现不同的Reponse返回,这个将在以后的篇幅中继续讨论.
- 尽量用Nuget获取我们需要的组件包,以保证组件正确性和版本统一.
总结下,我们开发了一个以Console Application为宿主进程的程序,通过Kanata的Host实现Microsoft.Owin.Hosting启动了它自身的Server实现 Microsoft.Owin.Host.HttpListener, 目前没有加入任何Middleware和Application实现.
这里再罗嗦一句, Kanata的Host和Server实现完全可以被自己或者第三方的实现所取代,前提是,符合OWIN的标准.
OWIN的理解和实践(二) – Host和Server的开发的更多相关文章
- Host和Server的开发
Host和Server的开发 对于开发人员来说,代码就是最好的文档,如上一篇博文所说,下面我们就会基于Kanata项目的一些具体调用代码,来进一步深入理解OWIN的实现和作用. 今天我们先针对Host ...
- OWIN的理解和实践(三) –Middleware开发入门
上篇我们谈了Host和Server的建立,但Host和Server无法产出任何有实际意义的内容,真正的内容来自于加载于Server的Middleware,本篇我们就着重介绍下Middleware的开发 ...
- OWIN的理解和实践(一) – 解耦,协作和开放
概述 OWIN的全称是Open Web Interface For .Net, 是MS在VS2013期间引入的全新的概念, 网上已经有不少的关于它的信息, 这里我就谈下我自己的理解: OWIN是一种规 ...
- 深入理解 OWIN 中的 Host 和 Server
The Open Web Interface for .NET (OWIN),注意单词为大写,之前好像都写成了 Owin,但用于项目的时候,可以写成:Microsoft.Owin.*. OWIN 体系 ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 添加文章
上次把架构做好了,这次做添加文章.添加文章涉及附件的上传管理及富文本编辑器的使用,早添加文章时一并实现. 要点: 富文本编辑器采用KindEditor.功能很强大,国人开发,LGPL开源,自己人的好东 ...
- express 最佳实践(二):中间件
express 最佳实践(二):中间件 第一篇 express 最佳实践(一):项目结构 express 中最重要的就是中间件了,可以说中间件组成了express,中间件就是 express 的核心. ...
- WebSocket原理与实践(二)---WebSocket协议
WebSocket原理与实践(二)---WebSocket协议 WebSocket协议是为了解决web即时应用中服务器与客户端浏览器全双工通信问题而设计的.协议定义ws和wss协议,分别为普通请求和基 ...
- linux内核分析实践二学习笔记
Linux实践二--内核模块的编译 标签(空格分隔): 20135328陈都 理解内核的作用 Linux内核[kernel]是整个操作系统的最底层,它负责整个硬件的驱动,以及提供各种系统所需的核心功能 ...
- Linux及安全实践二
Linux及安全实践二 基本内核模块 20135238 龚睿 1. 理解模块原理 linux模块是一些可以作为独立程序来编译的函数和数据类型的集合.之所以提供模块机制,是因为Linux本身是一个 ...
随机推荐
- JSP调用JAVA方法小例子
用JAVA编写的函数 package doc; //定义一个包 public class Dy { //定义一个类 public static int Sub(int x,int y){ //定义函数 ...
- 今天遇到的关于mysql的max_allowed_packet的问题
今天,运维组的同学来找我,说是备份池的文件描述没有显示出来,而且是从20号开始就不能显示,之前的文件描述就能显示,而且20号他们上传备份的数据确实是传过来的.但是是在web界面文件描述显示不出来. 先 ...
- RSA加密前端JS加密,后端asp.net解密,报异常
RSA加密前端JS加密,后端asp.net解密,报异常 参考引用:http://www.ohdave.com/rsa/的JS加密库 前端JS加密代码: function GetChangeStr() ...
- 【软件工程】电梯调度的初步实现 李亚文&&郭莉莉
一.开门见山,代码粘 using System; using System.Collections.Generic; using System.Data; using System.Drawing; ...
- python变量——黑板客老师课程学习
1.和C++.Java的区别: 动态类型:不需要声明a的类型. a=34 type(a) <type ‘int’> 一切皆对象: 4 2.数字: 自动转换类型:a=34 A=3.14 ...
- MVC dirname(——FILE——)
1.MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织 ...
- sqlserver表数据导出为insert into语句
<1>select 'insert into table_name (name,code) values ('''+name+''','''+code+''');' sql_str fr ...
- 如何实现能像windows 窗体一样改变大小的控件 Silverlight
众所周知,我们可以将鼠标放在windows窗体的边框上,按住鼠标左键改变窗体大小.那么,在silverlight上如何实现呢? 1. 需要将改控件放置在canvas上. 2. 判断鼠标位置,然后将Ar ...
- 测试table数据 winfrom datagridview 点击标头数字排序的时候table 列类型要为数字类型
public DataTable GenerateData(int NoOfRecord){DataTable tbl = new DataTable();tbl.Columns.Add(new Da ...
- 64位Win7下运行ASP+Access网站的方法
64位Win7下运行ASP+Access网站的方法 近日系统升级为WIN7 64位之后,突然发现原本运行正常的ASP+ACCESS网站无法正常连接数据库. 网上搜索多次,终于解决了问题,总结了几条经验 ...