Asp.net core 简单介绍
Asp.net core 是一个开源和跨平台的框架,用于构建如WEB应用,物联网(IoT)应用和移动后端应用等连接到互联网的基于云的现代应用程序。asp.net core 应用可运行.net和。netframework之上。
它由最小开销的模块化的组件构成,因此在构建解决方案的同时可以保持灵活性。Asp.net Core不再基于System.Web.dll。当前它基于一系列颗粒化的,并且有良好构建的NuGet包。
1.Asp.net Core应用
Asp.net Core应用实际上是一个在Main方法中创建一个Web服务器的简单控制台应用程序。
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args)
.Build().Run();
} public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
Main方法调用WebHost.CreateDefaultBuilder,后者按照生成器的模式来创建Web应用程序主机。生成器提供定义Web服务器(如UseKestrel)和启动类的方法(UseStartup)。上面的代码,自动分配了Kestrel Web服务器。Asp.Net Core的web服务器(如Http.sys),可通过调用相应的扩展方法使用。
IWebHostBuilde是WebHost.CreateDefaultBuilde调用的返回类型,它提供了许多可选方法,包括用于在Http.sys中托管应用的UseHttpSys,以及用于指定根内容目录UseConyenRoot。Build和Run方法生成IWebHost对象,该对象托管应用并开始侦听HTTP请求。
2.Startup
(1)Startup 类
如上面代码,IWebHostBuilder的UseStartup方法为应用指定Startup类。
ASP.NET Core为应用程序提供了处理每个请求的完整控制。Startup类是应用程序的入口,这个类可以设置配置,可用来定义请求处理管道(该管道将用于处理应用程序的所以请求)和配置应用需要的服务(并且将应用程序将要使用的服务连接起来)。
Startup类必须是公开的,并且必须包含下面的方法:
public void ConfigureServices(IServiceCollection services)
{ } public void Configure(IApplicationBuilder app, IHostingEnvironment env,)
{ }
ConfigureServices方法用于定义应用所使用的服务(如MVC,EF,以及自定义的服务),Configure方法用于定义你的请求管道中的中间件。
所有的应用程序中都有Startup类,可能会存在特定环境的启动类和方法,但无论如何,Startup类都将被充当为应用程序的启动点。ASP.NET会在主程序集中搜索名为Startup的类(在任何命名空间下)。你也可以指定一个其他程序集用于检索,只需使用
Hosting:Application配置键。
Startup类能够选择性地在构造函数中接受通过依赖注入提供的依赖项。一般而言,将要被配置的应用程序的方法应定义于Startup类的构造函数中,如Configuration。Startup类必须定义Configure方法,可选择定义一个ConfigureServices方法,
这些方法在应用程序启动时被调用。 (2)Configure 方法
Configure方法用于指定ASP.NET应用程序将如何响应每一个HTTP请求。简单来说,你可以配置每个请求都接受相同的响应。但是,大多数应用程序都需要更多的功能。更复杂的管道配置可以封装在中间件(middleware)中,并通过扩展方法添加到IApplicationBuilder上。
Configure方法必须接受一个IApplicationBuilder参数。一些额外服务,比如IHostingEnviroment或ILoggerFactory也可以被指定,在他们可用的情况下,这些服务将会被服务器注入。下面是默认的Web站点模板,多个扩展方法被用于配置管道,以支持BrowserLink,错误页,静态文件,MVC.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
} app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy(); app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
每个Use扩展方法都会把一个中间件加入请求管道。例如,UseMvc扩展方法增加了路由中间件请求管道,并配置MVC为默认处理程序。
(3)ConfigureServices方法
像Configure一样,可以在IServicesCollection上使用扩展方法来包装需要大量配置细节的ConfigureServices。例如下面默认的Web模板代码,使用几个Add[Something]扩展方法用于应用程序,用来使用Session,MVC。
public void ConfigureServices(IServiceCollection services)
{
services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromSeconds();
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
通过依赖注入可将服务以及自定义服务加入服务容器,使其在应用程序中使用。就像Startup类能够将指定依赖项作为其方法参数,而不是硬编码来实例化,中间件,控制器类以及其他类都可以做到。 (4)一些服务
ASP.NET Core在应用程序启动时提供了一些应用服务和对象。只要在Startup类的构造函数中包含适合的接口,或者在它的Configure方法,ConfigureServices方法中包含合适的接口即可。
IApplicationBuilder:
被用于构建应用程序的请求管道。只能在Startup中的Configure方法中使用。
IApplicationEnvironment:
提供了访问应用程序属性,类似于ApplicationName,ApplicationVersion以及ApplicationBasePath。可以在Startup的构造函数和Configure方法中使用。 ILoggerFactory:
提供了创建日志的机制。可以在Startup的构造函数或Configure方法中使用。 IServiceCollection:
当前容器中各服务的配置集合。只能在ConfigureServices方法中使用。只用在ConfigureServices方法中配置后,此服务在应用程序中才能使用。
3.服务
服务是应用中用于通用调用的组件。服务必须通过依赖注入(DI)获取并使用。ASP.NET Core内置了一个简单的控制反转(IoC)容器,它默认支持构造函数注入,同时也可以替换成别的IoC容器。
4.中间件
在ASP.NET Core中,可以使用中间件构建自己的请求处理管道。ASP.NET Core中间件为一个HttpContext执行异步逻辑,然后按顺序调用下一个中间件或直接终止请求。一般情况,要想使用一个中间件,只需在Configure方法里调用IApplicationBuilder
上一个对应的UseXYZ扩展方法即可。比如,内置的中间件:
静态文件(Static files)
路由(Route)
身份验证(Authentication)
当然也可以创建自定义的中间件,以及在ASP.NET Core中使用基于任何OWIN的中间件。
中间件是用于组成应用程序管道来处理请求和响应的组件。管道内的每一个组件都可以选择是否将请求交给下一个组件,并在管道中调用下一个组件之前和之后执行一些操作。请求委托被用来建立请求管道,请求委托处理每一个HTTP请求。
请求委托通过使用IApplicationBuilder类型的Run,Map以及Use扩展方法来配置,并在Startup类中传给Congigure方法。每个单独的请求委托可以编写为一个内嵌的方法,或定义在一个可重用的类中。这些可重用的类就叫作“中间件"或“中间组件“。每个位于请求管道内的中间件负责执行某些操作以及调用管道中下一个组件,或适时短路。
ASP.NET请求管道由一系列的请求委托构成:
每一个委托在下一个委托之前和之后都有机会执行操作,任何委托都能选择停止传递到下一个委托,转而自己处理该请求,这就是请求管道的短路,而且是一种有意义的设计,因为这样可以避免不必要的工作。比如,一个授权中间件只有在通过身份验证之后才能调用下一个委托,否则就短路。
异常处理委托需要在管道的早期被调用,这样它们就能够捕捉到发生在管道内所有的异常。
下面是Web项目默认模板代码:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
} app.UseStaticFiles();
app.UseAuthentication(); app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
上面的代码在非开发环境下,UseExceptionHandler是第一个被加入到管道中的中间件,因此将会捕获之后代码中出现的任何异常,然后跳转到设置的异常页。
接着是静态文件中间件,静态文件中间件不提供授权检查,由它提供的任何文件,包括那些位于wwwroot下的文件都是公开可被访问的。
如果想基于授权来提供这些文件:
首先将文件放置到wwwroot外面以及任何静态文件中间件都可以访问到的目录,在控制器中判断授权是否允许访问,如果允许则通过FileResult来提供文件。
然后被静态文件中间件处理的请求会在管道中被短路。如果请求不是由静态文件模块处理,就会传给洗一个中间件Identity模块执行身份验证。如果未通过身份验证,则管道短路。否则,执行后面的MVC框架。
最简单的ASP.NET应用程序可以使用单个请求委托来处理请求。在这种情况下,并不存在所谓的管道,调用单个匿名函数以应对每个HTTP请求。
app.Run(async context=>
{
await context.Response.WriteAsync("Hello World!");
});
短路示例:第一个Run委托短路管道,只有第一个委托会返回”Hello,World!“
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.Run(async context=>
{
await context.Response.WriteAsync("Hello,World!");
});
app.Run(async context =>
{
await context.Response.WriteAsync("Hello,World,Again!");
});
}
多个请求委托链接示例:next参数表示管道内下一个请求委托。在管道中可以通过不调用next参数来短路。
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.Use(async (context,next)=>
{
await context.Response.WriteAsync("Hello,World!\n");
await next.Invoke();
await context.Response.WriteAsync("Hello,World,End!\n");
});
app.Run(async context =>
{
await context.Response.WriteAsync("Hello,World,Again!\n");
});
}
Run,Map与Use方法
可以使用Run,Map,和Use方法配置HTTP管道。Run方法会短路管道,因为它不会调用next请求委托。因此Run方法一般只在管道底部被调用。Run方法是一种惯例,有些中间件组件可能会暴露自己的Run[Middleware]方法,而这些方法只能在管道末尾运行。
Use方法前面已经介绍,Use方法中没有使用next参数和Run方法是等价的:
app.Use(async (context,next)=>
{
await context.Response.WriteAsync("Hello,World!");
});
app.Run(async context =>
{
await context.Response.WriteAsync("Hello,World!");
});
ASP.NET Core中约定Map*扩展方法被用于分支管道。当前的实现支持基于请求路径或使用谓词来进入分支。Map扩展方法用于匹配基于请求路径的请求委托。Map只接受路径,并配置单独的中间件管道功能。
下面的例子,任何基于/maptest的请求都会被管道中所配置的HandleMapTest方法处理:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.Map("/maptest", HandleMapTest); } private static void HandleMapTest(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Map test");
});
}
除了基于路径的映射外,MapWhen方法还支持基于谓词的中间件分支,允许构建单独的管道。任何Func<HttpContext,bool>类型的谓语都可被用于将请求映射到新的管道分支。
示例:检测查询字符串中变量branch是否存在
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.MapWhen(context=>
{
return context.Request.Query.ContainsKey("branch");
}, HandleBranch); } private static void HandleBranch(IApplicationBuilder app)
{
app.Run(async context=>
{
await context.Response.WriteAsync("Branch used.");
});
}
在Map方法中需要短路管道,因为会进入分支。
在map中还可以嵌套。
自定义中间件
中间件遵循显示依赖原则,并在其构造函数中暴露所有依赖项。中间件能够利用UseMiddleware<T>扩展方法的优势,直接通过他们的构造函数注入服务。依赖注入服务是自动填充的,扩展所用到的params参数数组被用于非注入参数。
自定义日志中间件 5.服务器
ASP.NET Core托管模式并不直接监听请求,而是依赖于一个HTTP Sever实现来转发请求到应用程序。这个转发的请求会以一组feature接口的形式被包装,然后被应用程序组合到一个HttpContext中去。
ASP.NET Core包含一个托管的跨平台Web服务器:Kestrel,它往往会被运行在一个如IIS或者Nginx的生产Web服务器之后。
6.内容根目录
内容根目录是应用程序所用到的所有内容的根路径,比如views和web内容。默认情况下,内容根目录与宿主应用的可执行程序的应用根目录相同;其他位置可以通过WebHostBuilder来设置。
7.网站根目录
应用程序的Web根目录是项目中类似于CSS,JS和图片文件公开,静态的资源的目录。静态文件中间件将默认只读取Web根目录和其子目录中的文件。Web根目录默认为<contentroot>/wwwwroot,但是可以通过WebHostBuilder来指定另一个地址。
8.静态文件
静态文件中间件
9.配置
ASP.NET Core使用一个新的配置模型,用来处理简单的键值对。新的配置模型不是基于System.Configuration或者web.config;它是一个有序拉取数据的配置providers。内置的构造提供支持多种不同的文件格式,XML,JSON,INI和用于支持基于环境的
配置环境变量。同样也可以编写自定义的配置providers。
配置文件
9.环境
环境
Asp.net core 简单介绍的更多相关文章
- (0)ASP.NET Core 简单介绍 和开发环境搭建 - ASP.NET从MVC5升级到MVC6
ASP.NET从MVC5升级到MVC6 总目录 ASP.NET Core 首先,ASP原本只是一种技术,这种技术从上个世纪90年代就有了. Active Service Page 和 Java Ser ...
- ASP.NET MVC 简单介绍①
ASP.NET MVC 简单介绍① 只做了重要描述,内容出自菜鸟教程网站内容. 目录 1布局 2HTML 帮助器 3.Razor 语法 4.添加样式 5.Layout 6. Controllers ...
- ASP.NET Core 简单实现七牛图片上传(FormData 和 Base64)
ASP.NET Core 简单实现七牛图片上传(FormData 和 Base64) 七牛图片上传 SDK(.NET 版本):https://developer.qiniu.com/kodo/sdk/ ...
- [转]Asp.Net Core 简单的使用加密的Cookie保存用户状态
本文转自:http://www.cnblogs.com/Joes/p/6023820.html 在以前的Asp.Net中可以用 FormsAuthentication 类的一系列方法来使用加密的Coo ...
- Asp.Net Core 简单的使用加密的Cookie保存用户状态
在以前的Asp.Net中可以用 FormsAuthentication 类的一系列方法来使用加密的Cookie存储用户身份,使用简单,可控性强.在Asp.Net Core中是否也可以的?答案是当然的. ...
- ASP.NET Core 接触&介绍
几年前从朋友口中了解到了微软出来一个ASP.NET Core ,当时还是1.0版本,聊天时还吐槽不好用之类的.前不久了解.NET Core 已经出3.0版本了,突然想试试,了解了解.ASP.NET C ...
- ASP.NET Core 简单引入教程
0.简介 开源.跨平台 1.环境安装 参考官方教程 Core 官方文档 2.向世界问个好 sheel/cmd 下: dotnet --help // 查看帮助 dotnet new * / ...
- ASP.NET Core快速入门(第4章:ASP.NET Core HTTP介绍)--学习笔记
课程链接:http://video.jessetalk.cn/course/explore 良心课程,大家一起来学习哈! 任务22:课程介绍 1.HTTP 处理过程 2.WebHost 的配置与启动 ...
- ASP.NET Core 简单集成签发 JWT (JSON Web Tokens)
什么是 JWT ? 从 https://jwt.io/ 可以了解到对 JWT 的描述:JSON Web Tokens are an open, industry standard RFC 7519 m ...
随机推荐
- Docker容器服务(三)
一.创建容器 容器是Docker的另一个核心概念. 简单地说,容器是镜像的一个运行实例,所不同的是,它带有额外的可写文件层. 1.1创建一个容器 使用docker create命令创建的容器处于停止状 ...
- C语言之double
#include<stdio.h> int main(void) { printf("请分别输入身高的英尺和英寸,""如输入\"5 7\" ...
- jmeter压测学习9-响应断言
前言 使用jmeter做接口压测的时候,如何能保证接口的每次返回结果都是我们预期的呢?这就需要添加检查点,也就是添加断言. 添加断言就是为了检查返回的结果与我们的预期是一致的,不用去一个个检查结果. ...
- html 后手
1.a (1.)超链接 <a href="new.html">点击进入到新网页</a>这里可以直接跳转到一个页面 <a href="http ...
- 201871010123-吴丽丽《面向对象程序设计(Java)》第十一周学习总结
201871010123-吴丽丽<面向对象程序设计(Java)>第十一周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...
- Java8——Optional
/* * 一.Optional 容器类:用于尽量避免空指针异常 * Optional.of(T t) : 创建一个 Optional 实例 * Optional.empty() : 创建一个空的 Op ...
- js中,null, '',undefined的区别
在js中有三种值都可以代表false "",null,undefined 那么他们之间到底有什么区别呢 首先我们先看这三种值得类型 ""代表了一个没有字符的字 ...
- 【oracle】oracle11g安装失败 提示找不到文件,模板General_Purpose.dbc不存在
先确定一下自己的安装包是不是一起解压的! 不是就重新解压,重新装. 是,剩下的我也不会
- perfview微软开源的cpu以及内存性能分析工具
perfview 是一个强大的分析工具,能用来分cpu,内存,磁盘io...多种指标,使用简单,功能强大 用来分析windows应用的性能问题,是一个很不错的选择 下载地址 https://githu ...
- ABP 下载源码报错
ASP.NET Boilerplate 下载地址应该是这个:https://github.com/aspnetboilerplate/aspnetboilerplate/tree/v1.5.2 下载的 ...