NetCore Selfhost,IIShost,Windows Service Host详解(自宿主、宿主在IIS,宿主在Windows Service中)
第一部分、自托管
一、依赖.Net Core环境
修改 project.json 文件内容,增加发布时需要包含文件的配置内容(NetCore2.0版本不需要任何设置,NetCore2.0开始彻底放弃project.json,全面改回.csproj,详见难以接受你的改变:从project.json到.csproj)

1 {
2 "version": "1.0.0-*",
3 "testRunner": "xunit", // 设置测试工具为xunit
4 "buildOptions": {
5 "debugType": "portable",
6 "emitEntryPoint": true
7 },
8 "dependencies": {
9 "Microsoft.NETCore.App": {
10 "type": "platform",
11 "version": "1.0.0"
12 },
13 "Microsoft.AspNetCore.Server.Kestrel": "1.0.0",
14 "Microsoft.AspNetCore.Mvc": "1.0.0",
15 "Microsoft.Extensions.Logging": "1.0.0",
16 "Microsoft.Extensions.Logging.Console": "1.0.0",
17 "Microsoft.Extensions.Logging.Debug": "1.0.0",
18 "Microsoft.Extensions.Logging.Filter": "1.0.0",
19 "NLog.Extensions.Logging": "1.0.0-rtm-alpha2",
20 "Autofac.Extensions.DependencyInjection": "4.0.0-rc3-309",
21 "Microsoft.Extensions.Configuration": "1.0.0",
22 "Microsoft.Extensions.Configuration.FileExtensions": "1.0.0",
23 "Microsoft.Extensions.Configuration.Json": "1.0.0",
24 "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
25 "xunit": "2.2.0-beta2-build3300",
26 "dotnet-test-xunit": "2.2.0-preview2-build1029",
27 "moq.netcore": "4.4.0-beta8",
28 "Microsoft.AspNetCore.TestHost": "1.0.0",
29 "Newtonsoft.Json": "9.0.1"
30 },
31 "frameworks": {
32 "netcoreapp1.0": {
33 // 设置兼容框架
34 "imports": [
35 "dotnet54",
36 "portable-net45+win8"
37 ]
38 }
39 },
40 "publishOptions": {
41 // 设置发布时需要包含的文件
42 "includeFiles": ["appsettings.json", "nlog.config"]
43 }
44 }

打开cmd窗口,进入到项目根目录,输入命令 dotnet publish ,项目将会进行编译发布

输入 dotnet xxx.dll 命令启动程序

访问路径 http://localhost:5000/api/users ,页面正常显示。
二、自带运行时发布
在跨平台发布时,.Net Core可以通过配置的方式指定目标平台,在发布时将对应的运行时一并打包发布。这样目标平台不需要安装.Net Core环境就可以部署。
再次修改 project.json 文件,增加目标平台

1 {
2 "version": "1.0.0-*",
3 "testRunner": "xunit", // 设置测试工具为xunit
4 "buildOptions": {
5 "debugType": "portable",
6 "emitEntryPoint": true
7 },
8 "dependencies": {
9 "Microsoft.NETCore.App": {
10 //"type": "platform", // 这个需要注释掉
11 "version": "1.0.0"
12 },
13 "Microsoft.AspNetCore.Server.Kestrel": "1.0.0",
14 "Microsoft.AspNetCore.Mvc": "1.0.0",
15 "Microsoft.Extensions.Logging": "1.0.0",
16 "Microsoft.Extensions.Logging.Console": "1.0.0",
17 "Microsoft.Extensions.Logging.Debug": "1.0.0",
18 "Microsoft.Extensions.Logging.Filter": "1.0.0",
19 "NLog.Extensions.Logging": "1.0.0-rtm-alpha2",
20 "Autofac.Extensions.DependencyInjection": "4.0.0-rc3-309",
21 "Microsoft.Extensions.Configuration": "1.0.0",
22 "Microsoft.Extensions.Configuration.FileExtensions": "1.0.0",
23 "Microsoft.Extensions.Configuration.Json": "1.0.0",
24 "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
25 "xunit": "2.2.0-beta2-build3300",
26 "dotnet-test-xunit": "2.2.0-preview2-build1029",
27 "moq.netcore": "4.4.0-beta8",
28 "Microsoft.AspNetCore.TestHost": "1.0.0",
29 "Newtonsoft.Json": "9.0.1"
30 },
31 "frameworks": {
32 "netcoreapp1.0": {
33 // 设置兼容框架
34 "imports": [
35 "dotnet54",
36 "portable-net45+win8"
37 ]
38 }
39 },
40 "publishOptions": {
41 // 设置发布时需要包含的文件
42 "includeFiles": [
43 "appsettings.json",
44 "nlog.config"
45 ]
46 },
47 // 目标平台
48 "runtimes": {
49 "win7-x64": {},
50 "win10-x64": {},
51 "ubuntu.14.04-x64": {}
52 }
53 }

