首先我们要清楚一个概念,宿主。宿主是什么意思?先从了解一下Hosting开始吧!

有关Hosting的基础知识

Hosting是一个非常重要,但又很难翻译成中文的概念。翻译成:寄宿,大概能勉强地传达它的意思。我们知道,有一些病毒离开了活体之后就会死亡,我们把那些活体称为病毒的宿主。把这种概念应用到托管程序上来,CLR不能单独存在,它必须依赖于某一个进程,我们把这种状况称之为:CLR必须寄宿于某一个进程中,而那个进程就是宿主。

ASP.NET Core的一个大的改变就是就是将Web应用程序改成了自寄宿。什么意思呢?我们知道,在之前的ASP.NET版本中,ASP.NET的Web应用程序都是深度依赖IIS和Windows Server,以至于ASP.NET只能在Windows Server上运行。之所以出现这种情况,就是应为我们开发的所有Web应用程序都是寄宿在IIS进程中的。一般来说,一个进程只能加载一个CLR(不同进程之间可以加载不同的版本的CLR),为了托管多个Web应用程序,IIS使用了应用程序池这种东西来模拟进程的行为,从而为不同的Web程序加载不同的运行时来托管它们。

有关CLR和寄宿的知识,如果有兴趣,可以参阅《CLR via C#》。

我们可以查看一下以前版本的ASP.NET程序,它是没有Main()函数的,也就是说它没有程序入口点,不是单独的进程。对于应用程序开发来说,这个问题并不大,因为开发者在意的Web程序的逻辑、数据安全等问题,而不是应用程序如何被加载。但对于一个Web框架来说,这个问题非常严重,因为它高度依赖IIS和Windows Server,减少了它的适用范围。如果我们查看ASP.NET Core的程序,你会发现它本质上就是一个控制台程序,如果我们把那些在Main()函数中自动生成的代码都删掉(VS2015的模板会自带一些代码),加上Console.WriteLine("Hello World!"); 它就会在控制台中打出Hello World!由于ASP.NET Core的程序自身有程序入口点,所以自身就是一个进程,它可以为自己加载合适的CLR来运行Web应用,这种情况就是自寄宿。这么做的最大的好处就是可以脱离IIS,从而脱离Windows Server的桎梏。只要对应操作系统上有符合CLR规范的运行时,那ASP.NET Core的应用就可以部署在那个操作系统上。.NET Core里包含了微软开发的跨平台CLR运行时,可以运行在Windows,Linux和OSX上,借助它ASP.NET Core的应用程序就可以部署在这些操作系统上。

说到这里,就只能下最后一个问题,IIS还扮演什么角色?当应用部署在Windows上时,微软推荐将IIS通过ASP.NET Core Module(之前的HttpPlatformHandler)模块作为Web应用的反向代理服务器(reverse-proxy server)。这个服务器的作用就是将请求转发到Web应用真正的服务器:

  • WebListener (只能在Windows平台)
  • Kestrel         (跨平台服务器,比WebListener功能稍弱)

前面上了那么多开胃菜,终于可以上正菜了,首先演示一下webapi 寄宿控制台程序。大家可以根据这个思路进行扩展,如:寄宿在跨平台的程序上;

首先进行nuget包的引用;

引用之后创建一个控制器代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Http; namespace WebApi
{
public class UserController : ApiController
{
[HttpGet]
public string Get()
{
return "访问成功!";
} }
}

然后在控制台的main函数中进行调用

 static void Main(string[] args)
{ //默认使用json返回数据而不论请求是不是application/xml
//GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
var config = new HttpSelfHostConfiguration("http://localhost:8080"); config.Routes.MapHttpRoute("ApiDefault", "api/{controller}/{id}", new { id = RouteParameter.Optional });
using (var server = new HttpSelfHostServer(config))
{
server.OpenAsync().Wait();
Console.WriteLine("开启webapi微服务");
Console.WriteLine("按Enter键退出");
Console.WriteLine("Press Enter To Quit");
Console.ReadLine();
} }

开启软件后,在游览器里面输入就可以进行访问了。

这是一个比较整活的一种方式,实际工作中建议还是用iis进行搭建,本人所用的是vs 2019和.net fromwork 4.7.2所写的程序;

最新文章

  1. vertical-align和line-height的那些事
  2. 升级CentOS内核 - 2.6升级到3.10
  3. sqlite3 not found问题解决方法
  4. 用Block封装ASIHttpRequest
  5. win7 64 旗舰版虚拟GPU-VMware下+vs2013安装caffe+matlab+python
  6. hdu 1576 A/B (扩展欧几里德简单运用)
  7. Django 学习笔记之三 数据库输入数据
  8. YII增加全局函数
  9. Mongodb实用网址记录
  10. 对Numpy广播操作的理解
  11. C#:StreamReader读取.CSV文件(转换成DataTable)
  12. [MySQL] 5.7版本以上group by语句报1055错误问题
  13. Python之路(第三十四篇) 网络编程:验证客户端合法性
  14. Windows Azure中国版试用
  15. zabbix server源码安装
  16. (转)MYSQL线程池总结(一)
  17. 软件魔方制作系统启动盘并安装win8系统
  18. wepy - 与原生有什么不同(事件更改)
  19. datagridview添加行
  20. pycharm激活地址

热门文章

  1. shopping cart
  2. 【数据结构与算法Python版学习笔记】树——平衡二叉搜索树(AVL树)
  3. RSA加密——前端JSEncrypt
  4. Prometheus基于文件的服务发现
  5. mybatis自定义分页拦截器
  6. 零基础入门之Linux进程基础
  7. 21.7.31 test
  8. 基于屏幕空间的实时全局光照(Real-time Global Illumination Based On Screen Space)
  9. 手把手教你学Dapr - 3. 使用Dapr运行第一个.Net程序
  10. 转:基于 xilinx vivado 的PCIE ip核设置与例程代码详解