9159金沙游艺场

图片 10
C#多线程编程系列(三)- 线程同步
图片 10
Vue按需加载提升用户体验

【转载】ASP.NET Core Web 支付功能接入 支付宝-电脑网页支付篇

转自:

  • 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中使用
开源项目 Payment,实现接入支付宝-电脑网页支付接口及同步跳转及异步通知功能。

1.1. 中间件原理

目录

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

开发环境:Win 10 x64、VS2017 15.6.4、.NET Core SDK 2.1.101、.NET Core
Runtime 2.0.6

1.1.1. 什么是中间件

中间件是段代码用于处理请求和响应,通常多个中间件链接起来形成管道,由每个中间件自己来决定是否要调用下一个中间件。

9159金沙游艺场 1

2017-10-10-21-47-00

先决条件

完成此模块需要以下内容:

  • 9159金沙游艺场,Visual Studio Community 2015或更高版本
  • ASP.NET Core 1.0

1.新建”ASP.NET Core Web 应用程序”项目,我将它命名为AlipaySample.

1.1.2. 中间件执行过程

举一个示例来演示中间件的执行过程(分别有三个中间件:日志记录、权限验证和路由):当请求进入应用程序时,执行执行日志记录的中间件,它记录请求属性并调用链中的下一个中间件权限验证,如果权限验证通过则将控制权传递给下一个中间件,不通过则设置401
HTTP代码并返回响应,响应传递给日志中间件进行返回。

9159金沙游艺场 2

2017-10-10-22-47-32

练习

此模块包括以下练习:

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

估计完成此模块的时间:60分钟

注意:首次启动Visual Studio时,必须选择一个预定义的设置集合。
每个预定义集合旨在匹配特定的开发样式,并确定窗口布局,编辑器行为,智能感知代码片段和对话框选项。
本模块中的过程描述了在使用“常规开发设置”集合时,在Visual
Studio中完成给定任务所需的操作。
如果为开发环境选择不同的设置集合,那么您应该考虑的步骤可能会有所不同。

9159金沙游艺场 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文件)是应用程序将直接提供给客户端的资产。

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

 

 

9159金沙游艺场 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并选择文件|
    新项目…开始一个新的解决方案

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

9159金沙游艺场 5

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

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

9159金沙游艺场 6

使用ASP.NET Core空模板创建新项目

4.
Microsoft.AspNet.StaticFiles包添加为project.json的依赖项,可以在dependencies节点下添加。

9159金沙游艺场 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"
  },

9159金沙游艺场 8

   当然,也可以通过Nuget添加相关的依赖包

9159金沙游艺场 9

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

9159金沙游艺场 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!");
    });
}

9159金沙游艺场 11

6.
wwwroot文件夹中创建一个名为index.html的文件,其中包含以下内容。

9159金沙游艺场 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>

9159金沙游艺场 13

  1. 运行应用程序并导航到根。 它应该显示hello world中间件。

9159金沙游艺场 14

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

9159金沙游艺场 15

 

 

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

1.3. Cookies和session中间件

任务2 – 添加默认文档支持

为了让您的Web应用程序提供默认页面,而用户不必完全限定URI,就可以使用UseDefaultFiles扩展方法。
此方法是实际上不提供文件的URL重写程序。

除了UseStaticFilesUseDefaultFiles扩展方法之外,还有一个方法
– UseFileServer –
组合这两种方法的功能以及UseDirectoryBrowser扩展方法。

在此任务中,您将使用UseFileServer启用服务静态和默认文件。

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

9159金沙游艺场 16

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

9159金沙游艺场 17

  1. 再次运行应用程序。 导航到网站根目录时,应显示默认页面index.html

 

9159金沙游艺场 18

1.3.1. Session

HTTP是一个无状态协议,Web服务器将每一个请求都视为独立请求。并且不保存之前请求中用户的值。

Session 状态是ASP.NET
Core提供的一个功能,它可以在用户通应用访问网络服务器的时候保存和存储用户数据。由服务器上的字典和散列表组成,Session状态通过浏览器的请求中得到,Session的数据保存到缓存中。

ASP.NET Core通过包含Session
ID的Cookie来维护会话状态,每个请求都会携带此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中间件的每个请求都会重置超时时间。

练习2:路由和MVC简介

路由是映射到处理程序的URL模式。 处理程序可以是物理文件,例如Web
Forms应用程序中的.aspx文件。
处理程序也可以是处理请求的类,例如MVC应用程序中的控制器。

ASP.NET路由使您能够使用不必映射到网站中特定文件的URL。
由于网址不必映射到文件,因此您可以使用描述用户操作的网址,因此用户更容易理解。

在本练习中,您将了解如何在应用程序中配置路由。

9159金沙游艺场 19

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启动成功:

9159金沙游艺场 20

2017-10-30-20-33-47

相关配置

首先需要用Nuget安装包Microsoft.Extensions.Caching.Redis,安装成功以后就可以在app.csproj文件中可以看到。

9159金沙游艺场 21

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值显示为空

9159金沙游艺场 22

2017-10-31-06-47-24

当点击SetSessionValue以后,再次回到ShowRedis页面,Session就值显示出来了

9159金沙游艺场 23

