首先我们要清楚一个概念,宿主。宿主是什么意思?先从了解一下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所写的程序;

Web Api 宿主的搭建的更多相关文章

  1. windows service承载的web api宿主搭建(Microsoft.Owin+service)

    今天突然想起改良一下以前搭建的“windows service承载的web api”服务,以前也是直接引用的类库,没有使用nuget包,时隔几年应该很旧版本了吧.所以本次把需要nuget获取的包记录一 ...

  2. ASP.NET Web API 2系列(一):初识Web API及手动搭建基本框架

    1.导言 随着Web技术的发展,现在各种框架,前端的,后端的,数不胜数.全栈工程师的压力越来越大. PC端,pad端,移动端App(安卓/IOS)的发展,使得前后端一体的开发模式十分笨重.因此,前后端 ...

  3. 返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, .net 4.5 带来的更方便的异步操作

    原文:返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, ...

  4. 如果调用ASP.NET Web API不能发送PUT/DELETE请求怎么办?

    理想的RESTful Web API采用面向资源的架构,并使用请求的HTTP方法表示针对目标资源的操作类型.但是理想和现实是有距离的,虽然HTTP协议提供了一系列原生的HTTP方法,但是在具体的网络环 ...

  5. Web API 之SelfHost与OwinSelfHots加载外部程序

       下面就一些web api的一些基础内容进行阐述,然后就web api宿主承载中的实际业务问题进行解决 HttpController      HttpController的激活是由处于消息处理管 ...

  6. ASP.NET Web API 2系列(三):查看WebAPI接口的详细说明及测试接口

    引言 前边两篇博客介绍了Web API的基本框架以及路由配置,这篇博客主要解决在前后端分离项目中,为前端人员提供详细接口说明的问题,主要是通过修改WebApi HelpPage相关代码和添加WebAp ...

  7. 尝新体验ASP.NET Core 6预览版本中发布的最小Web API(minimal APIS)新特性

    本文首发于<尝新体验ASP.NET Core 6预览版本中发布的最小Web API(minimal APIS)新特性> 概述 .NET开发者们大家好,我是Rector. 几天前(美国时间2 ...

  8. 使用PostMan Canary测试受Identity Server 4保护的Web Api

    在<Asp.Net Core: Swagger 与 Identity Server 4>一文中介绍了如何生成受保护的Web Api的Swagger文档,本文介绍使用PostMan Cana ...

  9. windows service宿主web api使用"依赖注入"和“控制反转”的技术实践

    前言 自从几年前抛弃wcf,使用web api 来做服务器端开发之后,就不再迷惑了.但是因为本来从事传统行业管理软件开发,一般都以分布式应用开发为主.纯BS还是比较少,于是比较喜欢用windows s ...

随机推荐

  1. 流量治理神器-Sentinel的限流模式,选单机还是集群?

    大家好,架构摆渡人.这是我的第5篇原创文章,还请多多支持. 上篇文章给大家推荐了一些限流的框架,如果说硬要我推荐一款,我会推荐Sentinel,Sentinel的限流模式分为两种,分别是单机模式和集群 ...

  2. PTA实验4-2-3 验证“哥德巴赫猜想” (20分)

    实验4-2-3 验证"哥德巴赫猜想" (20分) 数学领域著名的"哥德巴赫猜想"的大致意思是:任何一个大于2的偶数总能表示为两个素数之和.比如:24=5+19, ...

  3. Java(36)IO流案例与总结

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15228455.html 博客主页:https://www.cnblogs.com/testero ...

  4. AIbee 笔试

    CSS选择器 div+p 选择紧接在div元素之后的所有< p >元素 C++删除数组最后一个元素. 例如[1 2 3 4] 最后变为 [1 2 3] 用splice的删除,增加和替换 a ...

  5. for...in和Object.keys()区别

    区别: for in 用来枚举对象的属性,某些情况下,可能按照随机顺序遍历数组元素 object.keys() 可以返回对象属性为元素的数组,数组中属性名顺序和for in比那里返回顺序一样 ---f ...

  6. 【数据结构与算法Python版学习笔记】算法分析

    什么是算法分析 算法是问题解决的通用的分步的指令的聚合 算法分析主要就是从计算资源的消耗的角度来评判和比较算法. 计算资源指标 存储空间或内存 执行时间 影响算法运行时间的其他因素 分为最好.最差和平 ...

  7. spring session实现session统一管理(jdbc实现)

    最近在看一些关于spring session 的知识,特做一个笔记记录一下. 在项目中经常会遇到这么一种情况,同一个web项目有时需要部署多份,然后使用nginx实现负载均衡,那么遇到的问题就是,部署 ...

  8. elasticsearch入门(简单的crud操作)

    记录一下,elasticsearch从创建索引到插入数据的一个crud操作. 一.创建索引 curl -XPUT "http://192.168.99.1:9200/productindex ...

  9. 数组中的逆序对 牛客网 剑指Offer

    数组中的逆序对 牛客网 剑指Offer 题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对10000000 ...

  10. hdu 2860 Regroup(并查集)

    题意: AP x yA recruit with ability rate x were asked to join company y. (0<=x<2^31, 0<=y<n ...