Owin Startup 类解析

每个 Owin 程序都有 startup 类,在这个 startup 类里面你可以指定应用程序管道模型中的组件。你可以通过不同的方式来连接你的 startup 类和运行时,这些取决于你选择的宿主模型(OwinHost, IIS, and IIS-Express)。

你可以通过下面几种方式来连接你的 startup 类和宿主程序。

  • 命名约定:Katana 会在 namespace 中查找一个叫 Startup 的类。
  • OwinStartup 特性:这是开发者最常用的一种方式,下面的特性将会设置 startup 类到 命名空间 OwinDemo 下面的 Startup 类。OwinStartup 特性会覆盖命名约定。
[assembly: OwinStartup(typeof(OwinDemo.Startup))]
  • Configuration 文件中的 appSetting 元素,appSetting 元素会覆盖命名约定和 OwinStartup 特性。你可以有多个 startup 类 (每个都使用 OwinStartup 特性) ,可以用下面的配置文件来选择使用哪一个 startup 类。
<appSettings>
<add key="owin:appStartup" value="OwinDemo.Startup2" />
</appSettings>

startup.cs 代码

using System;
using Microsoft.Owin;
using Owin; [assembly: OwinStartup(typeof(OwinDemo.Startup))] namespace OwinDemo
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
// For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=316888
app.Run(context =>
{
context.Response.ContentType = "text/plain";
return context.Response.WriteAsync("Hello, world.");
});
}
} public class Startup2
{
public void Configuration(IAppBuilder app)
{
// For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=316888
app.Run(context =>
{
context.Response.ContentType = "text/plain";
return context.Response.WriteAsync("Hello, this is Owin startup class 2.");
});
}
}
}

F5 运行以后会进入 startup2 类,可以通过浏览器看到结果。

你也在配置文件中指定 startup 类的别名,同时也要在 OwinStartup 特性里设定,然后就会根据别名和 OwinStartup 特性找到对应的 startup 类。

<appSettings>
<add key="owin:appStartup" value="ProductionConfiguration" />
</appSettings>
using System;
using Microsoft.Owin;
using Owin; [assembly: OwinStartup("ProductionConfiguration", typeof(OwinDemo.Startup2))] namespace OwinDemo
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
// For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=316888
app.Run(context =>
{
context.Response.ContentType = "text/plain";
return context.Response.WriteAsync("Hello, world.");
});
}
} public class Startup2
{
public void Configuration(IAppBuilder app)
{
// For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=316888
app.Run(context =>
{
context.Response.ContentType = "text/plain";
return context.Response.WriteAsync("Hello, this is Owin startup class 2.");
});
}
}
}

如果要关闭 OWIN startup 发现,那么只需要在 appSetting 里面加入下面的代码

<add key="owin:AutomaticAppStartup " value="false" />

指定 Owin startup 类的 Configuration 方法

<add key="owin:appStartup" value="OwinDemo.Startup2.ConfigurationTwo" />

public class Startup2
{
public void Configuration(IAppBuilder app)
{
// For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=316888
app.Run(context =>
{ context.Response.ContentType = "text/plain";
return context.Response.WriteAsync("Hello, this is Owin startup class 2.");
});
} public void ConfigurationTwo(IAppBuilder app)
{
// For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=316888
app.Run(context =>
{
context.Response.ContentType = "text/plain";
return context.Response.WriteAsync("Hello, this is Owin startup class 2 and ConfigurationTwo.");
});
}
}

F5 运行以后可以看到结果

web.config 配置文件里有多个 owin:appStartup 值,那么会启用最后一个配置 OwinDemo.Startup2 。

<appSettings>
<add key="owin:appStartup" value="OwinDemo.Startup2.ConfigurationTwo" />
<add key="owin:appStartup" value="OwinDemo.Startup2" />
</appSettings>

使用  Owinhost.exe

Nuget 里安装 OwinHost

导航到你的应用程序文件夹(包含了 web.config 的文件夹),然后运行 Owinhost.exe

..\packages\Owinhost<Version>\tools\Owinhost.exe

最后访问 http://localhost:5000/ ,就可以看到效果了。

也可以通过指定 OwinHost.exe 后面的参数访问不同的 startup 类

..\packages\OwinHost.3.1.\tools\Owinhost.exe OwinDemo.Startup2.ConfigurationTwo

源代码链接:

链接: http://pan.baidu.com/s/1bOfTRC 密码: xfhk

参考链接:

https://docs.microsoft.com/zh-cn/aspnet/aspnet/overview/owin-and-katana/owin-startup-class-detection

