开发功效衔接,Core中间件完结分布式

转自:

  • 1. ASP.NET
    Core中间件详解

    • 1.1.
      中间件原理

      • 1.1.1.
        什么样是中间件
      • 1.1.2.
        中间件执行进度
      • 1.1.3.
        中间件的布局
    • 1.2.
      借助注入中间件
    • 1.3.
      Cookies和session中间件

      • 1.3.1.
        Session
      • 1.3.2.
        Session保存到Redis中
      • 1.3.3.
        完毕分布Session
    • 1.4.
      总结

概述

事先写过一篇关于《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的版本有个别老,所以,这一次重写1回。使用最新的ASP.NET Core
1.1版本。对于ASP.NET Core 1.1 Preview 1会在此后的小说中牵线

那篇文章将介绍ASP.NET Core中央银行使
开源项目 Payment,完结连接支付宝-电脑网页支付接口及联合跳转及异步公告作用。

1.1. 中间件原理

目录

  • 运用静态文件
  • 行使路由
  • 编纂自定义中间件
  • 向Web应用程序添加身份验证

目录

  • 利用静态文件
  • 选择路由
  • 编写自定义中间件
  • 向Web应用程序添加身份验证

支付条件:Win 10 x6④ 、VS2017 15.6.④ 、.NET Core SDK 2.1.10① 、.NET Core
Runtime 2.0.6

1.1.1. 什么样是中间件

中间件是段代码用于拍卖请求和响应,平日两当中间件链接起来形成管道,由各在那之中间件自身来控制是或不是要调用下二其中间件。

亚洲必赢官网 1

2017-10-10-21-47-00

先决条件

达成此模块要求以下内容:

  • Visual Studio Community 二零一五或更高版本
  • ASP.NET Core 1.0

先决条件

做到此模块要求以下内容:

  • Visual Studio Community 二〇一五或更高版本
  • ASP.NET Core 1.0

1.新建”ASP.NET Core Web 应用程序”项目,小编将它定名为阿里pay萨姆ple.

1.1.2. 中间件执行进度

举多个示范来演示中间件的施行进程(分别有几当中间件:日志记录、权限验证和路由):当呼吁进入应用程序时,执行实施日志记录的中间件,它记录请求属性并调用链中的下1当中间件权限验证,倘使权力验证通过则将控制权传递给下1其中间件,不经过则设置401
HTTP代码并回到响应,响应传递给日志中间件进行再次回到。

亚洲必赢官网 2

2017-10-10-22-47-32

练习

此模块包含以下演练:

  1. 应用静态文件
  2. 路由和MVC简介
  3. 塑造中间件类
  4. 向Web应用程序添加身份验证

臆想达成此模块的年华:5八分钟

注意:第③遍开发银行Visual Studio时,必须选取四个预订义的装置集合。
每种预约义集合目的在于合营特定的付出样式,并规定窗口布局,编辑器行为,智能感知代码片段和对话框选项。
本模块中的进度描述了在应用“常规开发设置”集合时,在Visual
Studio中完结给定职务所需的操作。
若是为费用条件选拔分歧的装置集合,那么你应该考虑的步骤可能会有所不一样。

练习

此模块包涵以下演练:

  1. 利用静态文件
  2. 路由和MVC简介
  3. 构建中间件类
  4. 向Web应用程序添加身份验证

估价达成此模块的年月:五1八分钟

注意:第四回运行Visual Studio时,必须选取1个预订义的设置集合。
各个预约义集合意在合作特定的开发样式,并确定窗口布局,编辑器行为,智能感知代码片段和对话框选项。
本模块中的进度描述了在应用“常规开发设置”集合时,在Visual
Studio中达成给定职务所需的操作。
假使为费用条件采取分歧的设置集合,那么你应该考虑的步调大概会有所不一致。

亚洲必赢官网 3

1.1.3. 中间件的布局

中间件配置主假设用RunMapUse艺术实行配备,三者的不等参见上篇ASP.NET
Core
运维原理分析;简单的中间件能够一向运用匿名格局就能够解决,如下代码:

app.Run(async (context,next) =>
        {
            await context.Response.WriteAsync("environment " + env);
            await next();
        });

要是想引用中间件,就须要单独封装到贰个类中展开调用。

练习1:使用静态文件

静态文件(包涵HTML文件,CSS文件,图像文件和JavaScript文件)是应用程序将间接提供给客户端的资产。

在本练习中,您将安插项目以提供静态文件。

 

 

演练1:使用静态文件

静态文件(包涵HTML文件,CSS文件,图像文件和JavaScript文件)是应用程序将平素提供给客户端的资本。

在本演习中,您将陈设项目以提供静态文件。

 

 

亚洲必赢官网 4

1.2. 凭借注入中间件

在实际上项目中,中间件往往供给调用其它对象的不二法门。所以要创造对象之间的借助,由于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系统了然那个参数的品类,则在类被实例化时,它们将被自动分析。很简单!

职分1 – 提供静态文件

为了提供静态文件,您必须配备中间件以向管道添加静态文件。
那是由此从Startup.Configure方法调用UseStaticFiles扩张方法来贯彻的。

在此任务中,您将制造二个空的ASP.NET Core
1.0门类并将其布局为提供静态文件。

  1. 打开Visual Studio 2015并精选文件|
    新项目…开首3个新的杀鸡取蛋方案

  2. 在“新建项目”对话框中,选择Visual C#|下的ASP.NET
    Web应用程序
     Web选项卡,并保管采用.NET Framework 4.6
    将项目命名为Asp.NET_Core_TEST,选用三个职位,然后单击鲜明。

亚洲必赢官网 5

始建新的ASP.NET Web应用程序项目

  1. 在“新建ASP.NET项目”对话框中,采用“ASP.NET Core Templates”。
    单击“确定”。

亚洲必赢官网 6

利用ASP.NET Core航空模型板创立新品类

4.
Microsoft.AspNet.StaticFiles包添加为project.json的信赖项,能够在dependencies节点下添加。

亚洲必赢官网 7

"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"
  },

亚洲必赢官网 8

   当然,也足以经过Nuget添加相关的重视包

