对于开发人员来说,代码就是最好的文档,如上一篇博文所说,下面我们就会基于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的开发的更多相关文章

  1. Host和Server的开发

    Host和Server的开发 对于开发人员来说,代码就是最好的文档,如上一篇博文所说,下面我们就会基于Kanata项目的一些具体调用代码,来进一步深入理解OWIN的实现和作用. 今天我们先针对Host ...

  2. OWIN的理解和实践(三) –Middleware开发入门

    上篇我们谈了Host和Server的建立,但Host和Server无法产出任何有实际意义的内容,真正的内容来自于加载于Server的Middleware,本篇我们就着重介绍下Middleware的开发 ...

  3. OWIN的理解和实践(一) – 解耦,协作和开放

    概述 OWIN的全称是Open Web Interface For .Net, 是MS在VS2013期间引入的全新的概念, 网上已经有不少的关于它的信息, 这里我就谈下我自己的理解: OWIN是一种规 ...

  4. 深入理解 OWIN 中的 Host 和 Server

    The Open Web Interface for .NET (OWIN),注意单词为大写,之前好像都写成了 Owin,但用于项目的时候,可以写成:Microsoft.Owin.*. OWIN 体系 ...

  5. ASP.NET MVC5 网站开发实践(二) Member区域 - 添加文章

    上次把架构做好了,这次做添加文章.添加文章涉及附件的上传管理及富文本编辑器的使用,早添加文章时一并实现. 要点: 富文本编辑器采用KindEditor.功能很强大,国人开发,LGPL开源,自己人的好东 ...

  6. express 最佳实践(二):中间件

    express 最佳实践(二):中间件 第一篇 express 最佳实践(一):项目结构 express 中最重要的就是中间件了,可以说中间件组成了express,中间件就是 express 的核心. ...

  7. WebSocket原理与实践(二)---WebSocket协议

    WebSocket原理与实践(二)---WebSocket协议 WebSocket协议是为了解决web即时应用中服务器与客户端浏览器全双工通信问题而设计的.协议定义ws和wss协议,分别为普通请求和基 ...

  8. linux内核分析实践二学习笔记

    Linux实践二--内核模块的编译 标签(空格分隔): 20135328陈都 理解内核的作用 Linux内核[kernel]是整个操作系统的最底层,它负责整个硬件的驱动,以及提供各种系统所需的核心功能 ...

  9. Linux及安全实践二

    Linux及安全实践二   基本内核模块 20135238 龚睿 1.  理解模块原理 linux模块是一些可以作为独立程序来编译的函数和数据类型的集合.之所以提供模块机制,是因为Linux本身是一个 ...

随机推荐

  1. 学习java第7天

    关于继承还需要留意的是,子类中的所有构造方法都默认访问父类的无参构造,注意是无参,而且是必须的,如果父类没有无参子类就会报错.如果你不想给父类无参构造,那么在子类中加上super(),显式的调用有参构 ...

  2. weed-fs参数列表

    weed-fs没有详细的帮助文档,为了方便阅读,特意把有用的参数帮助罗列出来.未列出的两个命令为version(版本查询) 及shell(这个命令在0.45版本只有回显功能)nerc@Ubuntu:~ ...

  3. hadoop单机and集群模式安装

    最近在学习hadoop,第一步当然是亲手装一下hadoop了. 下面记录我hadoop安装的过程: 注意: 1,首先明确hadoop的安装是一个非常简单的过程,装hadoop的主要工作都在配置文件上, ...

  4. MySQL_杭州北仓 12.3-12.7需求活动期间累计下单达到3天及以上的客户_20161212

    #C025_02杭州北仓 12.3-12.7需求活动期间累计下单达到3天及以上的客户明细 SELECT d.*,CASE WHEN 下单天次>=3 THEN "下单超过3天" ...

  5. 直接使用docker而无须加sudo

    从0.5.2开始docker的守护进程总是以root用户来运行.docker守护进程绑定的是Unix的socket而不是一个TCP端口.Unix的socket默认属于root用户,所以,使用docke ...

  6. sql 查询分组后的数据总条数

    select count(0) from (select investor_uid from lzh_borrow_investor group by investor_uid) as temp

  7. fastJson顺序遍历JSON字段

    fastJson在把json格式的字符串转换成JSONObject的时候,使用的是HashMap,所以排序规则是根据HASH值排序的,如果想要按照字符串顺序遍历JSON属性,需要在转换的时候指定使用L ...

  8. webstorm下搭建编译less环境

    webstorm自带less,不过要编译的话需要nodejs环境. 首先去node的主页下载对应版本的nodejs然后安装,下载地址:http://nodejs.org/ 安装完之后打开命令提示符(w ...

  9. 《机器学习实战》学习笔记——第14章 利用SVD简化数据

    一. SVD 1. 基本概念: (1)定义:提取信息的方法:奇异值分解Singular Value Decomposition(SVD) (2)优点:简化数据, 去除噪声,提高算法的结果 (3)缺点: ...

  10. Ubuntu下配置和使用github

    一.配置github环境 1.环境:Ubuntu14.04 2.申请github账号 3.安装配置git服务器: (1)安装ssh:sudo apt-get install openssh-serve ...