Asp.net core的官方文档:https://docs.microsoft.com/en-us/aspnet/core/,部分文档有中文的:https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/index
项目结构
wwwroot是静态文件的路径,静态文件都放这里
appsettings.json是默认的配置文件,相当于Web.config
Program.cs是程序的入口
Startup.cs是项目初始化类,相当于Global.asax,在.net core中用来代替Global文件的
asp.net core两种运行方式:SelfHost及IIS集成,在VS中调试的时候也有这两种方式。推荐用SelfHost。
普通的.NetFramework项目程序,只能跑在IIS下(asp生命周期,IIS管道事件)
.NetFramework和IIS紧密的集成在一起,形成了你我不分的粘在了一起,这很恶心
你看asp.net内核一些类的时候,一些实现的时候,你可以看到它里面是直接调用了IIS的一些核心组件,这样做可能对当时来说是合适的,但是现在来说是不合适的。因为asp.net这个web开发的框架竟然与web服务器(IIS)耦合在一起,这是一件非常恶心的事情,这样带来最大的问题就是很难拆分,比如我就不想用IIS作服务器,我就像用别的web服务器,这怎么办? (因为asp.net底层本身就和IIS服务器粘合在一起,你怎么拆分?)
现在。net core就很好的解决了这个问题 .net core是跨平台的,如果它还和IIS那么不清不楚的粘合在一起,那就没办法跨平台了。
.net core 与IIS做了彻底的分离,它可以不依赖IIS去运行,它自己就内置了一个服务器,这个服务器是跨平台的,可以运行在不同的系统 【服务器名字好像叫Kestrel,它不是一个直接暴露给公网的普通服务器,如果你将你的应用部署在公共网络上,我们建议你使用IIS,Nginx或者Apache作为反向代理服务器。一个反向代理服务器接收来自网络的HTTP请求并且在经过一些初步处理后将请求传递到Kestrel服务器。如果你的应用只接收来自内部网络的请求,你可以只使用Kestrel本身】
namespace MvcCore
{
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseKestrel() //启用Kestrel服务器(Kestrel服务器是.net core内置服务器)
.UseContentRoot(Directory.GetCurrentDirectory()) //指定网站的根目录
.UseIISIntegration()//表示如果我们的网站可能被寄宿在IIS上运行,那么就需要启用它(建议,无论你的网站是否寄宿在IIS上,你都启用它,因为启用与不启用对我们的网站都没有任何的影响,因为你加上它你的网站照样也可以部署在Linux下)
.UseStartup<Startup>();//表示启用Startup.cs初始化类
}
}
2
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
namespace MvcCore
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
//此方法是初始化一些服务
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddSession();
//这里是添加对MVC的支持
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
//我们的网站有开发状态(线下)和运行状态(线上),IsDevelopment()表示是否为开发环境(线下)
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();//如果是开发环境则启用开发环境的报错页(有详细的报错信息)
}
else
{
app.UseExceptionHandler("/Home/Error"); //否则启用我们自定义Error错误页(没有详细的报错信息)
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseSession();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
}
}
3
//IOC
var serviceAsm = Assembly.Load(new AssemblyName("CMS.Services"));
//找出实现了IServicesTag接口的非抽象类集合
var serviceTypes = serviceAsm.GetTypes().Where(r => typeof(IServicesTag).IsAssignableFrom(r) && r.GetTypeInfo().IsAbstract == false);
foreach (var serviceType in serviceTypes)
{
var interfaceTypes = serviceType.GetInterfaces();//获取这个类继承的所有接口
foreach (var interfaceType in interfaceTypes)//遍历每个接口类
{
services.AddSingleton(interfaceType, serviceType);//把这个类注册为这个接口的实现类。当别人要我这个接口的实现类的时候,我就把这个类的对象给它
}
}