2017-10-31-23-56-58

看到apptestvalue代表Session值已经存到Redis里面,怎样证明apptestvalue值是从Redis里面取到呢?接下来就证明给大家看。

任务1 – 添加MVC

ASP.NET
MVC为您提供了一个强大的,基于模式的方式来构建动态网站,使清晰分离的问题,并让您完全控制标记的愉快,敏捷开发。
ASP.NET MVC包括许多功能,创建使用最新的Web标准的复杂应用程序。

在此任务中,您将配置项目以使用ASP.NET MVC并配置示例路由。

1.
打开project.json文件并将Microsoft.AspNet.Mvc添加到依赖关系部分。并添加runtimes节点,保证正常运行

9159金沙游艺场 24

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

9159金沙游艺场 25

9159金沙游艺场 26

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

9159金沙游艺场 27

2.
解决方案资源管理器中,右键单击Asp.NET_Core_TEST项目,然后选择添加|
新文件夹
,并将文件夹命名为Controllers

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

  2. 使用以下代码段替换文件的内容。

9159金沙游艺场 28

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

9159金沙游艺场 29

5.
现在,打开Startup.cs文件,将MVC服务和中间件添加到配置中,添加services.AddMvc()并使用UseMvc方法替换Configure方法中的app.Run方法调用,如下面的代码片段所示。

9159金沙游艺场 30

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

9159金沙游艺场 31

  1. 运行网站并通过导航到/ home端点验证从MVC控制器返回的消息。

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

 

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

1.3.3. 实现分布Session

前面已经将Session保存到Redis中,但是大家不清楚这个值是否是真的保存到Redis里面去了还是在项目内存中;所以这里就实现在两个不的应用程序(或两台不同的机器)中共享Session,也就是实现分布式Session,分布式即代表了不同的机器不同的应用程序,但往往有下面的一种尴尬的情况,就算是每个HTTP请求时都携带了相同的cookie值。

9159金沙游艺场 32

2017-10-30-20-35-19

造成这个的问题的原因是每个机器上面的ASP.NET
Core的应用程序的密钥是不一样的,所以没有办法得到前一个应用程序保存的Session数据;为了解决这个问题,.NET
Core团队为提供了Microsoft.AspNetCore.DataProtection.AzureStorageMicrosoft.AspNetCore.DataProtection.Redis包将密钥保存到Azure或Redis中。这里选择将密钥保存到Redis。

9159金沙游艺场 33

共享密钥

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

9159金沙游艺场 34

2017-10-31-23-41-37

  • 由于在同一台机器上,ASP.NET
    Core程序默认启动的时候端口为5000,由于app1已经占用了,所以将app2的启端口设置为5001

9159金沙游艺场 35

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

9159金沙游艺场 22

2017-10-31-06-47-24

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

9159金沙游艺场 37

2017-11-01-00-04-13

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

9159金沙游艺场 38

2017-11-01-00-00-30

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

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

可以合并到HTTP请求管道中的小应用程序组件统称为中间件。 ASP.NET Core
1.0具有对中间件的集成支持,它们在应用程序启动期间在应用程序的Configure方法中连接。

在本练习中,您将创建一个基于查询字符串值设置当前文化的中间件类。

注意:我们在本练习中使用本地化相关中间件作为示例场景,但在大多数应用程序中,您将使用ASP.NET
Core的内置支持本地化支持。

代码:

1.4. 总结

本节讲解了中间件的运行原理及配置过程,中间件之间对象依赖关系的配置和平时项目中常用到Session的配置问题。并在实际代码展示了怎样使用中间件实现分布式Session。

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

任务1 – 编写一个基于查询字符串值设置当前文化的中间件类

中间件是组装到应用程序管道中以处理请求和响应的组件。
每个组件可以选择是否将请求传递到管道中的下一个组件,并且可以在管道中的下一个组件之前和之后执行某些操作。
请求代理用于构建此请求管道,然后用于处理对应用程序的每个HTTP请求。

请求代理使用传递到启动类中的配置方法的IApplicationBuilder类型上的Run(运行),Map(映射)和Use(使用)扩展方法进行配置。
单个请求委托可以作为匿名方法在线指定,也可以在可重用类中定义。
这些可重用的类是中间件或中间件组件。
请求管道中的每个中间件组件负责调用链中的下一个组件,或者如果适当,选择将链短路。

在此任务中,您将创建内联中间件。

1.
在之前的Asp.NET_Core_TEST解决方案基础上,为src文件夹添加一个新的项目,选择.NET
Core
中的Class Library(.NET
Core)
,并命名为MiddlewareApp,单击确定。

9159金沙游艺场 39

2.
打开Asp.NET_Core_Test下的Startup.cs文件,并使用以下代码片段替换Configure方法的内容,该代码片段创建在静态文件管道代理之前运行的内联中间件,代理为查询字符串中的当前请求设置文化。

9159金沙游艺场 40

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

9159金沙游艺场 41

 

  1. 解决丢失的using语句。

9159金沙游艺场 42

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

9159金沙游艺场 43

9159金沙游艺场 44

 

 

相关文章

No Comments, Be The First!
近期评论
    功能
    网站地图xml地图