亚洲必赢官网 9

5.
打开Startup.cs文本,并在Hello中间件在此之前的Configure措施中添加UseStaticFiles方式调用。

亚洲必赢官网 10

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!");
    });
}

亚洲必赢官网 11

6.
wwwroot文件夹中创设3个名为index.html的文本,个中蕴藏以下内容。

亚洲必赢官网 12

<!DOCTYPE html>
<html>
<head>
     <meta charset="utf-8" />
     <title>Hello static world!</title>
</head>
<body>
     <h1>Hello from ASP.NET Core!</h1>
</body>
</html>

亚洲必赢官网 13

  1. 运作应用程序并导航到根。 它应有展现hello world中间件。

亚洲必赢官网 14

  1. 导航到index.html,它应有出示wwwroot中的静态页面。

亚洲必赢官网 15

 

 

职分1 – 提供静态文件

为了提供静态文件,您必须配备中间件以向管道添加静态文件。
那是因而从Startup.Configure方法调用UseStaticFiles扩张方法来落到实处的。

在此任务中,您将创造1个空的ASP.NET Core
1.0门类并将其配备为提供静态文件。

  1. 打开Visual Studio 2015并选择文件|
    新项目…伊始三个新的赶尽杀绝方案

  2. 在“新建项目”对话框中,选取Visual C#|下的ASP.NET Web应用程序
    Web选项卡,并确认保障采取.NET Framework 4.6
    将项目命名为Asp.NET_Core_TEST,选拔三个职位,然后单击分明。

亚洲必赢官网 16

始建新的ASP.NET Web应用程序项目

  1. 在“新建ASP.NET项目”对话框中,选拔“ASP.NET Core Templates”。
    单击“确定”。

亚洲必赢官网 17

利用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添加相关的依赖包

亚洲必赢官网 18

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>
  1. 运营应用程序并导航到根。 它应有出示hello world中间件。

亚洲必赢官网 19

  1. 导航到index.html,它应当显得wwwroot中的静态页面。

亚洲必赢官网 20

 

 

  1. 引入安装Nuget包 “Essensoft.AspNetCore.Payment.Alipay”.
    目前(2018/03/29)版本为 1.2.1

1.3. Cookies和session中间件

职分2 – 添加暗中认可文书档案支持

为了让你的Web应用程序提供暗许页面,而用户不用完全限定UWranglerI,就足以应用UseDefaultFiles壮大方法。
此方法是实在不提供文件的UTiguanL重写程序。

除了UseStaticFilesUseDefaultFiles恢宏方法之外,还有二个办法
– UseFileServer –
组合那二种办法的效果以及UseDirectoryBrowser扩大方法。

在此职责中,您将运用UseFileServer启用服务静态和私下认可文件。

1.
打开Startup.cs文件,将Configure方法中的静态文件中间件从app.UseStaticFiles()更改为app.UseFileServer()。

亚洲必赢官网 21

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!");
    });
}

亚洲必赢官网 22

  1. 再度运转应用程序。 导航到网站根目录时,应呈现暗中认可页面index.html

 

任务2 – 添加默许文书档案支持

为了让你的Web应用程序提供私下认可页面,而用户无需完全限定U安德拉I,就可以利用UseDefaultFiles恢宏方法。
此方法是实际不提供文件的UHighlanderL重写程序。

除了UseStaticFilesUseDefaultFiles壮大方法之外,还有3个主意 –
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!");
    });
}
  1. 再一次运转应用程序。 导航到网站根目录时,应彰显默许页面index.html

 

亚洲必赢官网 23

1.3.1. Session

HTTP是叁个无状态协议,Web服务器将每贰个请求都视为独立请求。并且不保留在此以前请求中用户的值。

Session 状态是ASP.NET
Core提供的2个效益,它能够在用户通应用访问网络服务器的时候保存和存款和储蓄用户数据。由服务器上的字典和散列表组成,Session状态通过浏览器的央求中拿走,Session的数量保存到缓存中。

ASP.NET Core通过包涵Session
ID的Cookie来保障会话状态,每一种请求都会带走此Session ID。

Microsoft.AspNetCore.Session包中提供的中间件用来治本Session状态。要启用Session中间件,Startup类里面需求做以下几个操作:

  • 动用其它1个贯彻了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中间件的每一个请求都会重置超时时间。

练习2:路由和MVC简介

路由是炫耀随地理程序的URAV4L形式。 处理程序能够是物理文件,例如Web
Forms应用程序中的.aspx文件。
处理程序也足以是处理请求的类,例如MVC应用程序中的控制器。

ASP.NET路由使你能够运用不必映射到网站中一定文件的U路虎极光L。
由于网址不必映射到文件,因而你能够使用描述用户操作的网址,由此用户更便于精通。

在本演习中,您将理解怎么在应用程序中布局路由。

练习2:路由和MVC简介

路由是炫耀到处理程序的URubiconL格局。 处理程序能够是情理文件,例如Web
Forms应用程序中的.aspx文件。
处理程序也得以是拍卖请求的类,例如MVC应用程序中的控制器。

ASP.NET路由使您能够采用不必映射到网站中一定文件的U卡宴L。
由于网址不必映射到文件,因而你能够应用描述用户操作的网址,由此用户更易于驾驭。

在本演习中,您将驾驭什么在应用程序中配置路由。

亚洲必赢官网 24

1.3.2. Session保存到Redis中

达成分布式Session方法官方提供有Redis、Sql Server等。但是Sql
Server功效对于那种以key/value获取值的法子远远不比Redis功用高,所以那边笔者选择Redis来作示例达成分布式Session。

准备Redis

由于近来Redis还不帮助windows,所以大家在安装Redis的时候准备一台linux操作系统,作者那里的系统是ubuntu
16.04;下载及安装情势得以参考官方示例。

安装成功以往运行Redis 服务,假若看到以下音讯,就表示Redis运维成功:

亚洲必赢官网 25

2017-10-30-20-33-47

连带计划

先是供给用Nuget安装包Microsoft.Extensions.Caching.Redis,安装成功之后就足以在app.csproj文本中得以见到。

亚洲必赢官网 26

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值展现为空