cmd窗口运行 dotnet restore 命令,还原目标平台相关的包。这个过程耗时较长。
还原完成后,执行 dotnet publish 命令进行发布

进入对应发布目录,执行 WebApiFrame.exe 文件即可启动项目。
如果不显式指定目标平台,.Net Core默认选择当前系统平台。如果想指定目标平台,则需要执行命令 dotnet publish -r {目标平台} 。下面展示的是发布到ubuntu环境下。

第二部分、IIS托管
首先要安装一个工具.NET Core Windows Server Hosting。该工具支持将IIS作为一个反向代理,将请求导向Kestrel服务器。
引入相关nuget包
"Microsoft.AspNetCore.Server.IISIntegration": "1.0.0"
修改 Program.cs 内容

1 using Microsoft.AspNetCore.Hosting;
2
3 namespace WebApiFrame
4 {
5 public class Program
6 {
7 public static void Main(string[] args)
8 {
9 var host = new WebHostBuilder()
10 .UseKestrel()
11 .UseIISIntegration()
12 .UseStartup<Startup>()
13 .Build();
14
15 host.Run();
16 }
17 }
18 }

在项目根目录添加web.config,并配置到发布包含文件列表中

1 <?xml version="1.0" encoding="utf-8"?>
2 <configuration>
3
4 <!--
5 Configure your application settings in appsettings.json. Learn more at http://go.microsoft.com/fwlink/?LinkId=786380
6 -->
7
8 <system.webServer>
9 <handlers>
10 <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
11 </handlers>
12 <aspNetCore processPath="dotnet" arguments=".\WebApiFrame.dll" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false" />
13 </system.webServer>
14 </configuration>

执行 dotnet publish 发布后开始配置IIS

修改应用程序池,.Net CLR版本修改为:无托管代码