【Owin 学习系列】2. Owin Startup 类解析的更多相关文章

  1. 【Owin 学习系列】1. 第一个 Owin 程序

    IIS 中的 Owin 在 IIS 里面部署 Owin,既能得到 Owin 管道模型的灵活性和模块特性,也能很好地利用 IIS 成熟的配置,Owin 程序将会跑在 ASP.NET request 的管 ...

  2. Java并发包源码学习系列:ReentrantReadWriteLock读写锁解析

    目录 ReadWriteLock读写锁概述 读写锁案例 ReentrantReadWriteLock架构总览 Sync重要字段及内部类表示 写锁的获取 void lock() boolean writ ...

  3. asp.net core 系列 2 启动Startup类介绍

    一.Startup类 ASP.NET Core 应用是一个控制台应用,它在其 Program.Main 方法中创建 Web 服务器.其中Main方法是应用的托管入口点,Main 方法调用 WebHos ...

  4. Android学习系列(20)--App数据格式之解析Json

    JSON数据格式,在Android中被广泛运用于客户端和网络(或者说服务器)通信,非常有必要系统的了解学习.     恰逢本人最近对json做了一个简单的学习,特此总结一下,以飨各位.     为了文 ...

  5. 【SpringCloud微服务实战学习系列】创建应用及解析

    一.创建应用 使用官方Spring Initializr工具生成基础项目(http://start.spring.io/) 导入Intellij idea中 目录结构如下: 二.目录结构说明: src ...

  6. 【Spring源码深度解析学习系列】复杂标签属性解析(四)

    一.创建用于属性承载的BeanDefinition BeanDefiniton是一个接口,在Spring中存在三种实现:RootBeanDefinition.ChildBeanDefinition.G ...

  7. CobaltStrike逆向学习系列(3):Beacon C2Profile 解析

    这是[信安成长计划]的第 3 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 Controller 端分析 0x02 Beacon 端分析 0x03 展示图 在上一篇文章中完成了 S ...

  8. Caffe学习系列(10):命令行解析

    训练网络命令: sudo sh ./build/tools/caffe train --solver=examples/mnist/train_lenet.sh 用预先训练好的权重来fine-tuni ...

  9. Java并发包源码学习系列:挂起与唤醒线程LockSupport工具类

    目录 LockSupport概述 park与unpark相关方法 中断演示 blocker的作用 测试无blocker 测试带blocker JDK提供的demo 总结 参考阅读 系列传送门: Jav ...

随机推荐

  1. php 多条件查询

    1.效果图如下: 点击提交后,把符合条件的筛选出来 2.代码: 逻辑:选中数据----以数组方式提交---拼接sql语句 难点: (1)从数据库里读取的数据要去重 (2)读取的数据是数组,要拼接 (3 ...

  2. 条件随机场CRF(一)从随机场到线性链条件随机场

    条件随机场CRF(一)从随机场到线性链条件随机场 条件随机场CRF(二) 前向后向算法评估观察序列概率(TODO) 条件随机场CRF(三) 模型学习与维特比算法解码(TODO) 条件随机场(Condi ...

  3. Java IO学习笔记七

    System对IO的支持 System是系统的类,其中的方法都是在控制台的输入和输出,但是通过重定向也是可以对文件的输入输出 System中定义了标准输入.标准输出和错误输出流,定义如下: stati ...

  4. SICP-1.6-高阶函数

    高阶函数 将函数作为参数 例如 def sum_naturals(n): total, k = 0, 1 while k <= n: total, k = total + k, k + 1 re ...

  5. IBM的人工智能“沃森”首次确诊罕见白血病,只用了10分钟!

    患者为一名60岁的女性,最初根据诊断结果,显示她患了急髓白血病.但在经历各种疗法后,效果并不明显. 根据东大医学院研究人员Arinobu Tojo的说法,他们利用Watson系统来对此病人进行诊断.系 ...

  6. UE4 difference between servertravel and openlevel(多人游戏的关卡切换)

    多人游戏的关卡切换分为无缝和非无缝.非无缝切换时,客户端将跟服务器断开连接,然后重新连接到同一个服务器,服务器则加载一个新地图.无缝切换不会发生这样的情况. 有三个函数供我们使用:UEngine::B ...

  7. ListView 介绍

    1. 通过继承Activity实现ListView 1.1 在XML布局文件中实现一个ListView <ListView android:layout_width="wrap_con ...

  8. python迭代器生成器(二)

    其他内置类型迭代器 除了文件以及列表这样的实际的序列外,其他类型也有适合的迭代器. 遍历字典的经典方法是明确的获取其键的列表. 在最近的python版本中,字典有一个迭代器,在迭代环境中,会自动一次返 ...

  9. docker中执行sed: can't move '/etc/resolv.conf73UqmG' to '/etc/resolv.conf': Device or resource busy错误的处理原因及方式

    错误现象 在docker容器中想要修改/etc/resolv.conf中的namesever,使用sed命令进行执行时遇到错误: / # sed -i 's/192.168.1.1/192.168.1 ...

  10. 也谈TDD,以及三层架构、设计模式、ORM……:没有免费的午餐

    想在园子里写点东西已经很久了,但一直没有落笔,忙着做 一起帮 的开发直播,还有些软文做推广,还要做奶爸带孩子,还要……好吧,我承认,真正的原因是: 太特么的难写了! 但再难写也要写啊,要等到“能写好了 ...