亚洲必赢官网 27

2017-10-31-06-47-24

当点击SetSessionValue从此未来,再一次归来ShowRedis页面,Session就值展现出来了

亚洲必赢官网 28

2017-10-31-23-56-58

看到apptestvalue意味着Session值已经存到Redis里面,怎么样表明apptestvalue值是从Redis里面取到呢?接下去就认证给我们看。

任务1 – 添加MVC

ASP.NET
MVC为您提供了3个有力的,基于形式的格局来创设动态网站,使清晰分离的题材,并让您完全控制标记的开心,敏捷开发。
ASP.NET MVC包蕴不少职能,创设使用最新的Web标准的复杂应用程序。

在此职责中,您将安顿项目以应用ASP.NET MVC并配备示例路由。

1.
打开project.json文件并将Microsoft.AspNet.Mvc添加到依傍关系部分。并添加runtimes节点,保险健康运转

亚洲必赢官网 29

"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"
  },

亚洲必赢官网 30

亚洲必赢官网 31

//添加运行环境的系统变量
  //当前系统环境为win10-x64
  //对于.NETCore包后报错,需要根据系统环境进行修改
  //可选环境包括:win10-x64, win81-x64, win8-x64, win7-x64
  "runtimes": {
    "win10-x64": {}
  },

亚洲必赢官网 32

2.
缓解方案财富管理器开发功效衔接,Core中间件完结分布式。中,右键单击Asp.NET_Core_TEST类型,然后采取添加|
新文件夹
,并将文件夹命名为Controllers

  1. 右键单击新文件夹,然后选拔添加|
    新项目…,
    分选MVC控制器类,命名文件HomeController.cs并单击添加。

  2. 行使以下代码段替换文件的情节。

亚洲必赢官网 33

namespace Asp.NET_Core_TEST.Controllers
{
    public class HomeController : Controller
    {
        // GET: /<controller>/
        [HttpGet]
        public string Index()
        {
            return "Hello form MVC HomeController";
        }
    }
}

亚洲必赢官网 34

5.
现在,打开Startup.cs文本,将MVC服务和中间件添加到配置中,添加services.AddMvc()并使用UseMvc格局替换Configure办法中的app.Run主意调用,如下边包车型客车代码片段所示。

亚洲必赢官网 35

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!");
    });
}

亚洲必赢官网 36

  1. 运作网站并因而导航到/ home端点验证从MVC控制器重回的音信。

留神:ASP.NET Core
MVC还包括三个方便的新实用程序方法,app.UseMvcWithDefaultRoute,因而你不用记住模板字符串。

 

任务1 – 添加MVC

ASP.NET
MVC为您提供了2个强硬的,基于方式的措施来创设动态网站,使清晰分离的标题,并让您完全控制标记的兴奋,敏捷开发。
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

  1. 右键单击新文件夹,然后选用添加|
    新项目…,
    选用MVC控制器类,命名文件HomeController.cs并单击添加。

  2. 应用以下代码段替换文件的始末。

    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!");
    });
}
  1. 运营网站并由此导航到/ home端点验证从MVC控制器再次回到的音信。

注意:ASP.NET Core
MVC还包涵三个方便的新实用程序方法,app.UseMvcWithDefaultRoute,因此你不用记住模板字符串。

 

  1. 在Startup.cs文件内 添加信赖注入、设置参数(蚂蚁金服开放平台 –
    账户管理 – 密钥管理 –
    开放平台密钥)

1.3.3. 贯彻分布Session

前边早已将Session保存到Redis中,可是我们不知底这么些值是不是是真的保存到Redis里面去了照旧在品种内部存款和储蓄器中;所以那里就贯彻在五个不的应用程序(或两台不相同的机械)中国共产党享Session,也正是兑现分布式Session,分布式即表示了差异的机械差别的应用程序,但频仍有上面包车型客车一种左右为难的景色,就终于每一个HTTP请求时都指导了扳平的cookie值。

亚洲必赢官网 37

2017-10-30-20-35-19

导致那些的标题标原委是种种机器上边的ASP.NET
Core的应用程序的密钥是不平等的,所以并未艺术得到前1个应用程序保存的Session数据;为了消除这几个题目,.NET
Core团队为提供了Microsoft.AspNetCore.DataProtection.AzureStorageMicrosoft.AspNetCore.DataProtection.Redis包将密钥保存到Azure或Redis中。那里选拔将密钥保存到Redis。

亚洲必赢官网 38

共享密钥

利用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

布局步骤

  • 而且创制多个连串,分别为app1和app2
  • 添加Microsoft.AspNetCore.DataProtection.RedisStackExchange.Redis.StrongName

亚洲必赢官网 39

2017-10-31-23-41-37

  • 鉴于在同样台机械上,ASP.NET
    Core程序暗中同意运行的时候端口为5000,由于app1已经占据了,所以将app2的启端口设置为5001

亚洲必赢官网 40

2017-10-31-23-54-19

总体代码

  • app1项目

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"]
  • app2项目

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"]

运作效果

  • app1 项目

第一回打开进去ShowRedis页面,Session值为空

亚洲必赢官网 41

2017-10-31-06-47-24

点击SetSessionValue以后,再回到ShowRedis页面:

亚洲必赢官网 42

2017-11-01-00-04-13

  • app2项目,直接在浏览器访问:http://localhost:5001

亚洲必赢官网 43

2017-11-01-00-00-30

上述是用Redis实现分布式Session示例。

勤学苦练3:编写自定义中间件

能够统一到HTTP请求管道中的小应用程序组件统称为中间件。 ASP.NET Core
1.0怀有对中间件的融会帮助,它们在应用程序运营时期在应用程序的Configure方法中总是。

在本演练中,您将开创三个根据查询字符串值设置当前知识的中间件类。

小心:我们在本演习中使用本地化相关中间件作为示范场景,但在大多数应用程序中,您将动用ASP.NET
Core的嵌入支持本地化扶助。

演练3:编写自定义中间件

可以统一到HTTP请求管道中的小应用程序组件统称为中间件。 ASP.NET Core
1.0颇具对中间件的三合一帮忙,它们在应用程序运维时期在应用程序的Configure主意中连续。