启动网站,访问地址 http://localhost:8080/api/users ,页面将显示内容。
在上面的例子里,IIS通过Asp.Net Core Module,提供了反向代理的机制。
通过访问IIS地址,将请求导向Asp.Net Core内置的Kestrel服务器,经过处理后再反向回传到IIS。整个过程IIS只作为一个桥梁,不做任何逻辑处理。
第二部分、托管在Windows Service中
详见这里:ASP.NET Core应用到Windows Service中
NetCore Selfhost,IIShost,Windows Service Host详解(自宿主、宿主在IIS,宿主在Windows Service中)的更多相关文章
- windows socket函数详解
windows socket函数详解 近期一直用第三方库写网络编程,反倒是遗忘了网络编程最底层的知识.因而产生了整理Winsock函数库的想法.以下知识点均来源于MSDN,本人只做翻译工作.虽然很多前 ...
- redis.windows.conf配置详解
redis.windows.conf配置详解 转自:https://www.cnblogs.com/kreo/p/4423362.html # redis 配置文件示例 # 当你需要为某个配置项指定内 ...
- Android中Service(服务)详解
http://blog.csdn.net/ryantang03/article/details/7770939 Android中Service(服务)详解 标签: serviceandroidappl ...
- Python调用windows下DLL详解
Python调用windows下DLL详解 - ctypes库的使用 2014年09月05日 16:05:44 阅读数:6942 在python中某些时候需要C做效率上的补充,在实际应用中,需要做部分 ...
- 【转载】Android Studio Service AIDL 详解
公司产品之前IM这块存在很多问题,消息到达率低,加上协议上有些问题,丢消息频繁,所以需要重构IM,AIDL不能解决以上问题.好吧!那AIDL可以解决什么问题?什么是AIDL? 什么是AIDL? AID ...
- 重装Windows系统 入门详解 - 基础教程
重装Windows系统 入门详解 - 基础教程 JERRY_Z. ~ 2020 / 10 / 13 转载请注明出处!️ 目录 重装Windows系统 入门详解 - 基础教程 一.说明 二.具体步骤 ( ...
- windows 安装Git详解
windows 安装Git详解 一.Git简介 Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. Git 是 Linus Torvalds 为了帮助管理 Lin ...
- windows curl命令详解
概述 Curl命令可以通过命令行的方式,执行Http请求.在Elasticsearch中有使用的场景,因此这里研究下如何在windows下执行curl命令. 软件下载 下载地址:https://cur ...
- 【JavaScript】windows.open用法详解
windows.open("URL","窗口名称","窗口外观设定");的用法详解 function onNewWindows(redire ...
随机推荐
- L138
Research indicates that lifestyles are changing fast.The essay isn't even remotely relevant to the t ...
- WebSocket 在烧瓶和龙卷风中的应用
a. 安装 pip3 install gevent-websocket 作用: - 处理Http.Websocket协议的请求 -> socket - 封装Http.Websocket相关数据 ...
- HAWQ取代传统数仓实践(七)——维度表技术之维度子集
有些需求不需要最细节的数据.例如更想要某个月的销售汇总,而不是某天的数据.再比如相对于全部的销售数据,可能对某些特定状态的数据更感兴趣等.此时事实数据需要关联到特定的维度,这些特定维度包含在从细节维度 ...
- flex 弹性布局的大坑!!
如果父元素设置 display:flex,那么其中的子元素会被当成行内元素对待,即会忽略其宽度 这在设置背景图时要特别特别注意!!!!
- (十七)js bom/dom
window 是所有BOM中所有对象的核心. window 的属性 window.self代表自己本身,相当于window. eg: console.log(window.self === windo ...
- MySql必知必会实战练习(五)存储过程
1. 为什么使用存储过程? (1) 通过把处理封装在容易使用的单元中,简化复杂操作 (2) 为了保证数据的完整性,不要求反复建立一系列的处理操作,所有开发人员和应用程序都使用同一(试验和测试)存储过程 ...
- 重温CLR(四)基元类型、引用类型、值类型
编程语言的基元类型 编译器直接支持的数据类型称为基元类型(primitive type).基元类型直接映射到framework类型(fcl)中存在的类型. 下表列出fcl类型 从另一个角度,可以认为C ...
- LeetCode Find Duplicate File in System
原题链接在这里:https://leetcode.com/problems/find-duplicate-file-in-system/description/ 题目: Given a list of ...
- 戴尔PowerEdge RAID控制卡使用示例(PERC H710P为例)
Dell PERC使用示例列表(H710p) 特别说明,本文相关RAID的操作,仅供网友在测试环境里学习和理解戴尔PowerEdge服务器RAID控制卡的功能和使用方法.切勿直接在生产服务器上做相关实 ...
- 浪潮各机型管理芯片BMC IP(智能平台管理接口)设置
NF5240m3/NF5140m3/NF5280m3/SA5212H2/NP5540M3NF5270M3/NF5170M3/NF8420m3 IPMI主板集成管理芯片BMC IP 设置开机按DEL键进 ...