我一直在存眷asp.net core 和 angular 2/4, 并在用这对开发了一些对照小的项目. 此刻我觉得是时候使用这两个技术去为企业开发大一点的项目了, 由于企业有时候需要SSO(单点登录), 所以我一直在期待Identity Server4以及相关库的正式版, 此刻匹配2.0的RC版已经有了, 所以这个可以开始编写了.
这个系列就是我从新开始成立我本身的基于asp.net core 2.0 web api的后台api根本框架过程, 预计得分几次才华写完. 如果有什么处所错的, 请列位指出!!,感谢.
创建项目:1.选择asp.net core web application.
2.选择.net core, asp.net core 2.0, 然后选择Empty (因为是从新开始):
下面看看项目生成的代码:
Program.csnamespace CoreBackend.Api { public class Program { public static void Main(string[] args) { BuildWebHost(args).Run(); } public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .Build(); } }
这个Program是措施的入口, 看起来很眼熟, 是因为asp.net core application实际就是控制台措施(console application).
它是一个挪用asp.net core 相关库的console application.
Main要领里面的内容主要是用来配置和运行措施的.
因为我们的web措施需要一个宿主, 所以 BuildWebHost这个要领就创建了一个WebHostBuilder. 而且我们还需要Web Server.
看一下WebHost.CreateDefaultBuilder(args)的源码:
public static IWebHostBuilder CreateDefaultBuilder(string[] args) { var builder = new WebHostBuilder() .UseKestrel() .UseContentRoot(Directory.GetCurrentDirectory()) .ConfigureAppConfiguration((hostingContext, config) => { var env = hostingContext.HostingEnvironment; config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true); if (env.IsDevelopment()) { var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName)); if (appAssembly != null) { config.AddUserSecrets(appAssembly, optional: true); } } config.AddEnvironmentVariables(); if (args != null) { config.AddCommandLine(args); } }) .ConfigureLogging((hostingContext, logging) => { logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging")); logging.AddConsole(); logging.AddDebug(); }) .UseIISIntegration() .UseDefaultServiceProvider((context, options) => { options.ValidateScopes = context.HostingEnvironment.IsDevelopment(); }); return builder; }
asp.net core 自带了两种http servers, 一个是WebListener, 它只能用于windows系统, 另一个是kestrel, 它是跨平台的.
kestrel是默认的web server, 就是通过UseKestrel()这个要领来启用的.
但是我们开发的时候使用的是IIS Express, 挪用UseIISIntegration()这个要领是启用IIS Express, 它作为Kestrel的Reverse Proxy server来用.
如果在windows处事器上部署的话, 就应该使用IIS作为Kestrel的反向代办代理处事器来打点和代办代理请求.
如果在linux上的话, 可以使用apache, nginx等等的作为kestrel的proxy server.
固然也可以单独使用kestrel作为web 处事器, 但是使用iis作为reverse proxy还是由很多有点的: 例如,IIS可以过滤请求, 打点证书, 措施瓦解时自动重启等.
UseStartup<Startup>(), 这句话暗示在措施启动的时候, 我们会挪用Startup这个类.
Build()完之后返回一个实现了IWebHost接口的实例(WebHostBuilder), 然后挪用Run()就会运行Web措施, 并且阻止这个挪用的线程, 直到措施*.
BuildWebHost这个lambda表达式最好不要整合到Main要领里面, 因为Entity Framework 2.0会使用它, 如果把这个lambda表达式去失之后, Add-Migration这个命令可能就欠好用了!!!
Startup.cs