在本练习中,您将成立3个基于查询字符串值设置当前知识的中等件类。

只顾:我们在本演习中使用本地化相关中间件作为示范场景,但在多数应用程序中,您将运用ASP.NET
Core的内置帮忙本地化协理。

代码:

1.4. 总结

本节教学了中间件的运作规律及配置进度,中间件之间对象正视关系的布置和平常项目中常用到Session的布署难题。并在其实代码体现了哪些利用中间件达成分布式Session。

转发注脚出处
http://www.xdpie.com/2017/11/02/asp-net-core-distributed-session/

职分1 – 编写2个依据查询字符串值设置当前知识的中等件类

中间件是组装到应用程序管道中以处理请求和响应的机件。
每一种组件能够选拔是或不是将呼吁传递到管道中的下3个零部件,并且能够在管道中的下2个零件在此以前和后来执行有个别操作。
请求代理用于营造此恳请管道,然后用于拍卖对应用程序的各样HTTP请求。

请求代理使用传递到起步类中的配置方式的IApplicationBuilder类型上的Run(运行),Map(映射)和Use(使用)扩充方法举办布署。
单个请求委托能够作为匿名方式在线钦赐,也能够在可选用类中定义。
这几个可选取的类是中间件或中间件组件。
请求管道中的每在那之中间件组件负责调用链中的下3个零件,大概一旦适度,选取将链短路。

在此义务中,您将创造内联合中学间件。

1.
在事先的Asp.NET_Core_TEST焚薮而田方案基础上,为src文件夹添加1个新的花色,选择.NET
Core
中的Class Library(.NET
Core)
,并取名为MiddlewareApp,单击明确。

亚洲必赢官网 44

2.
打开Asp.NET_Core_Test下的Startup.cs文本,并行使以下代码片段替换Configure方法的内容,该代码片段成立在静态文件管道代理在此以前运转的内联合中学间件,代理为查询字符串中的当前呼吁设置文化。

亚洲必赢官网 45

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!");
    });
}

亚洲必赢官网 46

 

  1. 赶尽杀绝丢失的using语句。

亚洲必赢官网 47

  1. 运转应用程序。
    要在操作中查看中间件,请通过添加文化查询字符串来安装文化,例如 **

亚洲必赢官网 48

亚洲必赢官网 49

 

 

职分1 – 编写几个基于查询字符串值设置当前文化的中级件类

中间件是组建到应用程序管道中以拍卖请求和响应的零部件。
各个组件能够选用是或不是将请求传递到管道中的下二个零件,并且能够在管道中的下一个组件在此之前和后来执行有些操作。
请求代理用于创设此呼吁管道,然后用于拍卖对应用程序的种种HTTP请求。

伸手代理使用传递到起步类中的配置情势的IApplicationBuilder类型上的Run(运行),Map(映射)和Use(使用)扩大方法开始展览配置。
单个请求委托能够作为匿名格局在线钦点,也得以在可选择类中定义。
这几个可采取的类是中间件或中间件组件。
请求管道中的每其中间件组件负责调用链中的下多少个组件,恐怕只要适度,选取将链短路。

在此义务中,您将创造内联中间件。

1.
在在此以前的Asp.NET_Core_TEST杀鸡取卵方案基础上,为src文件夹添加一个新的档次,选择.NET
Core
中的Class Library(.NET
Core)
,并取名为MiddlewareApp,单击显著。

亚洲必赢官网 50

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!");
    });
}

 

  1. 化解丢失的using语句。

亚洲必赢官网 51

  1. 运作应用程序。
    要在操作中查看中间件,请通过丰盛文化询问字符串来设置文化,例如
    **

亚洲必赢官网 52

亚洲必赢官网 53

 

 

亚洲必赢官网 54

义务2 – 将中间件移动到祥和的品类

在此职责中,您将中间件移动到1个独立的公文。

  1. 右键单击MiddlewareApp类型,然后选择添加|
    类…,
    将文件命名为RequestCultureMiddleware.cs,然后单击添加。

2.
添加多个构造函数,它承受三个RequestDelegate参数并应用以下代码段将其分配给三个民用字段。
在急需时继续分析丢失的using语句。

RequestCultureMiddleware.cs

亚洲必赢官网 55

public class RequestCultureMiddleware
{
    private readonly RequestDelegate next;

    public RequestCultureMiddleware(RequestDelegate next)
    {
        this.next = next;
    }
}

亚洲必赢官网 56

亚洲必赢官网 57

  1. 加上以下措施与从前加上到Startup.cs文件的内联中间件委派的内容。

RequestCultureMiddleware.cs

亚洲必赢官网 58

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);
        }
    }
}

亚洲必赢官网 59

4.
在文件的最底层(也可独自出来),添加八个类,通过IApplicationBuilder上的恢弘方法公开中间件。

RequestCultureMiddleware.cs的公文尾部

亚洲必赢官网 60

public static class RequestCultureMiddlewareExtensions
{
    public static IApplicationBuilder UseRequestCulture(this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<RequestCultureMiddleware>();
    }
}

亚洲必赢官网 61

5.
赶回程序集Asp.NET_Core_TEST中,添加MiddlewareApp的Core类库引用,在Startup.cs文件中,使用对app.UseRequestCulture()情势的调用替换内联合中学间件委托,以将新的中等件类添加到HTTP管道。
完毕后,您的Configure措施应如下所示:

亚洲必赢官网 62

Startup.cs的Configure方法

亚洲必赢官网 63

public void Configure(IApplicationBuilder app)
{
    app.UseIISPlatformHandler();

    app.UseRequestCulture();

    app.Run(async (context) =>
    {
        await context.Response.WriteAsync($"Hello {CultureInfo.CurrentCulture.DisplayName}");
    });

}

亚洲必赢官网 64

  1. 运作应用程序,并表明中间件将来同日而语类运转。

 

职分2 – 将中间件移动到祥和的档次

在此职务中,您将中间件移动到1个独门的文书。

  1. 右键单击MiddlewareApp类型,然后选用添加|
    类…,
    将文件命名为RequestCultureMiddleware.cs,然后单击添加。

