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 ...
随机推荐
- 遍历输出所有子视图(View)
传入一个View,可以获取传入视图的所有子视图,写入桌面,可以在火狐浏览器下查看 /** * 程序获得了焦点就会自动调用这个方法(只要程序获得了焦点,所有控件才能接收触摸事件) */ - (void) ...
- Week2《Java程序设计》第二周学习总结
Week02-Java学习笔记2 1. 本周学习总结 本周学习了java的基本语法与类库,其中介绍了基本数据类型和引用类型,介绍了String类,String对象的拼接以及String的一些常用方法: ...
- ROS中使用ABB Yumi IRB14000的一些资料汇总
目前,ABB RobotStudio 已经更新到6.05.01了,可至官网下载. 使用ABB RobotStudio和ROS进行联合调试,请参考下文: http://blog.csdn.net/Zha ...
- Getting started with Android and Kotlin (译文)
原文链接 http://kotlinlang.org/docs/tutorials/kotlin-android.html 写在前面 Kotlin 是一个基于 JVM 的新的编程语言,由 JetBra ...
- Manual Install Cocos2d-x vc template on Windows 7
Manual Installation Process Download the template file from HERE and extract it. Open the file CCApp ...
- UltraEdit编码设置
1.查看ue文件编码 一直苦于无法判断文件的编码类型,现在发现一个方法,就是用强大的UltraEdit-32软件: UltraEdit-32的状态栏可以显示文件的编码类型,详细情况如下: ANSCI- ...
- iOS6 自动布局 入门–Auto Layout
目前为止,即使你的界面设计是在合理的复杂度内,你也必须要为之写许多代码来适应变化的布局.现在我相信你会很高兴听到这种情况将不会发生了-对于iPhone与iPad IOS6 带来了一个非常了不起的特征: ...
- 调试SPRING MVC(或者整合SSH)的时候遇到了org/objectweb/asm/Type
调试SPRING MVC(或者整合SSH)的时候遇到了org/objectweb/asm/Type 解决方法1: 原因是Spring中的cglib-nodep-2.x.x.jar与Hibernate中 ...
- angular中的 input select 值绑定无效,以及多出一个空白选项问题
问题: <!-- 问题标签 --> <select ng-model="sortType"> <option value="1"& ...
- iconfont阿里字体图标的使用方法
我们在做web项目的时候,之前比较常用的是bootstrap,所以使用font awesome字体图标比较多,无意中在一个项目中接触到了iconfont,发现想要的什么图标都有,还可以自定义图标,非常 ...