0、Program.cs
using System.IO; using Microsoft.AspNetCore.Hosting; namespace WebApplication1 { public class Program { public static void Main(string[] args) { var host = new WebHostBuilder() .UseKestrel() .UseContentRoot(Directory.GetCurrentDirectory()) .UseIISIntegration() .UseStartup<Startup>() .Build(); host.Run(); } } }
1、project.json
{ "userSecretsId": "aspnet-WebApplicationCore1-782de49b-8e7f-46be-82aa-0f48e1d370bc", "dependencies": { "Microsoft.NETCore.App": { "version": "1.0.0", "type": "platform" }, "Microsoft.AspNetCore.Diagnostics": "1.0.0", "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0", "Microsoft.AspNetCore.Server.Kestrel": "1.0.0", "Microsoft.Extensions.Logging.Console": "1.0.0", "Microsoft.Extensions.Logging.Debug": "1.0.0", "Microsoft.AspNetCore.Routing": "1.0.0", "Microsoft.AspNetCore.Routing.Abstractions": "1.0.0", "Microsoft.Extensions.Configuration.Abstractions": "1.0.0", "Microsoft.Extensions.Configuration.FileExtensions": "1.0.0", "Microsoft.Extensions.Configuration.Json": "1.0.0", "Microsoft.Extensions.Configuration.UserSecrets": "1.0.0", "Microsoft.AspNetCore.Http.Abstractions": "1.0.0", "Microsoft.AspNetCore.StaticFiles": "1.0.0" }, "tools": { "Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final" }, "frameworks": { "netcoreapp1.0": { "imports": [ "dotnet5.6", "portable-net45+win8" ] } }, "buildOptions": { "emitEntryPoint": true, "preserveCompilationContext": true }, "runtimeOptions": { "configProperties": { "System.GC.Server": true } }, "publishOptions": { "include": [ "wwwroot", "web.config" ] }, "scripts": { "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ] } }
2、appsettings.json
{ "ConnectionStrings": { "DefaultConnection": "Server=(localdb)\mssqllocaldb;Database=aspnet-WebApplicationCore1-782de49b-8e7f-46be-82aa-0f48e1d370bc;Trusted_Connection=True;MultipleActiveResultSets=true" }, "Logging": { "IncludeScopes": false, "LogLevel": { "Default": "Debug", "System": "Information", "Microsoft": "Information" } } }
3、Startup.cs
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using WebApplication1.Route; using Microsoft.Extensions.Configuration; using WebApplication1.Extensions; using Microsoft.Extensions.FileProviders; using Microsoft.AspNetCore.StaticFiles; namespace WebApplication1 { public class Startup { public Startup(IHostingEnvironment env) { IConfigurationBuilder builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true); if (env.IsDevelopment()) { // For more details on using the user secret store see http://go.microsoft.com/fwlink/?LinkID=532709 builder.AddUserSecrets();//project.json -> userSecretsId } builder.AddEnvironmentVariables(); this.Configuration = builder.Build(); } public IConfigurationRoot Configuration { get; private set; } // This method gets called by the runtime. Use this method to add services to the container. // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940 public void ConfigureServices(IServiceCollection services) { services.AddRouting(); services.AddDirectoryBrowser();//浏览所有文件 } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { //loggerFactory.AddConsole(); loggerFactory.AddConsole(this.Configuration.GetSection("Logging")); loggerFactory.AddConsole(minLevel: LogLevel.Information); loggerFactory.AddDebug(); //app.UseRequestIP(); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); //app.UseBrowserLink(); } else { app.UseExceptionHandler("/error"); } app.UseStaticFiles();//使用默认文件夹wwwroot var staticfile = new StaticFileOptions(); staticfile.FileProvider = new PhysicalFileProvider(@"C:");//指定目录 这里指定C盘,也可以是其它目录 //你会发现有些文件打开会404,有些又可以打开。那是因为MIME 没有识别出来。 //我们可以手动设置这些 MIME ,也可以给这些未识别的设置一个默认值。 staticfile.ServeUnknownFileTypes = true; staticfile.DefaultContentType = "application/x-msdownload"; //设置默认 MIME var provider = new FileExtensionContentTypeProvider(); provider.Mappings.Add(".log", "text/plain");//手动设置对应MIME staticfile.ContentTypeProvider = provider; app.UseStaticFiles(staticfile); var dir = new DirectoryBrowserOptions(); dir.FileProvider = new PhysicalFileProvider(@"C:"); app.UseDirectoryBrowser(dir); //对于前面的这么多设置,StaticFiles 提供了一种简便的写法。 app.UseFileServer(new FileServerOptions() { FileProvider = new PhysicalFileProvider(@"C:"), EnableDirectoryBrowsing = true }); //UrlRouting RouteBuilder routeBuilder = new RouteBuilder(app); //index http://localhost:5994/en routeBuilder.DefaultHandler = new IndexPageRouteHandler(this.Configuration, "index"); routeBuilder.MapRoute("index_culture_", "{culture}/", new RouteValueDictionary { { "culture", "en" } }, new RouteValueDictionary { { "culture", @"w{2}" } }); app.UseRouter(routeBuilder.Build()); //category http://localhost:5994/en/fashion/wwww-1111/2 routeBuilder.DefaultHandler = new CategoryPageRouteHandler(this.Configuration, "category"); routeBuilder.MapRoute("category_", "{culture}/fashion/{leimu}/{pageindex}/", new RouteValueDictionary { { "pageindex", "1" }, { "culture", "en" } }, new RouteValueDictionary { { "leimu", "([\w|-]+)(\d+)" }, { "pageindex", "\d+" }, { "culture", @"w{2}" } }); app.UseRouter(routeBuilder.Build()); } } }
4、IndexPageRouteHandler.cs
using System; using System.Diagnostics; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.Configuration; namespace WebApplication1.Route { public class IndexPageRouteHandler : IRouter { private string _name = null; private readonly IConfigurationRoot _configurationRoot; public IndexPageRouteHandler(IConfigurationRoot configurationRoot, string name) { this._configurationRoot = configurationRoot; this._name = name; } public VirtualPathData GetVirtualPath(VirtualPathContext context) { throw new NotImplementedException(); } public async Task RouteAsync(RouteContext context) { if (this._configurationRoot != null) { string connectionString = this._configurationRoot.GetConnectionString("DefaultConnection"); Debug.WriteLine(connectionString); } var routeValues = string.Join(",", context.RouteData.Values); var message = String.Format("{0} Values={1} ", this._name, routeValues); await context.HttpContext.Response.WriteAsync(message); } } }
5、CategoryPageRouteHandler.cs
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.Configuration; using System; using System.Diagnostics; using System.Threading.Tasks; namespace WebApplication1.Route { public class CategoryPageRouteHandler : IRouter { private string _name = null; private readonly IConfigurationRoot _configurationRoot; public CategoryPageRouteHandler(IConfigurationRoot configurationRoot, string name) { this._configurationRoot = configurationRoot; this._name = name; } public VirtualPathData GetVirtualPath(VirtualPathContext context) { throw new NotImplementedException(); } public async Task RouteAsync(RouteContext context) { if (this._configurationRoot != null) { string connectionString = this._configurationRoot.GetConnectionString("DefaultConnection"); Debug.WriteLine(connectionString); } var routeValues = string.Join("", context.RouteData.Values); var message = String.Format("{0} Values={1} ", this._name, routeValues); await context.HttpContext.Response.WriteAsync(message); } } }
6、F5启动调试,
浏览器输入网址:http://localhost:16924/
浏览器输入网址:http://localhost:16924/en/fashion/wwww-1111/2