2.
添加2个构造函数,它接受1个RequestDelegate参数并运用以下代码段将其分配给1个私有字段。
在急需时继续分析丢失的using语句。

RequestCultureMiddleware.cs

public class RequestCultureMiddleware
{
    private readonly RequestDelegate next;

    public RequestCultureMiddleware(RequestDelegate next)
    {
        this.next = next;
    }
}

亚洲必赢官网 65

  1. 增进以下办法与原先足够到Startup.cs文件的内联合中学间件委派的情节。

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艺术应如下所示:

亚洲必赢官网 66

Startup.cs的Configure方法

public void Configure(IApplicationBuilder app)
{
    app.UseIISPlatformHandler();

    app.UseRequestCulture();

    app.Run(async (context) =>
    {
        await context.Response.WriteAsync($"Hello {CultureInfo.CurrentCulture.DisplayName}");
    });

}
  1. 运维应用程序,并表达中间件未来看作类运营。

 

亚洲必赢官网 67

职务3 – 向中间件添加选项

在此职分中,您将履新RequestCultureMiddleware落实以支撑将暗中认可文化设置为配置值。

  1. 右键单击MiddlewareApp花色并选取添加|
    类..
    .,将文件命名为RequestCultureOptions.cs,然后单击添加。

2.
在新类中,将享有CultureInfo的名为DefaultCulture的品质添加为项目,解析丢失的依靠关系。

public class RequestCultureOptions
{
    public CultureInfo DefaultCulture { get; set; }
}

3.
打开RequestCultureMiddleware.cs文件,并更新RequestCultureMiddleware构造函数以接受RequestCultureOptions参数,如以下代码段所示。

亚洲必赢官网 68

public class RequestCultureMiddleware
{
    private readonly RequestDelegate next;
    private readonly RequestCultureOptions options;

    public RequestCultureMiddleware(RequestDelegate next, RequestCultureOptions options)
    {
        this.next = next;
        this.options = options;
    }

    //...
}

亚洲必赢官网 69

4.
一旦在询问字符串中未钦赐任何内容,请更新中间件的Invoke措施以使用采用中的DefaultCulture品质,如以下代码段所示。

亚洲必赢官网 70

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);
}

亚洲必赢官网 71

5.
在同样文件中,使用以下代码片段替换RequestCultureMiddlewareExtensions类达成,该代码片段向利用RequestCultureOptionsUseRequestCulture方法添加了二个重载,并将它们传递到UseMiddleware
<RequestCultureMiddleware>
调用中。

亚洲必赢官网 72

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);
    }
}

亚洲必赢官网 73

6.
打开Startup.cs文本,并将配置情势中的后备文化设置为一些暗中认可值,例如。
zh-cn”。

app.UseRequestCulture(new RequestCultureOptions
{
     DefaultCulture = new CultureInfo("zh-cn")
});
  1. 运行应用程序,并表达当没有点名询问字符串时,暗中认可文化与布署的匹配。

 

 

职务3 – 向中间件添加选项

在此职务中,您将立异RequestCultureMiddleware贯彻以支撑将私下认可文化设置为配置值。

  1. 右键单击MiddlewareApp体系并精选添加|
    类..
    .,将文件命名为RequestCultureOptions.cs,然后单击添加。

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类落成,该代码片段向利用RequestCultureOptionsUseRequestCulture主意添加了二个重载,并将它们传递到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. 运作应用程序,并表达当没有点名询问字符串时,暗许文化与配置的协作。

 

 

 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         }

职责4 – 从文件读取请求文化布置

ASP.NET
Core的配置种类已经从初期版本的ASP.NET重新创设,后者注重于System.Configuration和XML配置文件,如web.config
新的配置模型提供了足以从各个提供程序检索的依照键/值的装置的简化访问。
然后,应用程序和框架可以接纳新的选项情势访问已配备的安装。

在此职责中,您将采用从JSON文件加载RequestCultureOptions的默许文化值的新布局连串。

 

1.
打开Startup.cs文件并累加一个名为布局项目IConfiguration的新的私家类字段,解析IConfiguration的遗失正视关系。

亚洲必赢官网 74

public class Startup
{
    private readonly IConfiguration configuration;

    // ...
}

亚洲必赢官网 75

2.
添加1个新的构造函数,使用ConfigurationBuilder在构造函数中开创三个新的Configuration目的,并将其分配给您在上一步中开创的布署类字段。

亚洲必赢官网 76

public Startup()
{
    var configuration = new ConfigurationBuilder()
        .Build();

    this.configuration = configuration;
}

亚洲必赢官网 77

3.
打开project.json文件,并在凭借关系节点中添加对Microsoft.Extensions.Configuration.Json包的引用。也得以经过Nuget引用。

亚洲必赢官网 78

"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-*"
  },

亚洲必赢官网 79

Nuget引用

亚洲必赢官网 80

4.
回到Startup.cs文本中,在作为链接方法创立ConfigurationBuilder目的之后立即添加对.AddJsonFile(“config.json”)的调用。

亚洲必赢官网 81

private readonly IConfiguration configuration;
public Startup(IHostingEnvironment env)
{
    var configuration = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)  //设置程序路径为根路径
        .AddJsonFile("config.json")
        .Build();

    this.configuration = configuration;
}

亚洲必赢官网 82

  1. 右键单击MiddlewareApp类型并精选加上|
    新建项目…,
    挑选JSON文件作为模板,将文件命名为config.json,然后单击添加。

6.
在新的config.json文件中,添加三个新的键/值对“culture”:“zh-cn”。

{
  "culture": "zh-cn"
}
  1. 开拓Startup.cs文件并立异代码以利用新的计划体系设置暗许文化。

    app.UseRequestCulture(new RequestCultureOptions
    {

      DefaultCulture = new CultureInfo(this.configuration["culture"] ?? "zh-cn")
    

    });

  2. 运作应用程序并表明默许文化是安排文件中安排的文件。

9.
在config.json文件少校文化值更新为“zh”,并刷新页面(不改变任何别的代码)。
请注意,音讯未变动,因为仅在应用程序运营时读取配置。

  1. 回到Visual Studio并按Ctrl + Shift + F5重新启航Web服务器。

  2. 归来浏览器并刷新页面; 它应有出示更新的音信。

 

