0、Program.cs
using System.IO; using Microsoft.AspNetCore.Hosting; namespace AspNetCoreUrlRoutingDemoRC2 { 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-rc2-3002702", "type": "platform" }, "Microsoft.AspNetCore.Authentication.Cookies": "1.0.0-rc2-final", "Microsoft.AspNetCore.Diagnostics": "1.0.0-rc2-final", "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0-rc2-final", "Microsoft.AspNetCore.Server.Kestrel": "1.0.0-rc2-final", "Microsoft.AspNetCore.Routing": "1.0.0-rc2-final", "Microsoft.AspNetCore.Routing.Abstractions": "1.0.0-rc2-final", "Microsoft.AspNetCore.Http.Extensions": "1.0.0-rc2-final", "Microsoft.AspNetCore.StaticFiles": "1.0.0-rc2-final", "Microsoft.Extensions.Configuration": "1.0.0-rc2-final", "Microsoft.Extensions.Configuration.Binder": "1.0.0-rc2-final", "Microsoft.Extensions.Configuration.Json": "1.0.0-rc2-final", "Microsoft.Extensions.Configuration.Abstractions": "1.0.0-rc2-final", "Microsoft.Extensions.Configuration.UserSecrets": "1.0.0-rc2-final", "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0-rc2-final", "Microsoft.Extensions.Configuration.FileExtensions": "1.0.0-rc2-final", "Microsoft.Extensions.Logging": "1.0.0-rc2-final", "Microsoft.Extensions.Logging.Console": "1.0.0-rc2-final", "Microsoft.Extensions.Logging.Debug": "1.0.0-rc2-final", "Microsoft.AspNetCore.Identity": "1.0.0-rc2-final", "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0-rc2-final" }, "tools": { "Microsoft.AspNetCore.Server.IISIntegration.Tools": { "version": "1.0.0-preview1-final", "imports": "portable-net45+win8+dnxcore50" } }, "frameworks": { "netcoreapp1.0": { "imports": [ "dotnet5.6", "dnxcore50", "portable-net45+win8" ] } }, "buildOptions": { "emitEntryPoint": true, "preserveCompilationContext": true }, "runtimeOptions": { "gcServer": 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.Extensions.DependencyInjection; using Microsoft.Extensions.Configuration; using Microsoft.AspNetCore.Routing; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Logging; using AspNetCoreUrlRoutingDemoRC2.PageRoute; namespace AspNetCoreUrlRoutingDemoRC2 { 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; } // 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(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { loggerFactory.AddConsole(Configuration.GetSection("Logging")); loggerFactory.AddDebug(); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseBrowserLink(); } else { app.UseExceptionHandler("/error"); } app.UseStaticFiles(); //app.UseIdentity(); RouteBuilder routeBuilder = new RouteBuilder(app); //index 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 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.Threading.Tasks; using Microsoft.Extensions.Configuration; using Microsoft.AspNetCore.Routing; using Microsoft.AspNetCore.Http; using System.Diagnostics; namespace AspNetCoreUrlRoutingDemoRC2.PageRoute { 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 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); } public VirtualPathData GetVirtualPath(VirtualPathContext context) { throw new NotImplementedException(); } } }
5、CategoryPageRouteHandler.cs
using Microsoft.AspNetCore.Routing; using System; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; using System.Diagnostics; namespace AspNetCoreUrlRoutingDemoRC2.PageRoute { 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 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); } public VirtualPathData GetVirtualPath(VirtualPathContext context) { throw new NotImplementedException(); } } }
6、F5启动调试,
浏览器输入网址:http://localhost:16924/
浏览器输入网址:http://localhost:16924/en/fashion/wwww-1111/2
6、VS2015项目结构