转自:
事先写过一篇关于《ASP.NET Core 1.0
静态文件、路由、自定义中间件、身份验证简介》的稿子,首要介绍了ASP.NET
Core中StaticFile、Middleware、CustomizeMiddleware和Asp.NetCore
Identity。不过出于全部的ASP.NET
Core的本子有些老,所以,本次重写二回。使用新型的ASP.NET Core
1.1本子。对于ASP.NET Core 1.1 Preview 1会在事后的篇章中介绍
从前写过一篇有关《ASP.NET Core 1.0
静态文件、路由、自定义中间件、身份验证简介》的稿子,主要介绍了ASP.NET
Core中StaticFile、Middleware、CustomizeMiddleware和Asp.NetCore
Identity。然则由于具备的ASP.NET
Core的本子有些老,所以,本次重写3次。使用新型的ASP.NET Core
1.1本子。对于ASP.NET Core 1.1 Preview 1会在后来的稿子中介绍
那篇小说将介绍ASP.NET Core中利用
开源项目 Payment,达成连通支付宝-电脑网页支付接口及一块跳转及异步通告效能。
付出条件:Win 10 x6④ 、VS2017 15.6.肆 、.NET Core SDK 2.1.10① 、.NET Core
Runtime 2.0.6
中间件是段代码用于拍卖请求和响应,平常几其中间件链接起来形成管道,由各当中间件自身来控制是或不是要调用下1当中间件。
2017-10-10-21-47-00
成就此模块须要以下内容:
成功此模块须要以下内容:
1.新建”ASP.NET Core Web 应用程序”项目,作者将它取名为AlipaySample.
举四个演示来演示中间件的推行进度(分别有多个中间件:日志记录、权限验证和路由):当呼吁进入应用程序时,执行实施日志记录的中间件,它记录请求属性并调用链中的下两在那之中间件权限验证,假诺权力验证通过则将控制权传递给下五当中间件,不通过则设置401
HTTP代码并重临响应,响应传递给日志中间件举办重临。
2017-10-10-22-47-32
此模块包罗以下演习:
推断完成此模块的年华:60分钟
注意:第1回开发银行Visual Studio时,必须挑选八个预订义的安装集合。
每种预订义集合目的在于协作特定的成本样式,并规定窗口布局,编辑器行为,智能感知代码片段和对话框选项。
本模块中的进程描述了在使用“常规开发设置”集合时,在Visual
Studio中完结给定职务所需的操作。
假使为开发环境选拔不一致的安装集合,那么您应该考虑的步骤恐怕会迥然分化。
此模块包涵以下练习:
推测实现此模块的岁月:60分钟
注意:第3遍开发银行Visual Studio时,必须接纳三个预约义的安装集合。
每一个预约义集合目的在于协作特定的开销样式,并分明窗口布局,编辑器行为,智能感知代码片段和对话框选项。
本模块中的进度描述了在应用“常规开发设置”集合时,在Visual
Studio中成功给定职责所需的操作。
即使为花费条件选拔差别的安装集合,那么你应该考虑的步骤只怕会有所区别。
中间件配置主假设用Run
、Map
和Use
情势举行安插,三者的不等参见上篇ASP.NET
Core
运维规律分析;简单的中间件能够一贯动用匿名形式就足以消除,如下代码:
app.Run(async (context,next) =>
{
await context.Response.WriteAsync("environment " + env);
await next();
});
如果想引用中间件,就须求单独封装到二个类中进行调用。
静态文件(包涵HTML文件,CSS文件,图像文件和JavaScript文件)是应用程序将平昔提要求客户端的资金。
在本演练中,您将布置项目以提供静态文件。
静态文件(包罗HTML文件,CSS文件,图像文件和JavaScript文件)是应用程序将一向提须求客户端的资本。
在本练习中,您将安插项目以提供静态文件。
在实质上项目中,中间件往往要求调用其余对象的情势。所以要创立对象之间的借助,由于ASP.NET
Core 内置的正视性注入系统,写程序的时候能够创造更优雅的代码。
首先供给要在IOC容器中注册类,正是Startup
类中的ConfigureServices
办法中开始展览注册,ConfigureServices
方法会在Configure
艺术在此之前被实践。以便在用中间件时有所重视都准备好了。
近年来有四个Greeter类:
public class Greeter : IGreeter
{
public string Greet()
{
return "Hello from Greeter!";
}
}
public interface IGreeter
{
string Greet();
}
先是步在ConfigureServices
格局中展开挂号
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IGreeter, Greeter>();
}
小编那里运用的是AddTransient举行登记,该办法在历次请求时创立该类的新实例。可以接纳任何情势:AddSingleton,AddScoped或简捷的Add(全体在暗中前使用)。整个DI系统在合法文书档案中全数描述。
在登记了依靠项后,就足以接纳它们了。IApplicationBuilder
实例允许在Configure
艺术中有一个RequestServices
脾气用于获取Greeter
实例。由于已经登记了那一个IGreeter
接口,所以不供给将中间件与现实的Greeter
兑现相结合。
app.Use(async (ctx, next) =>
{
IGreeter greeter = ctx.RequestServices.GetService<IGreeter>();
await ctx.Response.WriteAsync(greeter.Greet());
await next();
});
如果Greeter
类有贰个参数化的构造函数,它的依赖性关系也亟须在内部注册ConfigureServices
。
中间件能够很不难化解正视关系。能够向中间件构造函数添加其余参数:
public class MyMiddleware
{
private readonly RequestDelegate _next;
private readonly IGreeter _greeter;
public MyMiddleware(RequestDelegate next, IGreeter greeter)
{
_next = next;
greeter = greeter;
}
public async Task Invoke(HttpContext context)
{
await context.Response.WriteAsync(_greeter.Greet());
await _next(context);
}
}
要么,能够将此信赖关系添加到Invoke方法中:
public async Task Invoke(HttpContext context, IGreeter greeter)
{
await context.Response.WriteAsync(greeter.Greet());
await _next(context);
}
只要DI系统通晓那一个参数的档次,则在类被实例化时,它们将被电动分析。很简单!
为了提供静态文件,您必须布置中间件以向管道添加静态文件。
这是通过从Startup.Configure方法调用UseStaticFiles扩张方法来促成的。
在此职分中,您将创建三个空的ASP.NET Core
1.0项目并将其配备为提供静态文件。
打开Visual Studio 2015并精选文件|
新项目…开始2个新的解决方案。
在“新建项目”对话框中,选取Visual C#|下的ASP.NET
Web应用程序 Web选项卡,并有限补助采纳.NET Framework 4.6。
将项目命名为Asp.NET_Core_TEST,采纳1个岗位,然后单击鲜明。
始建新的ASP.NET Web应用程序项目
运用ASP.NET Core航空模型板创造新类型
4.
将Microsoft.AspNet.StaticFiles包添加为project.json的依靠项,可以在dependencies节点下添加。
"dependencies": {
"Microsoft.AspNetCore.Diagnostics": "1.1.0",
"Microsoft.AspNetCore.Mvc": "1.1.0",
"Microsoft.AspNetCore.Server.IISIntegration": "1.1.0",
"Microsoft.AspNetCore.Server.Kestrel": "1.1.0",
“Microsoft.AspNetCore.StaticFiles”: “1.1.0”
,
"Microsoft.Extensions.Logging.Console": "1.1.0",
"Microsoft.NETCore.App": "1.1.0"
},
当然,也能够通过Nuget添加相关的依赖性包
5.
打开Startup.cs文件,并在Hello中间件以前的Configure主意中添加UseStaticFiles措施调用。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
//添加静态文件支持管道
app.UseStaticFiles();
//添加静态文件和默认文件的支持
//可代替app.UseStaticFiles();
app.UseFileServer();
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});
}
6.
在wwwroot文本夹中成立1个名为index.html的文书,当中蕴蓄以下内容。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Hello static world!</title>
</head>
<body>
<h1>Hello from ASP.NET Core!</h1>
</body>
</html>
为了提供静态文件,您必须安插中间件以向管道添加静态文件。
那是因而从Startup.Configure方法调用UseStaticFiles扩充方法来落到实处的。
在此任务中,您将创立二个空的ASP.NET Core
1.0体系并将其配备为提供静态文件。
打开Visual Studio 2015并选用文件|
新项目…开首2个新的杀鸡取卵方案。
在“新建项目”对话框中,选择Visual C#|下的ASP.NET Web应用程序
Web选项卡,并保管选用.NET Framework 4.6。
将品种命名为Asp.NET_Core_TEST,选用贰个地方,然后单击分明。
创制新的ASP.NET Web应用程序项目
选择ASP.NET Core航空模型板创设新类型
4.
将Microsoft.AspNet.StaticFilesCore中间件实现分布式,自定义中间件。包添加为project.json的借助项,能够在dependencies节点下添加。
"dependencies": {
"Microsoft.AspNetCore.Diagnostics": "1.1.0",
"Microsoft.AspNetCore.Mvc": "1.1.0",
"Microsoft.AspNetCore.Server.IISIntegration": "1.1.0",
"Microsoft.AspNetCore.Server.Kestrel": "1.1.0",
“Microsoft.AspNetCore.StaticFiles”: “1.1.0”
,
"Microsoft.Extensions.Logging.Console": "1.1.0",
"Microsoft.NETCore.App": "1.1.0"
},
当然,也足以透过Nuget添加相关的借助包
5.
打开Startup.cs文本,并在Hello中间件从前的Configure办法中添加UseStaticFiles主意调用。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
//添加静态文件支持管道
app.UseStaticFiles();
//添加静态文件和默认文件的支持
//可代替app.UseStaticFiles();
app.UseFileServer();
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});
}
6.
在wwwroot文件夹中开创二个名为index.html的文件,当中包括以下内容。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Hello static world!</title>
</head>
<body>
<h1>Hello from ASP.NET Core!</h1>
</body>
</html>
为了让您的Web应用程序提供暗许页面,而用户不用完全限定ULacrosseI,就足以选拔UseDefaultFiles恢宏方法。
此方法是实际不提供文件的U帕杰罗L重写程序。
除了UseStaticFiles和UseDefaultFiles壮大方法之外,还有一个措施
– UseFileServer –
组合这二种格局的机能以及UseDirectoryBrowser推而广之方法。
在此职责中,您将应用UseFileServer启用服务静态和默许文件。
1.
打开Startup.cs文件,将Configure方法中的静态文件中间件从app.UseStaticFiles()更改为app.UseFileServer()。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
//添加静态文件支持管道
app.UseStaticFiles();
//添加静态文件和默认文件的支持
//可代替app.UseStaticFiles();
app.UseFileServer();
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});
}
为了让您的Web应用程序提供默许页面,而用户不用完全限定UCR-VI,就能够应用UseDefaultFiles扩充方法。
此方法是事实上不提供文件的U安德拉L重写程序。
除了UseStaticFiles和UseDefaultFiles推而广之方法之外,还有二个格局 –
UseFileServer –
组合那两种办法的效果以及UseDirectoryBrowser增添方法。
在此任务中,您将使用UseFileServer启用服务静态和默许文件。
1.
打开Startup.cs文件,将Configure方法中的静态文件中间件从app.UseStaticFiles()更改为app.UseFileServer()。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
//添加静态文件支持管道
app.UseStaticFiles();
//添加静态文件和默认文件的支持
//可代替app.UseStaticFiles();
app.UseFileServer();
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});
}
HTTP是一个无状态协议,Web服务器将每3个呼吁都视为独立请求。并且不保留此前请求中用户的值。
Session 状态是ASP.NET
Core提供的贰个功用,它能够在用户通应用访问网络服务器的时候保存和存款和储蓄用户数据。由服务器上的字典和散列表组成,Session状态通过浏览器的请求中收获,Session的数据保存到缓存中。
ASP.NET Core通过包蕴Session
ID的库克ie来保证会话状态,每一种请求都会带走此Session ID。
在Microsoft.AspNetCore.Session
包中提供的中间件用来保管Session状态。要启用Session中间件,Startup
类里面需求做以下几个操作:
IDistributedCache
接口的劳务来启用内存缓存,AddSession
回调,由于AddSession
是在Microsoft.AspNetCore.Session
包内达成的,所以必须在Nuget中添加Microsoft.AspNetCore.Session
包UseSession
回调实际示例代码如下:
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using System;
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
// 添加一个内存缓存
services.AddDistributedMemoryCache();
services.AddSession(options =>
{
// 设置10秒钟Session过期来测试
options.IdleTimeout = TimeSpan.FromSeconds(10);
options.Cookie.HttpOnly = true;
});
}
public void Configure(IApplicationBuilder app)
{
app.UseSession();
app.UseMvcWithDefaultRoute();
}
}
地点代码中IdleTimeout
属性用来规定用户多长期没有操作时抛弃Session。此属性和Cookie超时毫不相关,通过Session中间件的每种请求都会重置超时时间。
路由是炫耀四处理程序的U景逸SUVL形式。 处理程序能够是大体文件,例如Web
Forms应用程序中的.aspx文件。
处理程序也得以是拍卖请求的类,例如MVC应用程序中的控制器。
ASP.NET路由使您能够采纳不必映射到网站中一定文件的U宝马X3L。
由于网址不必映射到文件,因而你能够应用描述用户操作的网址,由此用户更易于领悟。
在本演习中,您将掌握什么在应用程序中布局路由。
路由是炫耀各处理程序的U哈弗L情势。 处理程序能够是大体文件,例如Web
Forms应用程序中的.aspx文件。
处理程序也能够是处理请求的类,例如MVC应用程序中的控制器。
ASP.NET路由使你可以使用不必映射到网站中一定文件的U汉兰达L。
由于网址不必映射到文件,由此你能够利用描述用户操作的网址,由此用户更便于精晓。
在本演练中,您将精通哪些在应用程序中配置路由。
实现分布式Session方法官方提供有Redis、Sql Server等。不过Sql
Server作用对于那种以key/value获取值的方法远远不比Redis成效高,所以那里小编选择Redis来作示例达成分布式Session。
准备Redis
鉴于当下Redis还不帮助windows,所以大家在设置Redis的时候准备一台linux操作系统,我那里的类别是ubuntu
16.04;下载及安装情势能够参照官方示例。
设置成功之后运营Redis 服务,若是见到以下新闻,就表示Redis运维成功:
2017-10-30-20-33-47
连锁布署
首先须求用Nuget
安装包Microsoft.Extensions.Caching.Redis
,安装成功今后就足以在app.csproj
文件中能够看出。
2017-10-30-20-12-20
在Configure
方法中添加app.UseSession()
;然后再ConfigureServices
添加Redis服务
public void ConfigureServices(IServiceCollection services){
services.AddDistributedRedisCache(options=>{
options.Configuration="127.0.0.1"; //多个redis服务器:{RedisIP}:{Redis端口},{RedisIP}:{Redis端口}
options.InstanceName="sampleInstance";
});
services.AddMvc();
services.AddSession();
}
以上代码中小编只用三个Redis服务器来作测试,实际项目中须要四个Redis服务器;配置方式如:options.Configuration="地址1:端口,地址2:端口";
,那里作者并不曾给端口而是用的默许端口6379
总体代码
Startup.cs
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Caching.Redis;
using Microsoft.Extensions.Caching.Distributed;
namespace app{
public class Startup{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services){
services.AddDistributedRedisCache(options =>{
options.Configuration = "127.0.0.1";
options.InstanceName = "sampleInstance";
});
services.AddMvc();
services.AddSession();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env){
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseSession();
app.UseStaticFiles();
app.UseMvc(routes =>{
routes.MapRoute(name: "default",template: "{controller=Home}/{action=Index}/{id?}");
});
}
}
}
HomeControler.cs
public class HomeController : Controller
{
public IActionResult Index()
{
HttpContext.Session.Set("apptest",Encoding.UTF8.GetBytes("apptestvalue"));
return View();
}
public IActionResult ShowRedis()
{
byte[] temp;
if(HttpContext.Session.TryGetValue("apptest",out temp))
{
ViewData["Redis"]=Encoding.UTF8.GetString(temp);
}
return View();
}
}
Index页面只做一件事给Session设置值:”apptestvalue”,ShowRedis页面展现Session值。
ShowRedis.cshtml
Redis Session Value:ViewData["Redis"]
演示结果
近期开头运转页面,首先直接进去到ShowRedis页面,Session值展现为空
2017-10-31-06-47-24
当点击SetSessionValue
从此,再一次归来ShowRedis
页面,Session就值展现出来了
2017-10-31-23-56-58
看到apptestvalue
意味着Session值已经存到Redis里面,如何注脚apptestvalue
值是从Redis里面取到呢?接下去就注明给大家看。
ASP.NET
MVC为您提供了多个强有力的,基于格局的格局来营造动态网站,使清晰分离的题材,并让您完全控制标记的雅观,敏捷开发。
ASP.NET MVC包含不少职能,创造使用最新的Web标准的复杂应用程序。
在此职分中,您将配备项目以应用ASP.NET MVC并计划示例路由。
1.
打开project.json文件并将Microsoft.AspNet.Mvc添加到依赖关系部分。并添加runtimes节点,保险正常运维
"dependencies": {
"Microsoft.AspNetCore.Diagnostics": "1.1.0",
“Microsoft.AspNetCore.Mvc”: “1.1.0”
,
"Microsoft.AspNetCore.Server.IISIntegration": "1.1.0",
"Microsoft.AspNetCore.Server.Kestrel": "1.1.0",
"Microsoft.AspNetCore.StaticFiles": "1.1.0",
"Microsoft.Extensions.Logging.Console": "1.1.0",
"Microsoft.NETCore.App": "1.1.0"
},
//添加运行环境的系统变量
//当前系统环境为win10-x64
//对于.NETCore包后报错,需要根据系统环境进行修改
//可选环境包括:win10-x64, win81-x64, win8-x64, win7-x64
"runtimes": {
"win10-x64": {}
},
2.
在解决方案财富管理器中,右键单击Asp.NET_Core_TEST项目,然后选拔加上|
新文件夹,并将文件夹命名为Controllers。
右键单击新文件夹,然后选择添加|
新项目…,慎选MVC控制器类,命名文件HomeController.cs并单击添加。
使用以下代码段替换文件的内容。
namespace Asp.NET_Core_TEST.Controllers
{
public class HomeController : Controller
{
// GET: /<controller>/
[HttpGet]
public string Index()
{
return "Hello form MVC HomeController";
}
}
}
5.
现在,打开Startup.cs文本,将MVC服务和中间件添加到配置中,添加services.AddMvc()并使用UseMvc办法替换Configure主意中的app.Run艺术调用,如下边包车型大巴代码片段所示。
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
}
// 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();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
//添加静态文件支持管道
app.UseStaticFiles();
//添加静态文件和默认文件的支持
//可代替app.UseStaticFiles();
app.UseFileServer();
//配置AspNetCore.MVC的路由
app.UseMvc(routes =>
{
routes.MapRoute(
name:
“default”, template: “{controller=Home}/{action=Index}/{id?}”
);
});
//该管道可代替上面的默认路由,如果需要其余配置,可以通过上面的方式手工编写
app.UseMvcWithDefaultRoute();
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});
}
注意:ASP.NET Core
MVC还包涵一个有利的新实用程序方法,app.UseMvcWithDefaultRoute,因而你不用记住模板字符串。
ASP.NET
MVC为您提供了三个无敌的,基于情势的不二法门来营造动态网站,使清晰分离的题材,并让您完全控制标记的欢娱,敏捷开发。
ASP.NET MVC包蕴过多功效,创立使用最新的Web标准的复杂性应用程序。
在此职务中,您将安顿项目以应用ASP.NET MVC并配备示例路由。
1.
打开project.json文件并将Microsoft.AspNet.Mvc添加到依傍关系部分。并添加runtimes节点,保障健康运行
"dependencies": {
"Microsoft.AspNetCore.Diagnostics": "1.1.0",
“Microsoft.AspNetCore.Mvc”: “1.1.0”
,
"Microsoft.AspNetCore.Server.IISIntegration": "1.1.0",
"Microsoft.AspNetCore.Server.Kestrel": "1.1.0",
"Microsoft.AspNetCore.StaticFiles": "1.1.0",
"Microsoft.Extensions.Logging.Console": "1.1.0",
"Microsoft.NETCore.App": "1.1.0"
},
//添加运行环境的系统变量
//当前系统环境为win10-x64
//对于.NETCore包后报错,需要根据系统环境进行修改
//可选环境包括:win10-x64, win81-x64, win8-x64, win7-x64
"runtimes": {
"win10-x64": {}
},
2.
在缓解方案能源管理器中,右键单击Asp.NET_Core_TEST类型,然后选取增加|
新文件夹,并将文件夹命名为Controllers。
右键单击新文件夹,然后采用添加|
新项目…,慎选MVC控制器类,命名文件HomeController.cs并单击添加。
行使以下代码段替换文件的始末。
namespace Asp.NET_Core_TEST.Controllers
{
public class HomeController : Controller
{
// GET: /<controller>/
[HttpGet]
public string Index()
{
return "Hello form MVC HomeController";
}
}
}
5.
现在,打开Startup.cs文件,将MVC服务和中间件添加到配置中,添加services.AddMvc()并使用UseMvc方法替换Configure主意中的app.Run艺术调用,如上边包车型地铁代码片段所示。
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
}
// 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();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
//添加静态文件支持管道
app.UseStaticFiles();
//添加静态文件和默认文件的支持
//可代替app.UseStaticFiles();
app.UseFileServer();
//配置AspNetCore.MVC的路由
app.UseMvc(routes =>
{
routes.MapRoute(
name:
“default”,
template: “{controller=Home}/{action=Index}/{id?}”
);
});
//该管道可代替上面的默认路由,如果需要其余配置,可以通过上面的方式手工编写
app.UseMvcWithDefaultRoute();
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});
}
瞩目:ASP.NET Core
MVC还包罗一个利于的新实用程序方法,app.UseMvcWithDefaultRoute,因而你不要记住模板字符串。
前方早已将Session保存到Redis中,不过大家不晓得这一个值是或不是是真的保存到Redis里面去了照旧在档次内部存款和储蓄器中;所以那里就完结在多少个不的应用程序(或两台不一样的机械)中共享Session,也正是兑现分布式Session,分布式即表示了不一致的机械分化的应用程序,但频仍有上边包车型大巴一种步履维艰的动静,就到底各类HTTP请求时都指导了扳平的cookie值。
2017-10-30-20-35-19
造成这一个的难题的来由是各样机器上边的ASP.NET
Core的应用程序的密钥是区别等的,所以并未主意得到前三个应用程序保存的Session数据;为了缓解这几个题材,.NET
Core团队为提供了Microsoft.AspNetCore.DataProtection.AzureStorage
和Microsoft.AspNetCore.DataProtection.Redis
包将密钥保存到Azure或Redis中。那里选用将密钥保存到Redis。
共享密钥
利用Microsoft.AspNetCore.DataProtection.Redis
包提供的PersistKeysToRedis
重载方法将密钥保存到Redis里面去。所以那边须要在ConfigureServices
措施中添AddDataProtection()
var redis = ConnectionMultiplexer.Connect("127.0.0.1:6379");
services.AddDataProtection()
.SetApplicationName("session_application_name")
.PersistKeysToRedis(redis, "DataProtection-Keys");
下边演示怎么着贯彻分布式Session
布局步骤
Microsoft.AspNetCore.DataProtection.Redis
和StackExchange.Redis.StrongName
包2017-10-31-23-41-37
2017-10-31-23-54-19
完整代码
Startup.cs
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Caching.Redis;
using Microsoft.Extensions.Caching.Distributed;
namespace app1{
public class Startup{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services){
var redis = ConnectionMultiplexer.Connect("127.0.0.1:6379");
services.AddDataProtection()
.SetApplicationName("session_application_name")
.PersistKeysToRedis(redis, "DataProtection-Keys");
services.AddDistributedRedisCache(options =>{
options.Configuration = "127.0.0.1";
options.InstanceName = "sampleInstance";
});
services.AddMvc();
services.AddSession();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env){
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseSession();
app.UseStaticFiles();
app.UseMvc(routes =>{
routes.MapRoute(name: "default",template: "{controller=Home}/{action=Index}/{id?}");
});
}
}
}
HomeControler.cs
public class HomeController : Controller
{
public IActionResult Index()
{
HttpContext.Session.Set("app1test",Encoding.UTF8.GetBytes("app1testvalue"));
return View();
}
public IActionResult ShowRedis()
{
byte[] temp;
if(HttpContext.Session.TryGetValue("app1test",out temp))
{
ViewData["Redis"]=Encoding.UTF8.GetString(temp);
}
return View();
}
}
ShowRedis.cshtml
Redis Session Value:ViewData["Redis"]
Startup.cs
计划同app1配置一样。
HomeControler.cs
public class HomeController : Controller
{
public IActionResult Index()
{
byte[] temp;
if(HttpContext.Session.TryGetValue("app1test",out temp))
{
ViewData["Redis"]=Encoding.UTF8.GetString(temp);
}
return View();
}
}
Index.cshtml
ViewData["Redis"]
运作效果
第3回打开进去ShowRedis页面,Session值为空
2017-10-31-06-47-24
点击SetSessionValue
以后,再回到ShowRedis页面:
2017-11-01-00-04-13
2017-11-01-00-00-30
以上是用Redis实现分布式Session示例。
能够统一到HTTP请求管道中的小应用程序组件统称为中间件。 ASP.NET Core
1.0有所对中间件的融会补助,它们在应用程序运营时期在应用程序的Configure办法中连连。
在本演习中,您将创建二个依据查询字符串值设置当前文化的高级中学级件类。
留神:大家在本练习中使用本地化相关中间件作为示范场景,但在当先54%应用程序中,您将选拔ASP.NET
Core的嵌入辅助本地化扶助。
能够统一到HTTP请求管道中的小应用程序组件统称为中间件。 ASP.NET Core
1.0存有对中间件的合龙支持,它们在应用程序运维时期在应用程序的Configure措施中连连。
在本演练中,您将开创三个依照查询字符串值设置当前文化的中档件类。
注意:大家在本演习中使用本地化相关中间件作为示范场景,但在半数以上应用程序中,您将动用ASP.NET
Core的嵌入援救本地化补助。
代码:
本节上课了中间件的周转规律及布署过程,中间件之间对象注重关系的布局和平日项目中常用到Session的陈设难点。并在实际上代码呈现了如何利用中间件完毕分布式Session。
转发评释出处
http://www.xdpie.com/2017/11/02/asp-net-core-distributed-session/
中间件是组装到应用程序管道中以拍卖请求和响应的组件。
每一个组件能够挑选是或不是将呼吁传递到管道中的下三个组件,并且能够在管道中的下3个零部件在此之前和现在执行有个别操作。
请求代理用于营造此恳请管道,然后用于拍卖对应用程序的每一个HTTP请求。
呼吁代理使用传递到运行类中的配置情势的IApplicationBuilder类型上的Run(运行),Map(映射)和Use(使用)扩大方法进行配备。
单个请求委托能够看做匿名格局在线内定,也足以在可选拔类中定义。
那么些可采取的类是中间件或中间件组件。
请求管道中的每在那之中间件组件负责调用链中的下3个零部件,恐怕一旦方便,接纳将链短路。
在此职分中,您将开创内联合中学间件。
1.
在事先的Asp.NET_Core_TEST消除方案基础上,为src文件夹添加3个新的类型,选择.NET
Core中的Class Library(.NET
Core),并取名为MiddlewareApp,单击鲜明。
2.
打开Asp.NET_Core_Test下的Startup.cs文本,并采纳以下代码片段替换Configure主意的内容,该代码片段创设在静态文件管道代理以前运营的内联合中学间件,代理为查询字符串中的当前呼吁设置文化。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.Use((context, next)
=>
{
var cultureQuery =
context.Request.Query[“culture”]; if (!string.IsNullOrWhiteSpace(cultureQuery))
{var culture = new CultureInfo(cultureQuery);
CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture; } // Call the next
delegate/middleware in the pipeline returnnext(); });
app.Run(async (context) =>
{
await context.Response.WriteAsync($”Hello
{CultureInfo.CurrentCulture.DisplayName}”
);
});
//添加静态文件支持管道
app.UseStaticFiles();
//添加静态文件和默认文件的支持
//可代替app.UseStaticFiles();
app.UseFileServer();
//配置AspNetCore.MVC的路由
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
//该管道可代替上面的默认路由,如果需要其余配置,可以通过上面的方式手工编写
app.UseMvcWithDefaultRoute();
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});
}
中间件是组装到应用程序管道中以处理请求和响应的组件。
各个组件能够选用是不是将呼吁传递到管道中的下二个零件,并且能够在管道中的下3个组件在此之前和后来执行有个别操作。
请求代理用于创设此恳请管道,然后用于拍卖对应用程序的各样HTTP请求。
呼吁代理使用传递到起步类中的配置方式的IApplicationBuilder类型上的Run(运行),Map(映射)和Use(使用)扩张方法举办铺排。
单个请求委托能够看作匿名方式在线钦点,也得以在可选择类中定义。
那么些可选拔的类是中间件或中间件组件。
请求管道中的每其中间件组件负责调用链中的下3个组件,也许一旦适度,选取将链短路。
在此职责中,您将创造内联合中学间件。
1.
在前头的Asp.NET_Core_TEST缓解方案基础上,为src文件夹添加1个新的项目,选择.NET
Core中的Class Library(.NET
Core),并取名为MiddlewareApp,单击显著。
2.
打开Asp.NET_Core_Test下的Startup.cs文本,并选用以下代码片段替换Configure艺术的情节,该代码片段创设在静态文件管道代理在此以前运转的内联合中学间件,代理为查询字符串中的当前央求设置文化。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.Use((context, next)
=>
{
var cultureQuery =
context.Request.Query[“culture”];
if (!string.IsNullOrWhiteSpace(cultureQuery)) {
var culture = new
CultureInfo(cultureQuery); CultureInfo.CurrentCulture
= culture; CultureInfo.CurrentUICulture
= culture; } // Call the
next delegate/middleware in the pipeline return
next(); }); app.Run(async
(context) =>
{
await context.Response.WriteAsync($”Hello
{CultureInfo.CurrentCulture.DisplayName}”
);
});
//添加静态文件支持管道
app.UseStaticFiles();
//添加静态文件和默认文件的支持
//可代替app.UseStaticFiles();
app.UseFileServer();
//配置AspNetCore.MVC的路由
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
//该管道可代替上面的默认路由,如果需要其余配置,可以通过上面的方式手工编写
app.UseMvcWithDefaultRoute();
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});
}
在此职分中,您将中间件移动到一个独立的文本。
2.
添加五个构造函数,它接受两个RequestDelegate参数并运用以下代码段将其分配给1个民用字段。
在急需时继续分析丢失的using语句。
RequestCultureMiddleware.cs
public class RequestCultureMiddleware
{
private readonly RequestDelegate next;
public RequestCultureMiddleware(RequestDelegate next)
{
this.next = next;
}
}
RequestCultureMiddleware.cs
namespace MiddlewareApp
{
public class RequestCultureMiddleware
{
private readonly RequestDelegate next;
public RequestCultureMiddleware(RequestDelegate next)
{
this.next = next;
}
public Task Invoke(HttpContext context)
{
var cultureQuery = context.Request.Query["culture"];
if (!string.IsNullOrWhiteSpace(cultureQuery))
{
var culture = new CultureInfo(cultureQuery);
CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture;
}
// 调用管道中的下一个代理/中间件
return this.next(context);
}
}
}
4.
在文书的底层(也可独自出来),添加叁个类,通过IApplicationBuilder上的壮大方法公开中间件。
RequestCultureMiddleware.cs的文本尾部
public static class RequestCultureMiddlewareExtensions
{
public static IApplicationBuilder UseRequestCulture(this IApplicationBuilder builder)
{
return builder.UseMiddleware<RequestCultureMiddleware>();
}
}
5.
赶回程序集Asp.NET_Core_TEST中,添加MiddlewareApp的Core类库引用,在Startup.cs文件中,使用对app.UseRequestCulture()措施的调用替换内联合中学间件委托,以将新的中间件类添加到HTTP管道。
实现后,您的Configure方法应如下所示:
Startup.cs的Configure方法
public void Configure(IApplicationBuilder app)
{
app.UseIISPlatformHandler();
app.UseRequestCulture();
app.Run(async (context) =>
{
await context.Response.WriteAsync($"Hello {CultureInfo.CurrentCulture.DisplayName}");
});
}
在此使命中,您将中间件移动到2个独自的文书。
2.
添加一个构造函数,它承受1个RequestDelegate参数并采用以下代码段将其分配给一个私有字段。
在急需时继续分析丢失的using语句。
RequestCultureMiddleware.cs
public class RequestCultureMiddleware
{
private readonly RequestDelegate next;
public RequestCultureMiddleware(RequestDelegate next)
{
this.next = next;
}
}
RequestCultureMiddleware.cs
namespace MiddlewareApp
{
public class RequestCultureMiddleware
{
private readonly RequestDelegate next;
public RequestCultureMiddleware(RequestDelegate next)
{
this.next = next;
}
public Task Invoke(HttpContext context)
{
var cultureQuery = context.Request.Query["culture"];
if (!string.IsNullOrWhiteSpace(cultureQuery))
{
var culture = new CultureInfo(cultureQuery);
CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture;
}
// 调用管道中的下一个代理/中间件
return this.next(context);
}
}
}
4.
在文件的底部(也可单独出来),添加一个类,通过IApplicationBuilder上的扩大方法公开中间件。
RequestCultureMiddleware.cs的文书底部
public static class RequestCultureMiddlewareExtensions
{
public static IApplicationBuilder UseRequestCulture(this IApplicationBuilder builder)
{
return builder.UseMiddleware<RequestCultureMiddleware>();
}
}
5.
回来程序集Asp.NET_Core_TEST中,添加MiddlewareApp的Core类库引用,在Startup.cs文件中,使用对app.UseRequestCulture()措施的调用替换内联合中学间件委托,以将新的中间件类添加到HTTP管道。
达成后,您的Configure办法应如下所示:
Startup.cs的Configure方法
public void Configure(IApplicationBuilder app)
{
app.UseIISPlatformHandler();
app.UseRequestCulture();
app.Run(async (context) =>
{
await context.Response.WriteAsync($"Hello {CultureInfo.CurrentCulture.DisplayName}");
});
}
在此职责中,您将履新RequestCultureMiddleware落到实处以补助将暗中认可文化设置为配置值。
2.
在新类中,将全数CultureInfo的名为DefaultCulture的品质添加为品种,解析丢失的依靠关系。
public class RequestCultureOptions
{
public CultureInfo DefaultCulture { get; set; }
}
3.
打开RequestCultureMiddleware.cs文件,并更新RequestCultureMiddleware构造函数以接受RequestCultureOptions参数,如以下代码段所示。
public class RequestCultureMiddleware
{
private readonly RequestDelegate next;
private readonly RequestCultureOptions options;
public RequestCultureMiddleware(RequestDelegate next, RequestCultureOptions options)
{
this.next = next;
this.options = options;
}
//...
}
4.
假使在查询字符串中未钦赐任何内容,请更新中间件的Invoke方法以应用采纳中的DefaultCulture天性,如以下代码段所示。
public Task Invoke(HttpContext context)
{
CultureInfo requestCulture = null;
var cultureQuery = context.Request.Query["culture"];
if (!string.IsNullOrWhiteSpace(cultureQuery))
{
requestCulture = new CultureInfo(cultureQuery);
}
else
{
requestCulture = this.options.DefaultCulture;
}
if (requestCulture != null)
{
#if !DNXCORE50
Thread.CurrentThread.CurrentCulture = requestCulture;
Thread.CurrentThread.CurrentUICulture = requestCulture;
#else
CultureInfo.CurrentCulture = requestCulture;
CultureInfo.CurrentUICulture = requestCulture;
#endif
}
return this.next(context);
}
5.
在一如既往文件中,使用以下代码片段替换RequestCultureMiddlewareExtensions类完成,该代码片段向利用RequestCultureOptions的UseRequestCulture艺术添加了贰个重载,并将它们传递到UseMiddleware
<RequestCultureMiddleware>调用中。
public static class RequestCultureMiddlewareExtensions
{
public static IApplicationBuilder UseRequestCulture(this IApplicationBuilder builder)
{
return builder.UseMiddleware<RequestCultureMiddleware>();
}
public static IApplicationBuilder UseRequestCulture(this IApplicationBuilder builder, RequestCultureOptions options)
{
return builder.UseMiddleware<RequestCultureMiddleware>(options);
}
}
6.
打开Startup.cs文本,并将配置格局中的后备文化设置为一些私下认可值,例如。
“zh-cn”。
app.UseRequestCulture(new RequestCultureOptions
{
DefaultCulture = new CultureInfo("zh-cn")
});
在此职责中,您将履新RequestCultureMiddleware落到实处以支撑将私下认可文化设置为配置值。
2.
在新类中,将具有CultureInfo的名为DefaultCulture的品质添加为项目,解析丢失的信赖性关系。
public class RequestCultureOptions
{
public CultureInfo DefaultCulture { get; set; }
}
3.
打开RequestCultureMiddleware.cs文件,并更新RequestCultureMiddleware构造函数以接受RequestCultureOptions参数,如以下代码段所示。
public class RequestCultureMiddleware
{
private readonly RequestDelegate next;
private readonly RequestCultureOptions options;
public RequestCultureMiddleware(RequestDelegate next, RequestCultureOptions options)
{
this.next = next;
this.options = options;
}
//...
}
4.
一旦在查询字符串中未钦定任何内容,请更新中间件的Invoke措施以使用选取中的DefaultCulture质量,如以下代码段所示。
public Task Invoke(HttpContext context)
{
CultureInfo requestCulture = null;
var cultureQuery = context.Request.Query["culture"];
if (!string.IsNullOrWhiteSpace(cultureQuery))
{
requestCulture = new CultureInfo(cultureQuery);
}
else
{
requestCulture = this.options.DefaultCulture;
}
if (requestCulture != null)
{
#if !DNXCORE50
Thread.CurrentThread.CurrentCulture = requestCulture;
Thread.CurrentThread.CurrentUICulture = requestCulture;
#else
CultureInfo.CurrentCulture = requestCulture;
CultureInfo.CurrentUICulture = requestCulture;
#endif
}
return this.next(context);
}
5.
在同样文件中,使用以下代码片段替换RequestCultureMiddlewareExtensions类实现,该代码片段向利用RequestCultureOptions的UseRequestCulture方法添加了壹个重载,并将它们传递到UseMiddleware
<RequestCultureMiddleware>调用中。
public static class RequestCultureMiddlewareExtensions
{
public static IApplicationBuilder UseRequestCulture(this IApplicationBuilder builder)
{
return builder.UseMiddleware<RequestCultureMiddleware>();
}
public static IApplicationBuilder UseRequestCulture(this IApplicationBuilder builder, RequestCultureOptions options)
{
return builder.UseMiddleware<RequestCultureMiddleware>(options);
}
}
6.
打开Startup.cs文本,并将配置方式中的后备文化设置为一些私下认可值,例如。
“zh-cn”。
app.UseRequestCulture(new RequestCultureOptions
{
DefaultCulture = new CultureInfo("zh-cn")
});
1 public void ConfigureServices(IServiceCollection services)
2 {
3 services.AddMvc();
4
5 // 添加支付宝客户端依赖注入
6 services.AddAlipay();
7
8 // 可在添加依赖注入时设置参数 一般设置 AppId、RsaPrivateKey、RsaPublicKey,其余默认即可.
9 // 如:
10 //services.AddAlipay(opt =>
11 //{
12 // //此处为蚂蚁金服开放平台上创建的APPID,而非老版本的商户号
13 // opt.AppId = "";
14
15 // // 这里的公私钥 默认均为支付宝官方推荐使用的RSAWithSHA256.
16 // // 商户私钥
17 // opt.RsaPrivateKey = "";
18 // // 支付宝公钥
19 // opt.RsaPublicKey = "";
20 //});
21
22 // 具体参数见 AlipayOptions
23
24 // 注册配置实例
25 services.Configure<AlipayOptions>(Configuration.GetSection("Alipay"));
26
27 // 两种方式设置注册配置实例参数
28
29 // 1.默认配置文件(开发环境/正式环境):
30 // appsettings.Development.json / appsettings.json
31
32 // 2.用户机密配置文件(VS2017 15.6.4 中,右键项目 => 管理用户机密):
33 // Windows: % APPDATA %\microsoft\UserSecrets\< userSecretsId >\secrets.json
34 // Linux: ~/.microsoft / usersecrets /< userSecretsId >/ secrets.json
35 // macOS: ~/.microsoft / usersecrets /< userSecretsId >/ secrets.json
36
37 // 配置文件内容如下('...'为省略的项目其他配置内容,若有的情况下 -_-!):
38
39 //{
40 // ...
41 // ...
42 //
43 // "Alipay": {
44 // "AppId": "",
45 // "RsaPublicKey": "",
46 // "RsaPrivateKey": ""
47 // }
48 //}
49 }
ASP.NET
Core的布署种类已经从初期版本的ASP.NET重新构建,后者信赖于System.Configuration和XML配置文件,如web.config。
新的布局模型提供了能够从各样提供程序检索的依照键/值的安装的简化访问。
然后,应用程序和框架能够使用新的选项情势访问已计划的设置。
在此职务中,您将运用从JSON文件加载RequestCultureOptions的暗中认可文化值的新配置种类。
1.
开辟Startup.cs文件并加上二个名为布局项目IConfiguration的新的个体类字段,解析IConfiguration的丢失依赖关系。
public class Startup
{
private readonly IConfiguration configuration;
// ...
}
2.
添加二个新的构造函数,使用ConfigurationBuilder在构造函数中创立二个新的Configuration对象,并将其分配给你在上一步中创设的布局类字段。
public Startup()
{
var configuration = new ConfigurationBuilder()
.Build();
this.configuration = configuration;
}
3.
打开project.json文本,并在依靠关系节点中添加对Microsoft.Extensions.Configuration.Json包的引用。也能够透过Nuget引用。
"dependencies": {
"Microsoft.AspNetCore.Diagnostics": "1.1.0",
"Microsoft.AspNetCore.Mvc": "1.1.0",
"Microsoft.AspNetCore.Server.IISIntegration": "1.1.0",
"Microsoft.AspNetCore.Server.Kestrel": "1.1.0",
"Microsoft.AspNetCore.StaticFiles": "1.1.0",
"Microsoft.Extensions.Configuration.Json": "1.1.0",
"Microsoft.Extensions.Logging.Console": "1.1.0",
"Microsoft.NETCore.App": "1.1.0",
"MiddlewareApp": "1.0.0-*"
},
Nuget引用
4.
回到Startup.cs文件中,在作为链接方法创立ConfigurationBuilder对象之后随即添加对.AddJsonFile(“config.json”)的调用。
private readonly IConfiguration configuration;
public Startup(IHostingEnvironment env)
{
var configuration = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath) //设置程序路径为根路径
.AddJsonFile("config.json")
.Build();
this.configuration = configuration;
}
6.
在新的config.json文本中,添加2个新的键/值对“culture”:“zh-cn”。
{
"culture": "zh-cn"
}
开辟Startup.cs文件并更新代码以应用新的布局种类装置暗中认可文化。
app.UseRequestCulture(new RequestCultureOptions
{
DefaultCulture = new CultureInfo(this.configuration["culture"] ?? "zh-cn")
});
运维应用程序并证实暗中认可文化是布署文件中配备的文书。
9.
在config.json文件上校文化值更新为“zh”,并刷新页面(不改动任何其余代码)。
请注意,信息未变更,因为仅在应用程序运转时读取配置。
回到Visual Studio并按Ctrl + Shift + F5再一次起动Web服务器。
回去浏览器并刷新页面; 它应当显得更新的音讯。
ASP.NET
Core的配置种类已经从早期版本的ASP.NET重新营造,后者重视于System.Configuration和XML配置文件,如web.config。
新的配置模型提供了足以从各个提供程序检索的依据键/值的装置的简化访问。
然后,应用程序和框架能够应用新的选项格局访问已配备的安装。
在此职分中,您将使用从JSON文件加载RequestCultureOptions的暗中认可文化值的新安顿连串。
1.
打开Startup.cs文件并累加3个名为布局项目IConfiguration的新的私有类字段,解析IConfiguration的散失依赖关系。
public class Startup
{
private readonly IConfiguration configuration;
// ...
}
2.
添加八个新的构造函数,使用ConfigurationBuilder在构造函数中成立多少个新的Configuration对象,并将其分配给你在上一步中创制的配置类字段。
public Startup()
{
var configuration = new ConfigurationBuilder()
.Build();
this.configuration = configuration;
}
3.
打开project.json文本,并在凭借关系节点中添加对Microsoft.Extensions.Configuration.Json包的引用。也足以通过Nuget引用。
"dependencies": {
"Microsoft.AspNetCore.Diagnostics": "1.1.0",
"Microsoft.AspNetCore.Mvc": "1.1.0",
"Microsoft.AspNetCore.Server.IISIntegration": "1.1.0",
"Microsoft.AspNetCore.Server.Kestrel": "1.1.0",
"Microsoft.AspNetCore.StaticFiles": "1.1.0",
"Microsoft.Extensions.Configuration.Json": "1.1.0",
"Microsoft.Extensions.Logging.Console": "1.1.0",
"Microsoft.NETCore.App": "1.1.0",
"MiddlewareApp": "1.0.0-*"
},
Nuget引用
4.
回到Startup.cs文件中,在作为链接方法创立ConfigurationBuilder对象之后立时添加对.AddJsonFile(“config.json”)的调用。
private readonly IConfiguration configuration;
public Startup(IHostingEnvironment env)
{
var configuration = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath) //设置程序路径为根路径
.AddJsonFile("config.json")
.Build();
this.configuration = configuration;
}
6.
在新的config.json文本中,添加贰个新的键/值对“culture”:“zh-cn”。
{
"culture": "zh-cn"
}
打开Startup.cs文件并创新代码以使用新的配置体系装置暗中认可文化。
app.UseRequestCulture(new RequestCultureOptions
{
DefaultCulture = new CultureInfo(this.configuration["culture"] ?? "zh-cn")
});
运维应用程序并证实默许文化是布置文件中配置的公文。
9.
在config.json文件中校文化值更新为“zh”,并刷新页面(不改变任何别的代码)。
请注意,音信未变更,因为仅在应用程序运行时读取配置。
回到Visual Studio并按Ctrl + Shift + F5双重起动Web服务器。
回去浏览器并刷新页面; 它应当显得更新的音信。
ASP.NET Core是从根本上规划的,接济和选拔正视注入。 ASP.NET
Core应用程序能够通过将它们注入到Startup类中的方法中来利用内置框架服务,并且应用程序服务也能够配备为注入。
ASP.NET
Core提供的暗中认可服务容器提供了1个相当的小的功用集,并不用于替换别的容器。
在此职务中,您将动用依赖注入系统陈设RequestCultureMiddleware选项。
更改RequestCultureMiddleware构造函数以利用IOptions
<RequestCultureOptions>而不是RequestCultureOptions并获得options参数的值。
搞定丢失的正视关系。
public RequestCultureMiddleware(RequestDelegate next, IOptions
{
this.next = next;
options = options.Value;
}
2.
更新RequestCultureMiddlewareExtensions类,删除带有options参数的章程,并在另一个主意中调用UseMiddleware
<RequestCultureMiddleware>,如上边包车型地铁代码片段所示。
public static class RequestCultureMiddlewareExtensions
{
public static IApplicationBuilder UseRequestCulture(this IApplicationBuilder builder)
{
return builder.UseMiddleware<RequestCultureMiddleware>();
}
}
3.
在Startup.cs中,将UseRequestCulture中间件更改为不收受任何参数。
app.UseRequestCulture();
4.
在置身同一文件中的ConfigureServices方法中,使用services.Configure
<RequestCultureOptions>方式添加一行配置文化,并丰富对AddOptions办法的调用,如上面包车型客车代码片段所示。
public void ConfigureServices(IServiceCollection services)
{
// DI的设置选项
services.AddOptions();
services.Configure<RequestCultureOptions>(options =>
{
options.DefaultCulture = new CultureInfo(this.configuration["culture"] ?? "zh-cn");
});
}
ASP.NET Core是从根本上统一筹划的,支持和使用注重注入。 ASP.NET
Core应用程序能够通过将它们注入到Startup类中的方法中来利用内置框架服务,并且应用程序服务也得以配备为注入。
ASP.NET
Core提供的暗许服务容器提供了三个细微的效用集,并不用于替换其余容器。
在此职责中,您将选拔重视注入系统布局RequestCultureMiddleware选项。
更改RequestCultureMiddleware构造函数以使用IOptions
<RequestCultureOptions>而不是RequestCultureOptions并取得options参数的值。
解决丢失的正视关系。
public RequestCultureMiddleware(RequestDelegate next, IOptions
{
this.next = next;
options = options.Value;
}
2.
更新RequestCultureMiddlewareExtensions类,删除带有options参数的办法,并在另1个方法中调用UseMiddleware
<RequestCultureMiddleware>,如上边包车型地铁代码片段所示。
public static class RequestCultureMiddlewareExtensions
{
public static IApplicationBuilder UseRequestCulture(this IApplicationBuilder builder)
{
return builder.UseMiddleware<RequestCultureMiddleware>();
}
}
3.
在Startup.cs中,将UseRequestCulture中间件更改为不收受任何参数。
app.UseRequestCulture();
4.
在置身同一文件中的ConfigureServices方法中,使用services.Configure
<RequestCultureOptions>措施添加一行配置文化,并加上对AddOptions方法的调用,如上边包车型大巴代码片段所示。
public void ConfigureServices(IServiceCollection services)
{
// DI的设置选项
services.AddOptions();
services.Configure<RequestCultureOptions>(options =>
{
options.DefaultCulture = new CultureInfo(this.configuration["culture"] ?? "zh-cn");
});
}
ASP.NET Identity是三个分子身份系统,它同意你向应用程序添加登录成效。
用户能够使用用户名和密码创建帐户和登录,也得以应用推文(Tweet),谷歌,Microsoft帐户,Instagram等外部登录提供程序。
在本演习中,您将领会使用ASP.NET Identity的ASP.NET
Core项目模板的暗许配置,以及将Instagram配置为应用程序中的外部登录提供程序。
ASP.NET Identity是2个分子身份系统,它同意你向应用程序添加登录成效。
用户能够使用用户名和密码创造帐户和登录,也能够利用推特(TWTR.US),谷歌(Google),Microsoft帐户,Facebook等外部登录提供程序。
在本演习中,您将明白使用ASP.NET Identity的ASP.NET
Core项目模板的暗中同意配置,以及将推特(Twitter)(脸书)配置为应用程序中的外部登录提供程序。
在此任务中,您将明白ASP.NET Core项目模板怎样使用ASP.NET
Identity添加注册,登录和撤消用户的效用。
打开Visual Studio 2015并选择文件| 新|
项目…创设一个新的解决方案。
在“新建项目”对话框中,采纳Visual C#|下的ASP.NET Web应用程序
Web选项卡,并保障选拔.NET Framework 4.6。
将品种命名为MyWebApp,选取三个职责,然后单击鲜明。
创设新的ASP.NET Web应用程序项目
选拔Web应用程序模板创制新品类
4.
品种成立后,打开project.json文件并找到Microsoft.AspNet.Identity.EntityFramework软件包。
此包全数实体框架完结的ASP.NET
Identity,将持久化ASP.NET身份数据和形式到SQL Server。
Microsoft.AspNet.Identity.EntityFramework包
Microsoft.AspNet.Identity.EntityFramework包正视项
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
// ...
}
7.
在同样文件中,找到在运营推行流程中调用ConfigureServices艺术后调用的Configure方法。
在此措施中,当调用UseIdentity主意时,将为应用程序启用ASP.NET
Identity。 那会向请求管道添加基于Cookie的身份验证。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
// ...
app.UseIdentity();
// ...
}
8.
开拓放在Controllers文本夹的AccountController.cs文本,并找到具有HttpPost属性的Register操作。
此操作调用UserManager劳务依据RegisterViewModel音讯创制和登录用户。
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
var result = await _userManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
// ...
await _signInManager.SignInAsync(user, isPersistent: false);
// ...
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
{
ViewData["ReturnUrl"] = returnUrl;
if (ModelState.IsValid)
{
var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
// ...
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> LogOff()
{
await _signInManager.SignOutAsync();
_logger.LogInformation(4, "User logged out.");
return RedirectToAction(nameof(HomeController.Index), "Home");
}
帐户注册视图
挂号第2个用户后,您会合到一条错误新闻,提醒您使用现有迁移。
单击应用迁移。 您未来将看到您以新用户地点登录。
停下应用程序并浏览数据库,方法是导航到SQL
Server对象财富管理器视图中的(localdb)MSSQLLocalDB / Databases /
aspnet5-MyWebApp- / Tables。
右键单击dbo.AspNetUsers表并选取“查阅数据”以查看创造的用户的习性。
在SQL Server对象资源管理器中查看用户数据
在此职务中,您将掌握ASP.NET Core项目模板怎么样运用ASP.NET
Identity添加注册,登录和撤回用户的成效。
打开Visual Studio 2015并选择文件| 新|
项目…创设一个新的化解方案。
在“新建项目”对话框中,采用Visual C#|下的ASP.NET Web应用程序
Web选项卡,并保证选择.NET Framework 4.6。
将项目命名为MyWebApp,选拔多个职位,然后单击分明。
创造新的ASP.NET Web应用程序项目
使用Web应用程序模板创立新类型
4.
类型创立后,打开project.json文本并找到Microsoft.AspNet.Identity.EntityFramework软件包。
此包全体实体框架完毕的ASP.NET
Identity,将持久化ASP.NET身份数据和方式到SQL Server。
Microsoft.AspNet.Identity.EntityFramework包
Microsoft.AspNet.Identity.EntityFramework包注重项
打开Startup.cs文件并找到ConfigureServices办法。
在此方式中,身份服务由以下代码配置。
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
// ...
}
7.
在平等文件中,找到在运行实施流程中调用ConfigureServices办法后调用的Configure措施。
在此方式中,当调用UseIdentity格局时,将为应用程序启用ASP.NET
Identity。 那会向请求管道添加基于Cookie的身份验证。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
// ...
app.UseIdentity();
// ...
}
8.
开拓放在Controllers文本夹的AccountController.cs文本,并找到具有HttpPost属性的Register操作。
此操作调用UserManager服务依照RegisterViewModel音信创立和登录用户。
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
var result = await _userManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
// ...
await _signInManager.SignInAsync(user, isPersistent: false);
// ...
使用HttpPost品质找到Login操作。
此操作使用SignInManager服务的PasswordSignInAsync方式对用户展开签订契约。
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task
{
ViewData["ReturnUrl"] = returnUrl;
if (ModelState.IsValid)
{
var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
// ...
现在,找到LogOff操作。
此操作调用SignInManager服务的SignOutAsync措施,清除存款和储蓄在Cookie中的用户注解。
[HttpPost]
[ValidateAntiForgeryToken]
public async Task
{
await _signInManager.SignOutAsync();
_logger.LogInformation(4, "User logged out.");
return RedirectToAction(nameof(HomeController.Index), "Home");
}
运行消除方案并因此单击注册以查看ASP.NET
Identity系统的操作来创制新用户。
您能够调剂AccountController中的区别操作。
帐户注册视图
注册第二个用户后,您会看到一条错误音讯,提醒您使用现有迁移。
单击应用迁移。 您未来将看到您以新用户身份登录。
停下应用程序并浏览数据库,方法是导航到SQL
Server对象财富管理器视图中的(localdb)MSSQLLocalDB / Databases /
aspnet5-MyWebApp- / Tables。
右键单击dbo.AspNetUsers表并精选“查阅数据”以查看成立的用户的习性。
在SQL Server对象能源管理器中查看用户数据
代码:
ASP.NET Core支持使用OAuth
2.0利用来源外部认证提供程序(如照片墙,Twitter,LinkedIn,Microsoft或谷歌)的证据登录。
在您的网站中启用社交登录凭据提供了显着的优势,因为数百万用户已经颇具那么些外部提供商的帐户。
如若她们不必成立和难忘一组新的凭证,这个用户也许更倾向于注册您的网站。
在此职责中,您将创立三个推特(TWT奥迪Q5.US)应用程序并布署您的Web应用程序项目(须要翻个墙),以使用户能够运用其推特(TWTR.US)(照片墙)帐户作为外部提供商登录。
1.
在浏览器中,导航到,然后通过输入您的照片墙凭据登录。假诺您没有注册为推特开发人士,请单击注册为开发人士,并依据表明注册。2.
在Facebook的开发职员主页上,通过单击添加新应用程序并从阳台选用中甄选网站添加新的应用程序。
- 在“网站飞速入门”页面上,采用“跳过并创办应用程序ID”。
4.
装置展现名称,例如ASP.NET社交登录,并选择品种,例如业务,然后按制造应用程序ID。
在安装页面包车型大巴焦点部分中,单击添加平台以钦命要添加网站应用程序。
从阳台采用中选拔网站,添加您的网站网址(例如https://
localhost:44300 /),然后点击上边包车型地铁保存更改。7.
记下您的应用程序ID和应用程序密钥,以便你以往能够将它们拉长到您的ASP.NET大旨网站。
- 切换回Visual Studio,右键单击MyWebApp项目并选取管理用户秘密。
慎选管理用户秘密
9. 在secrets.json文件中添加以下代码,将占位符替换为从推特(Twitter)(TWTLAND.US)获取的值。
{
"Authentication": {
"Facebook": {
"AppId": "<your-app-id>",
"AppSecret": "<your-app-secret>"
}
}
}
10.
开拓project.json文件并添加Microsoft.AspNet.Authentication.Twitter包作为依靠关系
"dependencies": {
...
"Microsoft.AspNet.Authentication.Facebook": "1.0.0-rc1-final"
},
11.
开拓startup.cs文件,并在Configure方法中添加推文(Tweet)中间件,如以下代码段所示。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
// ...
app.UseIdentity();
app.UseFacebookAuthentication(options =>
{
options.AppId = Configuration["Authentication:Facebook:AppId"];
options.AppSecret = Configuration["Authentication:Facebook:AppSecret"];
});
// ...
}
利用推特按钮登录页面
源码下载地址:
ASP.NET Core援助使用OAuth
2.0使用来源外部认证提供程序(如推特,Twitter,LinkedIn,Microsoft或谷歌)的凭证登录。
在你的网站中启用社交登录凭据提供了显着的优势,因为数百万用户已经具备这个外部提供商的帐户。
倘若他们不要成立和铭记一组新的凭据,这几个用户大概更赞成于注册您的网站。
在此任务中,您将成立三个推文(Tweet)应用程序并配备您的Web应用程序项目(要求翻个墙),以使用户能够利用其Instagram帐户作为外部提供商登录。
1.
在浏览器中,导航到,然后经过输入您的推特(Twitter)凭据登录。如若你没有注册为推特(TWTR.US)开发人士,请单击注册为开发职员,并依照表达注册。2.
在脸书的开发职员主页上,通过单击添加新应用程序并从平台采纳中精选网站添加新的应用程序。
- 在“网站急迅入门”页面上,选取“跳过并创制应用程序ID”。
4.
设置显示名称,例如ASP.NET社交登录,并精选项目,例如业务,然后按制造应用程序ID。
在装置页面包车型大巴主干部分中,单击添加平台以钦赐要添加网站应用程序。
从平台采取中选拔网站,添加您的网站网址(例如https://
localhost:44300 /),然后点击下边包车型地铁保存更改。7.
记下您的应用程序ID和应用程序密钥,以便你未来能够将它们增加到你的ASP.NET核心网站。
- 切换回Visual Studio,右键单击MyWebApp项目并选取管理用户秘密。
挑选管理用户秘密
9. 在secrets.json文件中添加以下代码,将占位符替换为从照片墙获取的值。
{
"Authentication": {
"Facebook": {
"AppId": "<your-app-id>",
"AppSecret": "<your-app-secret>"
}
}
}
10.
开拓project.json文件并添加Microsoft.AspNet.Authentication.推特(Twitter)(TWT凯雷德.US)包作为依靠关系
"dependencies": {
...
"Microsoft.AspNet.Authentication.Facebook": "1.0.0-rc1-final"
},
11.
开拓startup.cs文件,并在Configure方法中添加脸书中间件,如以下代码段所示。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
// ...
app.UseIdentity();
app.UseFacebookAuthentication(options =>
{
options.AppId = Configuration["Authentication:Facebook:AppId"];
options.AppSecret = Configuration["Authentication:Facebook:AppSecret"];
});
// ...
}
利用Instagram按钮登录页面
源码下载地址:
本小说所提及的Asp.NET Core 1.1 preview
1,是当下的新型版本,之后会写一篇专门介绍Asp.NET Core 1.1 preview
1的作品。尽情期待。希望本文对您具备帮忙。
本文章所提及的Asp.NET Core 1.1 preview
1,是时下的新式版本,之后会写一篇专门介绍Asp.NET Core 1.1 preview
1的稿子。尽情期待。希望本文对你富有支持。
转发请表明出处:
1 using Essensoft.AspNetCore.Payment.Alipay;
2 using Essensoft.AspNetCore.Payment.Alipay.Domain;
3 using Essensoft.AspNetCore.Payment.Alipay.Notify;
4 using Essensoft.AspNetCore.Payment.Alipay.Request;
5 using Microsoft.AspNetCore.Mvc;
6 using System.Threading.Tasks;
7
8 namespace AlipaySample.Controllers
9 {
10 public class AlipayController : Controller
11 {
12 // 支付宝请求客户端(用于处理请求与其响应)
13 private readonly AlipayClient _client = null;
14
15 // 支付宝通知客户端(用于解析异步通知或同步跳转)
16 private readonly AlipayNotifyClient _notifyClient = null;
17
18 // 赋值依赖注入对象
19 public AlipayController(AlipayClient client, AlipayNotifyClient notifyClient)
20 {
21 _client = client;
22 _notifyClient = notifyClient;
23 }
24
25 [HttpPost]
26 public async Task<IActionResult> PagePay(string out_trade_no, string subject, string total_amount, string body, string product_code, string notify_url, string return_url)
27 {
28 // 组装模型
29 var model = new AlipayTradePagePayModel()
30 {
31 Body = body,
32 Subject = subject,
33 TotalAmount = total_amount,
34 OutTradeNo = out_trade_no,
35 ProductCode = product_code,
36 };
37
38 var req = new AlipayTradePagePayRequest();
39
40 // 设置请求参数
41 req.SetBizModel(model);
42
43 // 设置异步通知URL
44 req.SetNotifyUrl(notify_url);
45
46 // 设置同步跳转URL
47 req.SetReturnUrl(return_url);
48
49 // 页面请求处理 传入 'GET' 返回的 response.Body 为 URL, 'POST' 返回的 response.Body 为 HTML.
50 var response = await _client.PageExecuteAsync(req, null, "GET");
51
52 // 重定向到支付宝电脑网页支付页面.
53 return Redirect(response.Body);
54 }
55
56 /// <summary>
57 /// 电脑网页支付-同步跳转
58 /// 常用于展示订单支付状态页,建议在异步通知统一做业务处理,而不是在此处.
59 /// </summary>
60 /// <returns></returns>
61 [HttpGet]
62 public async Task<IActionResult> PagePayReturn()
63 {
64 try
65 {
66 // 以 AlipayTradePagePayReturnResponse 类型 解析
67 var notify = await _notifyClient.ExecuteAsync<AlipayTradePagePayReturnResponse>(Request);
68 return Content("成功:" + notify.OutTradeNo);
69 }
70 catch
71 {
72 return Content("参数异常/验签失败");
73 }
74 }
75
76 /// <summary>
77 /// 电脑网页支付-异步通知
78 /// 常用于订单业务处理
79 /// </summary>
80 /// <returns></returns>
81 [HttpPost]
82 public async Task<IActionResult> PagePayNotify()
83 {
84 try
85 {
86 // 以 AlipayTradePagePayNotifyResponse 类型 解析
87 var notify = await _notifyClient.ExecuteAsync<AlipayTradePagePayNotifyResponse>(Request);
88 if ("TRADE_SUCCESS" == notify.TradeStatus) // 订单是否交易完成
89 {
90 // 业务代码
91 // ...
92 // ...
93
94 //返回给支付宝成功内容,停止继续通知
95 return Content("success", "text/plain");
96 }
97 // 订单其他状态均返回给支付宝空内容.
98 return NoContent();
99 }
100 catch
101 {
102 // 参数异常/验签失败均返回给支付宝空内容.
103 return NoContent();
104 }
105 }
106 }
107 }
5. 修改 Views/Home/Index 页面,用于网站提交支付请求.
代码:
1 @{
2 ViewData["Title"] = "Home Page";
3 }
4
5 <div style="padding:24px 0">
6 <h3>支付宝 电脑网站支付 - <a href="https://docs.open.alipay.com/270/alipay.trade.page.pay" target="_blank">API文档</a></h3>
7 <hr />
8 <form asp-controller="Alipay" asp-action="PagePay" target="_blank">
9 <div class="form-group">
10 <label>body:</label>
11 <input type="text" class="form-control" name="body" value="支付宝网站支付测试详情">
12 </div>
13 <div class="form-group">
14 <label>subject:</label>
15 <input type="text" class="form-control" name="subject" value="支付宝网站支付测试">
16 </div>
17 <div class="form-group">
18 <label>total_amount:</label>
19 <input type="text" class="form-control" name="total_amount" value="0.01">
20 </div>
21 <div class="form-group">
22 <label>out_trade_no:</label>
23 <input type="text" class="form-control" name="out_trade_no" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")">
24 </div>
25 <div class="form-group">
26 <label>product_code:</label>
27 <input type="text" class="form-control" name="product_code" value="FAST_INSTANT_TRADE_PAY">
28 </div>
29 <div class="form-group">
30 <label>notify_url(通知Url需外网环境可访问):</label>
31 <input type="text" class="form-control" name="notify_url" value="http://xxx.com/alipay/pagepaynotify">
32 </div>
33 <div class="form-group">
34 <label>return_url:</label>
35 <input type="text" class="form-control" name="return_url" value="http://xxx.com/alipay/pagepayreturn">
36 </div>
37 <button type="submit" class="btn btn-primary">提交</button>
38 </form>
39 </div>
完结页面如下:
本篇小说到此结束,具体职能可机关测试。多谢各位观望。