任务4 – 从文件读取请求文化布署

ASP.NET
Core的布署连串现已从中期版本的ASP.NET重新创设,后者依赖于System.Configuration和XML配置文件,如web.config
新的配备模型提供了足以从种种提供程序检索的依照键/值的安装的简化访问。
然后,应用程序和框架可以行使新的选项格局访问已布局的设置。

在此职分中,您将采取从JSON文件加载RequestCultureOptions的默许文化值的新安顿体系。

 

1.
开辟Startup.cs文件并丰盛1个名为布局项目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引用

亚洲必赢官网 83

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;
}
  1. 右键单击MiddlewareApp品种并选拔增加|
    新建项目…,
    接纳JSON文件作为模板,将文件命名为config.json,然后单击添加。

6.
在新的config.json文件中,添加2个新的键/值对“culture”:“zh-cn”。

{
  "culture": "zh-cn"
}
  1. 打开Startup.cs文件并立异代码以使用新的配置种类装置暗中认可文化。

    app.UseRequestCulture(new RequestCultureOptions
    {

      DefaultCulture = new CultureInfo(this.configuration["culture"] ?? "zh-cn")
    

    });

  2. 运维应用程序并证实暗许文化是布局文件中布署的文书。

9.
在config.json文件元帅文化值更新为“zh”,并刷新页面(不转移任何其他代码)。
请注意,新闻未变更,因为仅在应用程序运转时读取配置。

  1. 回到Visual Studio并按Ctrl + Shift + F5双重起动Web服务器。

  2. 重返浏览器并刷新页面; 它应当显得更新的音信。

 

亚洲必赢官网 84

任务5 – 从注重注入系统到中间件的流水生产线选项

ASP.NET Core是从根本上规划的,协理和应用正视注入。 ASP.NET
Core应用程序可以透过将它们注入到Startup类中的方法中来选用内置框架服务,并且应用程序服务也能够配备为注入。
ASP.NET
Core提供的默许服务容器提供了1个一点都不大的成效集,并不用于替换其余容器。

在此职务中,您将动用重视注入系统陈设RequestCultureMiddleware选项。

 

  1. 更改RequestCultureMiddleware构造函数以利用IOptions
    <RequestCultureOptions>
    而不是RequestCultureOptions并获得options参数的值。
    化解丢失的依赖关系。

    public RequestCultureMiddleware(RequestDelegate next, IOptions options)
    {

     this.next = next;
     options = options.Value;
    

    }

2.
更新RequestCultureMiddlewareExtensions类,删除带有options参数的主意,并在另3个主意中调用UseMiddleware
<RequestCultureMiddleware>,
如上边的代码片段所示。

亚洲必赢官网 85

public static class RequestCultureMiddlewareExtensions
{
    public static IApplicationBuilder UseRequestCulture(this IApplicationBuilder builder)
    {
         return builder.UseMiddleware<RequestCultureMiddleware>();
    }
}

亚洲必赢官网 86

3.
Startup.cs中,将UseRequestCulture中间件更改为不接受别的参数。

app.UseRequestCulture();

4.
在位于同一文件中的ConfigureServices方法中,使用services.Configure
<RequestCultureOptions>
艺术添加一行配置文化,并累加对AddOptions办法的调用,如下边的代码片段所示。

亚洲必赢官网 87

public void ConfigureServices(IServiceCollection services)
{
    // DI的设置选项
    services.AddOptions();

    services.Configure<RequestCultureOptions>(options =>
    {
        options.DefaultCulture = new CultureInfo(this.configuration["culture"] ?? "zh-cn");
    });
}

亚洲必赢官网 88

  1. 运营应用程序并证实是还是不是正在从信赖注入系统中安顿选项。

 

义务5 – 从依赖注入系统到中间件的流水生产线选项

ASP.NET Core是从根本上统一筹划的,扶助和应用正视注入。 ASP.NET
Core应用程序能够透过将它们注入到Startup类中的方法中来采用内置框架服务,并且应用程序服务也得以配备为注入。
ASP.NET
Core提供的私下认可服务容器提供了三个微细的功能集,并不用于替换其余容器。

在此职分中,您将运用依赖注入系统布局RequestCultureMiddleware选项。

 

  1. 更改RequestCultureMiddleware构造函数以使用IOptions
    <RequestCultureOptions>
    而不是RequestCultureOptions并获得options参数的值。
    化解丢失的借助关系。

    public RequestCultureMiddleware(RequestDelegate next, IOptions options)
    {

     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");
    });
}
  1. 运作应用程序并证实是不是正在从倚重注入系统中布署选项。

 

亚洲必赢官网 89

勤学苦练4:向Web应用程序添加身份验证

ASP.NET Identity是二个成员身价系统,它同意你向应用程序添加登录功能。
用户能够应用用户名和密码创制帐户和登录,也得以选拔推文(Tweet),谷歌(Google),Microsoft帐户,推特(TWTR.US)等外部登录提供程序。

在本练习中,您将精通使用ASP.NET Identity的ASP.NET
Core项目模板的暗中认可配置,以及将Facebook配置为应用程序中的外部登录提供程序。

练习4:向Web应用程序添加身份验证

ASP.NET Identity是一个成员身价系统,它同意你向应用程序添加登录功用。
用户能够利用用户名和密码成立帐户和登录,也足以采取推特(TWTR.US)(Facebook),谷歌(Google),Microsoft帐户,Facebook等外部登录提供程序。

在本演习中,您将理解使用ASP.NET Identity的ASP.NET
Core项目模板的默许配置,以及将照片墙(TWTOdyssey.US)配置为应用程序中的外部登录提供程序。

  1. 丰硕一个控制器, 笔者将其取名为 AlipayController.cs

任务1 – ASP.NET Identity简介

