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启动Serverusing (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的标准.
转载于:https://www.cnblogs.com/zergcom/p/4362689.html
OWIN的理解和实践(二) – Host和Server的开发相关推荐
- OWIN的理解和实践(三) –Middleware开发入门
原文:OWIN的理解和实践(三) –Middleware开发入门 上篇我们谈了Host和Server的建立,但Host和Server无法产出任何有实际意义的内容,真正的内容来自于加载于Server的M ...
- 广告点击率(CTR)预测经典模型 GBDT + LR 理解与实践(附数据 + 代码)
CTR 系列文章: 广告点击率(CTR)预测经典模型 GBDT + LR 理解与实践(附数据 + 代码) CTR经典模型串讲:FM / FFM / 双线性 FFM 相关推导与理解 CTR深度学习模型之 ...
- Asp.NetCore程序发布到CentOs(含安装部署netcore)--最佳实践(二)
原文:Asp.NetCore程序发布到CentOs(含安装部署netcore)--最佳实践(二) Asp.NetCore程序发布到CentOs(含安装部署netcore)--最佳实践(一) 接上一篇 ...
- Linux MMC子系统分析(二)——Host分析
Linux MMC子系统分析(二)--Host分析 前言 通过前面对mmc子系统的模型分析,我们能够知道host是对应于硬件控制器的具体操作.本文将以sdhci-s3c.c为例对host进行简单的分析 ...
- 元宇宙+教育,从理解到实践
李骏翼老师以科幻小说<和觅渡的第一次接触>作为铺垫,引出本次分享的内容.在李老师所著的<元宇宙与教育>这本书中,围绕"教育"这一核心词展开了五个篇章的叙述, ...
- 案例挑战——MVVM框架理解和实践
MVVM框架理解和实践 一.背景介绍 二. 什么是MVVM架构? 1.架构示意图 2.MVVM概念总结 3.实现VM的框架 三.通过案例来理解MVVM框架 1.没有使用MVVM架构的程序 2.使用了M ...
- 深入理解C/C++二维数组
深入理解C/C++二维数组 前言 本来以为自己对二维数组的理解还可以,没感觉有什么,但是今天小伙伴问了一个问题感觉迷惑了好久,于是决定细致的记录一下,一步一步的探究各种关于二维数组的问题,巩固基础. ...
- TLD(Tracking-Learning-Detection)学习与源码理解之(二)
TLD(Tracking-Learning-Detection)学习与源码理解之(二) zouxy09@qq.com http://blog.csdn.net/zouxy09 OpenTLD下载与编译 ...
- 软件工程专业(互联网应用开发与优化方向)软件工程实践二环节教学大纲
软件工程专业(互联网应用开发与优化方向)软件工程实践二环节教学大纲 培训课程 Phthon Web开发 实训公司 XXX 总周数 3周
最新文章
- mysql could not create connection_mysql8.0 Could not create connection to database server.解决办法...
- java八种语言_Java语言八种基本类型
- 如何设置Reporting Services链接到网页URL的参数?
- BiGAN-QP:简单清晰的编码 生成模型
- 如何关闭uefi启动模式|预装win8/win10电脑禁用uefi引导方法
- 数据分析——朴素贝叶斯原理示意图
- 通过微软虚拟wifi接入点共享网络连接的方法以及一个问题的解决方案
- Basic4android v3.50 发布
- word break II 对字符串根据已知字典 分解出所有可能组合
- axvspan函数--Matplotlib
- nodeJS 视频教程
- 加密算法Bcrypt
- 扩展模块已停止工作怎么解决_菲尼克斯Phoenix控制器电源模块维修检测免费
- 微信订阅消息模板消息推送-JAVA
- android 输入法下一步,Android Edittext 软键盘输入法回车键改成下一步Next
- MP3参数,格式,术语有关一切内容详解
- 你可能没听过的11个Python库
- ReactiveUI 入门
- linux中查不到ip地址
- 搜索引擎登录工具_安利一个号称使用高标准文件搜索引擎的工具
热门文章
- steam/csgo游戏搬砖,适合个人/团队操作的创业项目(内附详细操作流程)
- 年轻人不穿皮鞋,谁急了?
- .net中国(www.hiaspx.com),现面向所有.net程序员招聘版主
- 升级IPv6新路由器购买与老路由器巧妙利用
- 求解二叉树高度的方法(C++实现)
- 中国JAVA第一人张立猛,《我的世界》建造中国地图第一人。
- innerText和innerHTML和innerContent
- 单点登录之CAS原理和实现(转载)
- svg中如何让文本溢出时显示省略号
- Win10 MySQL 5.7.38 安装教程