ASP.NET Core Module overview模块概述
原文地址:ASP.NET Core Module overview
By Tom Dykstra, Rick Strahl, and Chris Ross
ASP.NET Core模块(ANCM)让你能够在IIS之后运行ASP.NET Core应用,IIS和Kestrel各司其职,前者专于安全性,可管理性等方面,后者专于性能,我们从两种技术中都能获得益处。ANCM只和Kestrel协同工作,它不兼容于Weblistener。
支持的Windows版本:
- Windows 7和Windows Server 2008 R2和更高版本
ASP.NET Core 模块做了什么
ANCM是一个原生的IIS模块,它挂接到IIS管道,并将流量重定向到后端ASP.NET Core应用。其他大多数模块,如windows身份认证,仍然有机会运行。ANCM只在当一个handler被请求选择时进行控制,handler映射配置在应用的web.config文件中定义。
因为ASP.NET Core应用运行在某个IIS工作进程分离出的一个进程中,ANCM也能进行进程管理。当接收到第一个请求的时候,ANCM会为该ASP.NET Core应用启动进程。ANCM也有重启崩溃进程的功能。和运行在IIS进程中,通过WAS(Windows Activation Service)进行管理的传统ASP.NET 应用,在本质上是相同的。
下图说明了IIS,ANCM以及ASP.NET Core应用三者之间的关系
来自Web端的请求首先会触发内核模块HTTP.SYS驱动程序,HTTP.SYS将请求转接到IIS主端口(80)或SSL端口(443)。接下来请求会转向应用程序中配置的HTTP端口,该端口不再是80/443端口。再之后Kestrel捕获请求,推送到ASP.NET Core中间件管道中,并将其作为一个HttpContext
实例供应用程序逻辑处理。最后应用的响应信息将重传回IIS,由IIS将其传回到原先发起请求的HTTP客户端。
ANCM 还有一些其他功能:
- 设置环境变量。
- 日志以标准输出形式输出到文件存储中。
- 转寄Windows身份认证tokens。
怎么在ASP.NET Core应用中使用ANCM
这一节提供了对IIS服务器和ASP.NET Core应用设置过程的概述。更详细的信息,请参考发布到IIS。
安装 ANCM
ANCM已经被安装在服务器IIS和开发机器IIS Express中。对于服务器而言,ANCM被包括在 ASP.NET Core Server Hosting Bundle 中。对于开发机器而言,Visual Studio会自动为IIS Express和IIS(如果IIS已经被安装在开发机器中)安装ANCM。
安装 IISIntegration NuGet 包
在应用中可以安装Microsoft.AspNetCore.Server.IISIntegration。这是一个互操作性包,它可以读取通过ANCM广播的环境变量以设置你的应用。环境变量提供相应配置信息,例如端口侦听。
调用 UseIISIntegration
在应用的Main
方法中,可以调用位于WebHostBuilder
的UseIISIntegration
扩展方法
public static int Main(string[] args)
{
var config = new ConfigurationBuilder()
.AddCommandLine(args)
.Build();
var builder = new WebHostBuilder()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseConfiguration(config)
.UseStartup<Startup>()
.UseUrls("http://localhost:5001")
.UseIISIntegration()
.UseKestrel(options =>
{
if (config["threadCount"] != null)
{
options.ThreadCount = int.Parse(config["threadCount"]);
}
});
var host = builder.Build();
host.Run();
return 0;
}
UseIISIntegration
方法会查找ANCM设置的环境变量,如果没找到它将什么也不做。这种机制有利于例如在MacOS上开发测试程序并部署到运行IIS的服务器的场景。当在Mac上运行时,Kestrel以web服务器的身份存在,但是当应用部署到IIS环境时,它会自动搭接ANCM和IIS。
不要调用UseUrls
ANCM会生成一个动态端口以分配给后端进程。IWebHostBuilder.UseIISIntegration
拿着这个动态端口并配置Kestrel以侦听http://locahost:{dynamicPort}/
。这将覆盖其他的URL配置,例如IWebHostBuilder.UseUrls
。因此,在你使用ANCM时你不需要调用UseUrls
。当你不借助IIS运行应用时,它将会侦听默认端口号http://localhost:5000
。
当不借助IIS运行应用时,如果你仍需要设置端口号,你可以调用UseURLs
。此种情况下,IISIntegration
不会做任何事情,你提供给UseUrls
的端口号也将生效。但是当你借助IIS运行应用时,由ANCM动态生成的端口号将覆盖你传递给UseUrls
的任何设置信息。
在ASP.NET Core 1.0中,UseUrls
的调用需要放在IISIntegration
之前,这是为了防止ANCM配置的端口被重写。但是在ASP.NET Core 1.1中,因为ANCM设置总是会覆盖UseUrls
,这样的调用顺序将不会再有效。
在Web.config中设置ANCM选项
用以存储ANCM配置信息的Web.config文件位于应用的根目录文件夹。该文件中的配置信息表示你的应用程序的启动命令和参数。有关配置选项的示例Web.config代码和指南,请参考ASP.NET Core 模块配置参考。
在开发中借助IIS Express运行应用
通过使用ASP.NET Core模板定义的默认配置文件,Visual Studio可以启动IIS Express服务。
下一步
更多的详细信息,请参考以下资源:
- Sample app for this article
- ASP.NET Core Module source code
- ASP.NET Core Module Configuration Reference
- Publishing to IIS
ASP.NET Core Module overview模块概述的更多相关文章
- .NET Core开发日志——从ASP.NET Core Module到KestrelServer
ASP.NET Core程序现在变得如同控制台(Console)程序一般,同样通过Main方法启动整个应用.而Main方法要做的事情很简单,创建一个WebHostBuilder类,调用其Build方法 ...
- ASP.NET Core 2.0 : 一. 概述
为什么要使用 ASP.NET Core? .NET Core 刚发布的时候根据介绍就有点心里痒痒, 大概看了一下没敢付诸于行动, 现在2.0发布了一段时间了, 之前对其"不稳定" ...
- ASP.NET Core 企业开发架构概述
企业开发框架包括垂直方向架构和水平方向架构.垂直方向架构是指一个应用程序的由下到上叠加多层的架构,同时这样的程序又叫整体式程序.水平方向架构是指将大应用分成若干小的应用实现系统功能的架构,同时这样的系 ...
- asp.net core选项Options模块的笔记
这篇博客是写给自己看的.已经不止一次看到AddOptions的出现,不管是在.net core源码还是别人的框架里面,都充斥着AddOptions.于是自己大概研究了下,没有深入,因为,我的功力还是不 ...
- ASP.NET Core SignalR:基础概述
一.简介 ASP.NET Core SignalR 是一个开源代码库,它简化了向应用添加实时 Web 功能的过程. 实时 Web 功能使服务器端代码能够即时将内容推送到客户端. SignalR 的适用 ...
- ASP.NET Core模块概述
原文地址:ASP.NET Core Module overview By Tom Dykstra, Rick Strahl, and Chris Ross ASP.NET Core模块(ANCM)让你 ...
- ASP.NET Core服务器综述
原文地址:Servers overview for ASP.NET Core By Tom Dykstra, Steve Smith, Stephen Halter, and Chris Ross A ...
- ASP.NET Core快速入门学习笔记(第1章:介绍与引入)
课程链接:http://video.jessetalk.cn/course/explore 良心课程,大家一起来学习哈! 任务1:课程介绍 任务2:环境安装 下载地址:https://dotnet.m ...
- ASP.NET Core快速入门(第1章:介绍与引入)--学习笔记
课程链接:http://video.jessetalk.cn/course/explore 良心课程,大家一起来学习哈! 任务1:课程介绍 1.介绍与引入 2.配置管理 3.依赖注入 4.ASP.NE ...
随机推荐
- Redux的应该注意的问题
1. Store中的State修改不能直接修改原有的State,若直接修改State,则redux中的所有操作都将指向 内存中的同一个state,将无法获取每一次操作前后的state,就无法追溯sta ...
- 51nod 1257 背包问题 V3(分数规划)
显然是分数规划...主要是不会求分数的形式,看了题解发现自己好傻逼QAQ 还是二分L值算出d[]降序选K个,顺便记录选择时候的p之和与w之和就可以输出分数形式了... #include<iost ...
- 浴谷夏令营例题Codeforces827DBest Edge Weight(三个愿望,一次满足~(大雾
这题在浴谷夏令营wyx在讲的最小生成树的时候提到过,但并没有细讲怎么写... 这题可以用三种写法写,虽然只有两种能过...(倍增/倍增+并查集/树链剖分 先跑出最小生成树,分类讨论,在MST上的边,考 ...
- udhcpd源码分析2--读取配置文件
1:重要的结构体 读取配置文件信息到全局的结构体struct server_config_t server_config中,这个结构在很多文件中都有引用到很重要. /* dhcpd.h */ stru ...
- HDU1394 逆序数
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- Qt ------- QMap和QHash的区别
基本概念: QMap提供了一个从类项为key的键到类项为T的直的映射,通常所存储的数据类型是一个键对应一个值,并且按照Key的次序存储数据.同时这个类也支持一键多值的情况,用类QMultiMap可以实 ...
- 数据结构:Treap
关于重量平衡树的相关概念可以参考姊妹文章:重量平衡树之替罪羊树 Treap是依靠旋转来维护平衡的重量平衡树中最为好写的一中,因为它的旋转不是LL就是RR 对于每一个新的节点,它给这个节点分配了一个随机 ...
- 2015/9/17 Python基础(13):函数
函数是对程序逻辑进行结构化或过程化的一种编程方法. Python的函数返回值当什么也不返回时,返回了None和大多数语言一样,Python返回一个值或对象.只是在返回容器对象时,看起来像返回多个对象. ...
- MyBatis框架的使用及源码分析(十二) ParameterHandler
在StatementHandler使用prepare()方法后,接下来就是使用ParameterHandler来设置参数,让我们看看它的定义: package org.apache.ibatis.ex ...
- 鸽巢排序Pigeonhole sort
原理类似桶排序,同样需要一个很大的鸽巢[桶排序里管这个叫桶,名字无所谓了] 鸽巢其实就是数组啦,数组的索引位置就表示值,该索引位置的值表示出现次数,如果全部为1次或0次那就是桶排序 例如 var pi ...