在此职务中,您将通晓ASP.NET Core项目模板如何利用ASP.NET
Identity添加注册,登录和打消用户的作用。

  1. 打开Visual Studio 2015并选择文件| 新|
    项目…
    创设三个新的消除方案。

  2. 在“新建项目”对话框中,选择Visual C#|下的ASP.NET Web应用程序
    Web
    选项卡,并确定保证选拔.NET Framework 4.6
    将品种命名为MyWebApp,选取二个职分,然后单击分明。

亚洲必赢官网 90

始建新的ASP.NET Web应用程序项目

  1. 在“新建ASP.NET项目”对话框中,选拔ASP.NET
    5模板下的Web应用程序模板

    其余,请保管“身份验证”选项设置为“个人用户帐户”。 单击“确定”继续。

亚洲必赢官网 91

选择Web应用程序模板创立新品类

4.
项目创立后,打开project.json文本并找到Microsoft.AspNet.Identity.EntityFramework软件包。
此包全部实体框架完成的ASP.NET
Identity,将持久化ASP.NET身份数据和情势到SQL Server。

亚洲必赢官网 92

Microsoft.AspNet.Identity.EntityFramework包

  1. 拓展消除方案能源管理器中的References节点,然后开始展览DNX
    4.5.第11中学的Microsoft.AspNet.Identity.EntityFramework包。
    注意,它取决于Microsoft.AspNet.Identity,它是ASP.NET
    Identity系统的主要性参考汇编。 此程序集带有ASP.NET Identity的焦点接口集。

亚洲必赢官网 93

Microsoft.AspNet.Identity.EntityFramework包注重项

  1. 打开Startup.cs文件并找到ConfigureServices办法。
    在此措施中,身份服务由以下代码配置。

亚洲必赢官网 94

public void ConfigureServices(IServiceCollection services)
{
     // ...

     services.AddIdentity<ApplicationUser, IdentityRole>()
          .AddEntityFrameworkStores<ApplicationDbContext>()
          .AddDefaultTokenProviders();

     // ...
}

亚洲必赢官网 95

7.
在平等文件中,找到在启动实施流程中调用ConfigureServices办法后调用的Configure措施。
在此办法中,当调用UseIdentity格局时,将为应用程序启用ASP.NET
Identity
。 那会向请求管道添加基于Cookie的身份验证。

亚洲必赢官网 96

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
     // ...

     app.UseIdentity();

     // ...
}

亚洲必赢官网 97

8.
开拓放在Controllers文本夹的AccountController.cs文本,并找到具有HttpPost属性的Register操作。
此操作调用UserManager服务依据RegisterViewModel消息创造和登录用户。

亚洲必赢官网 98

[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);

            // ...

亚洲必赢官网 99

  1. 使用HttpPost属性找到Login操作。
    此操作使用SignInManager服务的PasswordSignInAsync艺术对用户展开签订契约。

亚洲必赢官网 100

[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)
        {
            // ...

亚洲必赢官网 101

  1. 现在,找到LogOff操作。
    此操作调用SignInManager服务的SignOutAsync主意,清除存款和储蓄在Cookie中的用户申明。

亚洲必赢官网 102

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> LogOff()
{
    await _signInManager.SignOutAsync();
    _logger.LogInformation(4, "User logged out.");
    return RedirectToAction(nameof(HomeController.Index), "Home");
}

亚洲必赢官网 103

  1. 运作消除方案并通过单击注册以查看ASP.NET
    Identity
    系统的操作来创造新用户。
    您能够调节AccountController中的不一致操作。

亚洲必赢官网 104

帐户注册视图

  1. 登记第2个用户后,您会看出一条错误新闻,提醒您使用现有迁移。
    单击应用迁移。 您今后将见到你以新用户地点登录。

  2. 悬停应用程序并浏览数据库,方法是导航到SQL
    Server对象财富管理器视图中的(localdb)MSSQLLocalDB / Databases /
    aspnet5-MyWebApp- / Tables

    右键单击dbo.AspNetUsers表并采纳“查看数据”以查看创制的用户的性情。

亚洲必赢官网 105

在SQL Server对象能源管理器中查看用户数据

任务1 – ASP.NET Identity简介

在此职分中,您将驾驭ASP.NET Core项目模板怎样行使ASP.NET
Identity添加注册,登录和收回用户的作用。

  1. 打开Visual Studio 2015并选择文件| 新|
    项目…
    制造一个新的化解方案。

  2. 在“新建项目”对话框中,选择Visual C#|下的ASP.NET Web应用程序
    Web
    选项卡,并保障选拔.NET Framework 4.6
    将项目命名为MyWebApp,选取多少个职位,然后单击鲜明。

亚洲必赢官网 106

创造新的ASP.NET Web应用程序项目

  1. 在“新建ASP.NET项目”对话框中,选拔ASP.NET
    5模板下的Web应用程序模板

    其它,请确认保障“身份验证”选项设置为“个人用户帐户”。 单击“确定”继续。

亚洲必赢官网 107

亚洲必赢官网,运用Web应用程序模板创立新类型

4.
品种创设后,打开project.json文件并找到Microsoft.AspNet.Identity.EntityFramework软件包。
此包全数实体框架达成的ASP.NET
Identity,将持久化ASP.NET身份数据和形式到SQL Server。

亚洲必赢官网 108

Microsoft.AspNet.Identity.EntityFramework包

  1. 开始展览化解方案能源管理器中的References节点,然后开始展览DNX
    4.5.第11中学的Microsoft.AspNet.Identity.EntityFramework包。
    注意,它取决于Microsoft.AspNet.Identity,它是ASP.NET
    Identity系统的要害参照汇编。 此程序集带有ASP.NET Identity的为主接口集。

亚洲必赢官网 109

Microsoft.AspNet.Identity.EntityFramework包重视项

  1. 开拓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);

            // ...
  1. 使用HttpPost性格找到Login操作。
    此操作使用SignInManager服务的PasswordSignInAsync措施对用户进行签字。

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task 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)
         {
             // ...
    
  2. 现在,找到LogOff操作。
    此操作调用SignInManager服务的SignOutAsync办法,清除存储在Cookie中的用户注解。

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task LogOff()
    {

    await _signInManager.SignOutAsync();
    _logger.LogInformation(4, "User logged out.");
    return RedirectToAction(nameof(HomeController.Index), "Home");
    

    }

  3. 运作消除方案并经过单击注册以查看ASP.NET
    Identity
    系统的操作来创建新用户。
    您能够调剂AccountController中的分化操作。

亚洲必赢官网 110

帐户注册视图

  1. 挂号第③个用户后,您晤面到一条错误音讯,提醒您使用现有迁移。
    单击应用迁移。 您今后将看到您以新用户地点登录。

  2. 停止应用程序并浏览数据库,方法是导航到SQL
    Server对象财富管理器视图中的(localdb)MSSQLLocalDB / Databases /
    aspnet5-MyWebApp- / Tables

    右键单击dbo.AspNetUsers表并精选“翻开数据”以查看创设的用户的性质。

亚洲必赢官网 111

在SQL Server对象财富管理器中查阅用户数量

代码:

职务2 – 使用外部提供程序启用身份验证

ASP.NET Core帮衬使用OAuth
2.0利用来源外部认证提供程序(如Facebook,Facebook,LinkedIn,Microsoft或谷歌)的凭证登录。
在你的网站中启用社交登录凭据提供了显着的优势,因为数百万用户已经颇具这一个外部提供商的帐户。
即使她们不用创建和记住一组新的凭据,这个用户恐怕更赞成于注册您的网站。

在此任务中,您将成立三个推特应用程序并配置您的Web应用程序项目(要求翻个墙),以使用户能够使用其推特(Twitter)帐户作为外部提供商登录。

1.
在浏览器中,导航到,然后经过输入您的推特(Twitter)凭据登录。要是你没有注册为照片墙开发职员,请单击注册为开发人士,并服从表达注册。

2.
在推特(Twitter)的开发职员主页上,通过单击添加新应用程序并从平台选取中精选网站添加新的应用程序。

  1. 在“网站快速入门”页面上,接纳“跳过并创造应用程序ID”。

4.
装置展现名称,例如ASP.NET社交登录,并选择连串,例如业务,然后按创制应用程序ID。

  1. 在安装页面包车型大巴主题部分中,单击添加平台以钦赐要添加网站应用程序。

  2. 从平台选拔中精选网站,添加您的网站网址(例如https://
    localhost:44300 /),然后点击上面包车型大巴保留更改。

7.
记下你的应用程序ID和应用程序密钥,以便你以往可以将它们增加到你的ASP.NET核心网站。

  1. 切换回Visual Studio,右键单击MyWebApp项目并选用管理用户秘密。

亚洲必赢官网 112

选取管理用户秘密

9.  在secrets.json文件中添加以下代码,将占位符替换为从Twitter获取的值。

亚洲必赢官网 113

{
  "Authentication": {
     "Facebook": {
        "AppId": "<your-app-id>",
        "AppSecret": "<your-app-secret>"
     }
  }
}

亚洲必赢官网 114

10.
打开project.json文件并添加Microsoft.AspNet.Authentication.Twitter包作为依靠关系

"dependencies": {
      ...
      "Microsoft.AspNet.Authentication.Facebook":  "1.0.0-rc1-final"
},

11.
打开startup.cs文件,并在Configure方法中添加推特(Twitter)中间件,如以下代码段所示。

亚洲必赢官网 115

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"];
    });

    // ...
}

亚洲必赢官网 116

  1. 运作应用程序并导航到登录页面,您将看到Twitter按钮。

亚洲必赢官网 117

采纳照片墙按钮登录页面

源码下载地址:

职责2 – 使用外部提供程序启用身份验证

ASP.NET Core辅助采纳OAuth
2.0使用来源外部认证提供程序(如推特(TWT宝马7系.US),推特(Twitter),LinkedIn,Microsoft或谷歌(Google))的凭证登录。
在您的网站中启用社交登录凭据提供了显着的优势,因为数百万用户已经具有这个外部提供商的帐户。
要是她们不要创立和挥之不去一组新的凭据,这几个用户只怕更倾向于注册您的网站。

在此任务中,您将开创三个推特(TWTR.US)(脸书)应用程序并安顿您的Web应用程序项目(须要翻个墙),以使用户能够运用其Instagram帐户作为外部提供商登录。

1.
在浏览器中,导航到,然后通过输入您的推特(TWT凯雷德.US)凭据登录。假如您没有注册为推文(Tweet)开发职员,请单击注册为开发人士,并根据表达注册。

2.
在推特的开发人员主页上,通过单击添加新应用程序并从阳台采取中挑选网站添加新的应用程序。

  1. 在“网站急忙入门”页面上,接纳“跳过并创设应用程序ID”。

4.
设置显示名称,例如ASP.NET社交登录,并精选项目,例如业务,然后按成立应用程序ID。

  1. 在装置页面的主导部分中,单击添加平台以钦定要添加网站应用程序。

  2. 从阳台选用中挑选网站,添加您的网站网址(例如https://
    localhost:44300 /),然后点击上面包车型客车保存更改。

7.
记下您的应用程序ID和应用程序密钥,以便你未来能够将它们增进到您的ASP.NET宗旨网站。

  1. 切换回Visual Studio,右键单击MyWebApp项目并精选管理用户秘密。

亚洲必赢官网 118

选择管理用户秘密

9.  在secrets.json文件中添加以下代码,将占位符替换为从Instagram获取的值。

{
  "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方法中添加推特中间件,如以下代码段所示。

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"];
    });

    // ...
}
  1. 运转应用程序并导航到登录页面,您将见到Instagram按钮。

亚洲必赢官网 119

利用Facebook按钮登录页面

源码下载地址:

亚洲必赢官网 120

备注

本小说所提及的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的文章。尽情期待。希望本文对你富有帮忙。

转载请注脚出处:

亚洲必赢官网 121

  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 }

亚洲必赢官网 122

亚洲必赢官网 123

 5. 修改 Views/Home/Index 页面,用于网站提交支付请求.

代码:

亚洲必赢官网 124

亚洲必赢官网 125

 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>

亚洲必赢官网 126

亚洲必赢官网 127

 完毕页面如下:

亚洲必赢官网 128

本篇小说到此甘休,具体效能可自动测试。多谢各位观察。

网站地图xml地图