Maison  >  Article  >  développement back-end  >  Explication détaillée de la distribution des sessions

Explication détaillée de la distribution des sessions

大家讲道理
大家讲道理original
2017-05-31 14:34:232768parcourir

1. Avant-propos et revue


Dans l'article précédentSessionDistribution En mode partagé = Session + Redis + Nginx, de nombreux étudiants ont laissé des messages et m'ont posé de nombreuses questions Parmi elles, les plus impressionnantes sont : Que dois-je faire si nginx plante ? Quels sont les avantages d’utiliser la solution Redis Session par rapport à la solution Microsoft Session ? Cookie peut également remplacer Session. Quels sont les avantages d'utiliser la solution Session de Redis ? Quelle est la méthode iphash de Nginx ? A quoi sert MachineClé ? Comment mettre en œuvre Net Core ?

Quand j'ai vu les questions de tout le monde, ma réponse était uniquement au niveau de l'application. La réponse de base peut être résumée comme suit : « D'autres ont fait cela et ont résolu ce problème. en utilisant cette méthode. Veuillez consulter le lien pour le principe. "J'ai honte de dire qu'à ce moment-là, je n'avais pas pleinement compris son véritable avantage. Je savais juste qu'il valait mieux le faire en me basant sur l'intuition et l'expérience. Je savais quand. Lorsque certaines choses sont incontrôlables, les découpler, les visualiser et les regrouper peut rendre un système plus robuste, mais il n'existe aucun support théorique. Après avoir consulté des informations et lu des livres récemment, j'ai une compréhension approfondie de cela. Cet article analysera et expliquera ce partage de session du point de vue de la convivialité de l'architecture du site Web , et utilisera le noyau .net pour l'implémenter à nouveau Architectural. motifs. (La version net core du partage distribué de session n'a aucune chance d'être appliquée à l'environnement de production, encore moins à l'expérience passée, elle est donc uniquement destinée à la recherche. Veuillez faire attention, mais il y a des experts dans le jardin qui ont déjà écrit des articles pertinents. Cet article Les articles pertinents seront publiés à la fin)

2. Disponibilité du site Web - Gestion des sessions


La convivialité est un élément très important de l'architecture d'un site Web. Qu'est-ce que la convivialité ? Pour le dire simplement, cela signifie que les utilisateurs peuvent ouvrir ce site Web à tout moment et n'importe où, et que les fonctions qu'il contient peuvent être utilisées. Que se passe-t-il si la disponibilité est faible ? Tout le monde imagine la scène de la récupération des billets au 12306 pendant la Fête du Printemps. Vous penserez certainement : s'il existe d'autres moyens d'acheter des billets, je n'utiliserai pas ce site Web en panne 12306. Cet exemple est un peu extrême car le scénario commercial est assez extrême. Bien entendu, ce phénomène n’est pas seulement un problème de convivialité du site Web. Mais un site Web ne peut pas être ouvert tous les trois jours, ou chaque page sur laquelle vous cliquez est pleine de pages d'erreur et aucune réponse aux opérations. Utiliserez-vous toujours ce site Web ? Je crois que lorsque nous parcourons le site Web, tant qu'il n'est pas disponible comme un site Web monopolistique comme 12306, nous partirons certainement et chercherons d'autres sites Web similaires.

La gestion des sessions est l'un des contenus de la convivialité du site Web. Tout le monde sait que Http n'a pas de demande de statut , c'est-à-dire le dernier Http. la demande ne peut pas être suivie Informations connexes, mais dans les affaires, il existe un grand besoin de transformer Http en requêtes avec état, et la session est générée en conséquence. Cependant, dans la conception de sites Web distribués, les requêtes sans état peuvent réaliser l'expansion horizontale du site Web (ajout ou suppression). serveurs d'applications), il y a donc C'est contradictoire avec la Session, car si les informations de Session sont stockées dans le cache du serveur d'applications du site Web, le serveur supplémentaire ne sera pas utilisable. Par conséquent, le découplage de la Session est nécessaire. la clé pour résoudre ce problème. Ce qui suit présente les outils de gestion de sessions courants sur le site Web.

1. La réplication de session

La réplication de session est le premier système d'application d'entreprise et est couramment utilisé Un mécanisme de gestion de session de cluster de services qui active la fonction de réplication de session, qui consiste à synchroniser l'objet Session entre plusieurs serveurs du cluster Il semble que JBoss ait cette fonction en Java, mais .Net l'est. pas encore au courant.

Avantages : Les informations de session sont rapides à lire et faciles à mettre en œuvre.

Inconvénients : Lorsque l'échelle du cluster est grande, la réplication de session entre les serveurs occupera les ressources du serveur et les ressources du réseau , et le système finira par être submergé.

Explication détaillée de la distribution des sessions

2. Liaison de session

La liaison de session est généralement assurée par des serveurs de charge d'équilibrage soft/hard. Cette fonction, pour exemple : la méthode IPhash de Nginx dans l'article précédent, le serveur d'équilibrage de charge utilise l'algorithme de hachage pour allouer la même IP au même serveur, c'est-à-dire que la session est liée à un serveur spécifique, garantissant que la session peut toujours être obtenue sur ce serveur, également connu sous le nom de persistance de session.

Inconvénient : Si un serveur tombe en panne, la Session sur ce serveur n'existera plus, et l'utilisateur demande à passer à An une erreur s'est produite sur d'autres serveurs car il n'y avait pas de session.

Explication détaillée de la distribution des sessions

3. Utilisez un cookie pour enregistrer la session

L'enregistrement des informations de session via des cookies est une méthode utilisée par la plupart des sites Web. Cette méthode est également une très bonne solution mature tant que les cookies ne sont pas abusés. La session d'enregistrement des cookies consiste à mettre certaines informations d'état sur le client, et elles doivent être transmises au serveur pour chaque demande.

Avantages : Cette méthode est simple et facile à mettre en œuvre, a une haute disponibilité, prend en charge l'expansion horizontale du serveur et la solution est mature

Inconvénients : SécuritéLe sexe, le cookie a une limite de taille et la transmission du cookie à chaque demande affectera les performances

Explication détaillée de la distribution des sessions

Explication détaillée de la distribution des sessions. Serveur de session

Serveur de session C'est une très bonne solution pour gérer la session de cette manière, car la session est générée pour les besoins de l'entreprise avec l'état Http et la conception de sites Web distribués préconise l'apatridie Http. Afin de répondre à cette conception, le serveur de session utilisera une session avec état. . Les informations sont séparées du serveur d'applications sans état, puis conçues en fonction des différentes caractéristiques des différents serveurs. Par exemple : si nous stockons les informations de session dans Redis, il existe de nombreuses bonnes solutions pour la configuration du cluster et les paramètres de stabilité de Redis. Si nous stockons la session dans Memcache, alors la configuration du cluster de Memcache, il y en aura également beaucoup. cas pour les paramètres de stabilité. De cette façon, nous simplifions certains problèmes.Si nous utilisons .Net Session seul, nous devons comprendre des éléments plus profonds dans .Net et les transformer pour garantir leur convivialité et leur stabilité. Plus les choses sont profondes, plus il faut de temps et d'expérience. Si vous transférez le support de stockage de session vers Redis, la solution de cluster Redis et les outils de gestion sont très matures. Il vous suffit de configurer la configuration pour résoudre le problème de session.

Avantages : Haute disponibilité, haute sécurité, bonne évolutivité, hautes performances, taille d'information illimitée

Explication détaillée de la distribution des sessions

3.Net Core+Redis+Nginx implémente le partage distribué de session


1. Préparation préliminaire & environnement

(1)Vs2017 (2).Net Core 1.1 (3) Win 7 (Explication détaillée de la distribution des sessions )ubuntu 16.0Explication détaillée de la distribution des sessions

2. Introduction à .Net Core

Avec Avec le développement de l'Internet, sur le marché chinois d'aujourd'hui (pas très clair dans les pays étrangers), l'open source et le multiplateforme sont l'un des indicateurs importants pour mesurer la qualité d'un langage et d'une technologie afin de promouvoir l'open source et le multiplateforme .Net. , Microsoft a lancé .Net Core.

Voir l'article de Daniel pour plus de détails : La relation entre .NET Core, .NET Framework et Mono

Parlons-en à propos de mes premiers sentiments à propos de .Net Core :

1) .Net Core n'a pas renversé la précédente C#grammaire

En termes simples, je parlais chinois (C#), mais maintenant je parle toujours chinois, mais l'environnement dans lequel je parle a changé.

2) Parce que .Net Core vient de démarrer, l'API a changé ou manque beaucoup

                                                                                                                                             mais l'environnement de parole a changé, et il y a beaucoup de choses que vous n'avez jamais vues auparavant, vous ne savez pas quels mots officiels utiliser pour les décrire parce que les fonctionnaires recherchent des mots pertinents pour les décrire. de nouvelles choses.

3) Rompre avec IIS, multiplateforme

En termes simples, c'est la mère de Microsoft qui veut nous empêcher d'entrer dans un nouvel environnement. J'ai faim et j'ai peur de ne pas savoir comment survivre après avoir quitté l'environnement actuel (Windows + IIS). Alors, il nous a appris le langage (C#), nous a donné les outils pour gagner de l'argent (.Net Core+Kestrel) et nous a dit : « Vas-y, gamin, va travailler tout seul, attends une minute, n'oublie pas pour apporter cette carte Visa." (SDK .Net Core), je vous enverrai de l'argent régulièrement. "

Explication détaillée de la distribution des sessions) NuGet devient de plus en plus important

NuGet est devenu de plus en plus mature après plusieurs années de développement. C'est la principale méthode pour obtenir des composants open source .Net Core. Grâce à NuGet, vous pouvez télécharger divers middleware. et des composants, et c'est pratique et rapide (sauf parfois déconnecté d'Internet, mais vous pouvez utiliser des miroirs domestiques), NuGet est comme un carnet d'adresses que nous a donné la mère de Microsoft, et nous dit que si vous avez besoin d'aide sur certains aspects, vous pouvez trouver vos sept tantes et huit tantes grâce à l'aide de NuGet.

3. Diagramme de topologie

Explication détaillée de la distribution des sessions

Basé sur l'expérience réussie des précédentes articles , une simple modification, un système Windows et un système Ubuntu au milieu hébergent le programme .Net Core Certaines personnes se demanderont pourquoi Windows n'a pas IIS. Ce que je veux dire, c'est que .Net Core implémente le principe de go. global et est fondamentalement séparé d'IIS. Si vous souhaitez déployer le programme .Net Core sur IIS, vous devez installer la même application, et le pool d'applications configuré sur le site doit également être modifié en "code non géré". ".

Explication détaillée de la distribution des sessions. Développer le programme .Net Core à l'aide de Session

Explication détaillée de la distribution des sessions-1 Créer un programme Web.

Utilisez Vs2017 pour créer une application Web .Net Core, et cette application ne contient pas d'informations d'authentification

Explication détaillée de la distribution des sessions

Explication détaillée de la distribution des sessions

La création est la suivante

Explication détaillée de la distribution des sessions

Explication détaillée de la distribution des sessions-2, .Net Core appelle Session

>Citation Package NuGet lié à Session. Après avoir vérifié en ligne, j'ai découvert que le composant Session officiel de . Net Core est similaire à un middleware et prend officiellement en charge Redis.                                    Utiliser la session directement Si vous écrivez une HttpContext.Session dans le programme, l'erreur suivante apparaîtra :

La session a n'a pas été configuré pour cette application ou demande.

Explication détaillée de la distribution des sessions

Explication détaillée de la distribution des sessions-2-1, Microsoft.AspNetCore.Session

  .Net Core doit installer Microsoft.AspNetCore.Session lors de l'utilisation de Session. L'installation de son package NuGet est la suivante :

Explication détaillée de la distribution des sessions

Explication détaillée de la distribution des sessions-2-2. Modifier Startup.cs pour rendre la session disponible

  Ajouter le code en surbrillance à l'emplacement correspondant services.AddSession(); app.UseSession();

<br>

public void ConfigureServices(IServiceCollection services)
 {     // Add framework services.     services.AddMvc();     services.AddSession();
 }
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
     loggerFactory.AddConsole(Configuration.GetSection("Logging"));
     loggerFactory.AddDebug();     if (env.IsDevelopment())
     {
          app.UseDeveloperExceptionPage();
          app.UseBrowserLink();
     }     else
     {
          app.UseExceptionHandler("/Home/Error");
     }

     app.UseStaticFiles();     app.UseSession();
     app.UseMvc(routes =>
     {
          routes.MapRoute(
          name: "default",
          template: "{controller=Home}/{action=Index}/{id?}");
     });
}

Explication détaillée de la distribution des sessions-2-3, Séance d'écriture et de lecture

La méthode de lecture de Session est différente de .Net Elle est écrite comme suit, et le HttpContext de la Session. La méthode .Session .SetString ou HttpContext.Session.Set prend en charge respectivement String et ByteArray, les entités complexes doivent donc être converties into Json est stocké dans Session.

[Méthode d'écriture de session]

<br>

HttpContext.Session.SetString("key", "strValue");

[Méthode de lecture de session]

<br>

HttpContext.Session.GetString("key")

Explication détaillée de la distribution des sessions. Changez le support de stockage de la session en Redis

Explication détaillée de la distribution des sessions-1. Configurez d'abord Redis

Pour les méthodes de configuration détaillées, voir : Partage distribué de session = Session + Redis + Nginx

<br>

redis-server redis.windows.conf

Pour les méthodes de configuration détaillées, voir : Partage distribué de session = Session + Redis + Nginx

Explication détaillée de la distribution des sessions-2 Installer Microsoft.Extensions.Caching.Redis.Core

<.>

Recherchez Microsoft.Extensions.Caching.Redis.Core dans NuGet et installez-le. Ce package NuGet est une extension de Caching, c'est-à-dire que vous pouvez remplacer le support de stockage Caching <.>

Explication détaillée de la distribution des sessions

Explication détaillée de la distribution des sessions-3. appsettings.json configure la chaîne de connexion Redis

appsettings.json Configurez la chaîne de connexion Redis (équivalent à la configuration du nœud appsetting dans web.config Remarque : la position d'ajout doit être au-dessus de Logging, sinon elle ne peut pas être lue. Ajoutez le code comme partie en surbrillance ci-dessous

<br>

<span style="color: #000000">{<br><br></span><span style="background-color: #ffff00"><span style="color: #800000">  "</span><span style="color: #800000">Data</span><span style="color: #800000">"</span>: <span style="color: #800000">"RedisConnection</span><span style="color: #800000">"</span></span><span style="background-color: #ffff00">,<br><span style="color: #800000">"</span><span style="color: #800000">ConnectionStrings</span><span style="color: #800000">"</span></span><span style="background-color: #ffff00">: { <br><span style="color: #800000">    "</span><span style="color: #800000">RedisConnection</span><span style="color: #800000">"</span>: <span style="color: #800000">"</span><span style="color: #800000">192.168.8.138:6379</span><span style="color: #800000">"<br></span></span><span style="line-height: 1.Explication détaillée de la distribution des sessions; background-color: #ffff00">  },</span>
Explication détaillée de la distribution des sessions-Explication détaillée de la distribution des sessions Ajouter une référence à la méthode ConfigureServices de Startup.cs
"Logging": {    "IncludeScopes": false,    "LogLevel": {      "Default": "Warning"
    }
  }
}

<.>

<span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span><span style="color: #000000"> ConfigureServices(IServiceCollection services)
        {            </span><span style="color: #008000">//</span><span style="color: #008000"> Add framework services.</span><span style="color: #000000">            services.AddMvc();<span style="background-color: #ffff00">            services.AddDistributedRedisCache(option </span></span><span style="line-height: 1.Explication détaillée de la distribution des sessions; background-color: #ffff00">=><br></span><span style="line-height: 1.Explication détaillée de la distribution des sessions; background-color: #ffff00">            {       </span>

                   //redis 数据库连接字符串<br>                   option.Configuration = Configuration.GetConnectionString("RedisConnection");<br>                   //redis 实例名<br>                   option.InstanceName = "master";<br>              });<br>              services.AddSession();<br>

<br>

          }

         页面运行HttpContext.Session.GetString("key"),然后用Redis管理工具RedisDesktopManager查询Session是否入库。

Explication détaillée de la distribution des sessions

Explication détaillée de la distribution des sessions-Explication détaillée de la distribution des sessions、发布前指定IP和端口(重要) 

         如果你没有看这个步骤,继续下面发布步骤,等你发布时候,你会发现一个尴尬的问题,就是你用IP访问不了你的网站,用localhost可以访问,.Net Core默认是Explication détaillée de la distribution des sessions000端口,端口占用也会让你的网站访问不了。

         只需要在Program.cs中添加高亮代码即可,细心地人已经看到.UseUrls(new string[] { }) 传入的是个数组,那么这里定义多个网站,当你执行时候dotnet命令时候,多个网站都会启动。

Explication détaillée de la distribution des sessions

<br>

public static void Main(string[] args)
        {            var host = new WebHostBuilder()

                  //增加处,*号表示ip <br>                  .UseUrls(new string[] { "http://*:7201})

                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseStartup<startup>()
                .UseApplicationInsights()
                .Build();

            host.Run();
        }</startup>

6、.Net Core 发布

6-1、Windows安装.Net Core发布环境[10.2.107.100]

1) Installer Hébergement Windows Server (x6Explication détaillée de la distribution des sessions et x86), est équivalent à IIS, veuillez faire attention à Internet lors de l'installation ( il semble que le SDK soit téléchargé automatiquement, je ne l'ai pas étudié attentivement).

Explication détaillée de la distribution des sessions

                                                                              :Fichiers de programme dotnet" dotnet.exe dans le dossier, utilisez cmd pour appeler dotnet.exe à exécuter, ou ajoutez l'environnement système variable (la commande cmd dans la fenêtre peut enregistrer .exe lors de l'écriture de commandes, c'est-à-dire que la commande dotnet est dotnet.exe)

Explication détaillée de la distribution des sessions

pit 1]

Dans Win7, j'invite un erreur : échec du chargement de la DLL depuis [C: Program Filesdotnetfxr1.0.1hostfxr.dll], hsult : 0x800700Explication détaillée de la distribution des sessions7

Explication détaillée de la distribution des sessions  

Solution :

 

Vous devez installer le patch : KB2Explication détaillée de la distribution des sessions33623

 

L'adresse de téléchargement est la suivante :

 

https://support.microsoft. com/en-us/kb/2Explication détaillée de la distribution des sessions33623

【Pit 2】

6-2. Ubuntu installe l'environnement de version .Net Core

[10.2.107.Explication détaillée de la distribution des sessions6]

Explication détaillée de la distribution des sessions<br><br>

>L'écriture officielle est très détaillée, il suffit de suivre et n'entrez pas en conflit avec le système Linux Si vous le faites, n'utilisez pas .Net Core. Si vous ne connaissez pas la relation entre Ubuntu et Linux, veuillez Baidu.

Enfin, vérifiez si la commande dotnet peut être utilisée.

6-3. Site de publication Explication détaillée de la distribution des sessions

Cliquez avec le bouton droit sur le projet - >Publier…

Explication détaillée de la distribution des sessions

       点击发布按钮,生成的文件如下(SessionTest为应用程序名)

Explication détaillée de la distribution des sessions

        好了,有了这些文件,我们只需要把这些文件扔到服务器上就成了,但是怎么启动呢?通过查询,网上说只要用dotnet命令就成。继续实践…

        说明:我的项目叫做Explication détaillée de la distribution des sessions生成了Explication détaillée de la distribution des sessions这个为主要的dll,也是程序的入口。

        大家都知道.Net Core是跨平台的,不同系统的服务器环境配置好了,网上查询说是使用dotnet命令启动网站,那么可以推断出几个平台的dotnet命令是一样的。

6-3-1、Windows启动.Net Core网站[10.2.107.100:7201]

         启动.Net Core网站的命令很简单,安装好发布环境的应用程序,C:\Program Files\dotnet目录如下(如果dotnet命令不能用,可以直接调用dotnet.exe这个应用程序。)

Explication détaillée de la distribution des sessions

         将生成好的网站复制到服务器上

Explication détaillée de la distribution des sessions

 cmd命令找到PublishOutput

<br>

cd C:\PublishOutput

Explication détaillée de la distribution des sessions

dotnet运行网站命令

dotnet SessionTest.dll

成功以后(之后再编译运行,会提示下面截图)

Explication détaillée de la distribution des sessions

访问http://10.2.107.100:7201/(如果一台机子有多个网卡多个IP,其他IP的7201端口也是个独立网站)

Explication détaillée de la distribution des sessions

 

6-3-2、Ubuntu启动.Net Core网站[10.2.107.Explication détaillée de la distribution des sessions6:7201]

想办法将发布的程序复制到Ubuntu上面去,我测试使用的VBox虚拟机。

具体方法传送门:virtualbox中ubuntu和windows共享文件夹设置

dotnet SessionTest.dll

Explication détaillée de la distribution des sessions

访问http://10.2.107.Explication détaillée de la distribution des sessions6:7201/

Explication détaillée de la distribution des sessions

7、Nginx配置

7-1、网站端口修改

        nginx.conf配置修改

Explication détaillée de la distribution des sessions

        listen   80; 改成 listen   81; 因为一般都被80都被使用。

<br>

server {
        listen       81;
        ……
}

7-2、增加负载均衡

  nginx.conf中添加upstream节点

upstream Jq_one { <br>      server 10.2.107.100:7201; <br>       server 10.2.107.Explication détaillée de la distribution des sessions6:7201;

} server {
.....
}

 

7-3、location节点修改

<br>

location / {
            root   html;
            index  index.aspx index.html index.htm;            #其中jq_one 对应着upstream设置的集群名称
            proxy_pass         http://Jq_one;             #设置主机头和客户端真实地址,以便服务器获取客户端真实IP
            proxy_set_header   Host             $host; 
            proxy_set_header   X-Real-IP        $remote_addr; 
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
}

7-Explication détaillée de la distribution des sessions、Nginx启动命令

        C:\server\nginx-1.0.2>start nginx

        或

        C:\server\nginx-1.0.2>nginx.exe

7-Explication détaillée de la distribution des sessions、Nginx重新载入命令

      C:\server\nginx-1.0.2>nginx.exe -s reload

 

四、黎明前的黑暗-MachineKey


 

      本以为做了上述准备和相关代码编写,就能够实现Session共享了,结果我想的太简单了,应用程序发布后并不能实现Session共享,难道分布式共享下Session需要特殊处理?.Net我是怎么实现的,它们的方法应该方法类似。我突然想到了MachineKey这个东西,之前在.Net版本分布式共享时候需要添加这个东西,评论也有人问我什么要加MachineKey。后来只能搜索.Net Core Machinekey关键词,找到了以下几篇文章做参考。

      搭建分布式 ASP.NET Core Web

      ASP.NET Core 数据保护(Data Protection)

      坎坷路:ASP.NET Core 1.0 Identity 身份验证(中集)

      net core 1.0 实现负载多服务器单点登录

      此问题属于数据安全问题,微软在开发.Net Core中延续了之前的设计,采用数据保护(Data Protection)方式对一些内部数据进行加密解密设计,如:Session、Cookie等(远不止这些)。这样可以保证数据的真实性、完整性、机密性、隔离性。数据安全必然离不开加解密算法,大家想一下之前.Net的WebFrom中的ViewState,它最终解析到Html页面是个hidden标签里面有一串很复杂的字符串,这个字符串是被数据保护(Data Protection)机制加密过的。Session也一样,大家可以看看Session存到Redis中啥样,见下图:

Explication détaillée de la distribution des sessions

       数据保护(Data Protection)有个特性是隔离性,大家可以想象一下,数据保护核心是加密解密,常见的加密方式有对称加密和非对称加密,上一篇做分布式共享时候,两台机子拷贝了同样的MahcineKey,那么他的内部加密猜测好像是对称加密,MachineKey直译中文为“机器钥匙”在联想隔离性,那么可以推断出来不同机子密钥是不同的,那么MachineKey的作用是统一不同机子的密钥。(吐血中…….这个只是个猜测,详细原理请参考专业文章)

1、提取.Net Core的MachineKey

        .Net Core的MachineKey存储是以key-xxxx-xxxx-xxxx-xxxx.xml的形式存储的,那如何提取这个xml信息呢?

       Startup.cs的ConfigureServices添加下图高亮代码

<br>

public void ConfigureServices(IServiceCollection services)
        {

              //抽取key-xxxxx.xml <br>

            services.AddDataProtection().PersistKeysToFileSystem(new DirectoryInfo(@"D:\XML"));
            services.AddSession();
            services.AddDistributedRedisCache(option =>
            {                //redis 数据库连接字符串
                option.Configuration = Configuration.GetConnectionString("RedisConnection");                //redis 实例名
                option.InstanceName = "master";
            });
            services.AddMvc();
        }

       查看D:\Xml里的xml文件

Explication détaillée de la distribution des sessionsExplication détaillée de la distribution des sessions

 

2、重写IXmlRepository接口固定Key

       在项目中添加CustomXmlRepository.cs类,其中keyContent中填写key.xml内容,注意:里面的几个时间(现在还不能确定expirationDate对项目是否有影响),有人问我KeyContent能否从文件里读,回答是可以,但是ubuntu的文件路径保准不是Windows的d:\之类的,需要使用Linux的写法,所以干脆字符串来的快。

<br>

using Microsoft.AspNetCore.DataProtection.Repositories;using Microsoft.AspNetCore.Http;using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Threading.Tasks;using System.Xml.Linq;namespace SessionTest
{    public class CustomXmlRepository : IXmlRepository
    {        private readonly string keyContent =@"<?xml  version=&#39;1.0&#39; encoding=&#39;utf-8&#39;?>
<key d de la distribution des sessions38d-9eaexplication sessions-explication sessionsexplication sessionsfb-a690-explication sessions38c8d788619>
  <creationdate>2017-0Explication détaillée de la distribution des sessions-27T06:1Explication détaillée de la distribution des sessions:07.219Explication détaillée de la distribution des sessions692Z</creationdate>
  <activationdate>2017-0Explication détaillée de la distribution des sessions-27T06:1Explication détaillée de la distribution des sessions:07.18Explication détaillée de la distribution des sessionsExplication détaillée de la distribution des sessions6Explication détaillée de la distribution des sessions7Z</activationdate>
  <expirationdate>2017-07-26T06:1Explication détaillée de la distribution des sessions:07.18Explication détaillée de la distribution des sessionsExplication détaillée de la distribution des sessions6Explication détaillée de la distribution des sessions7Z</expirationdate>
  <descriptor>
    <descriptor>
      <encryption d de la distribution des sessions6_cbc></encryption>
      <validation d de la distribution des sessions6></validation>
      <masterkey d de la distribution des sessions:requiresencryption="'true' xmlns:pExplication" sessions="'http://schemas.asp.net/201Explication">
        <!-- Warning: the key below is in an unencrypted form. -->
      <value>HOzExplication détaillée de la distribution des sessions8FE6STtDHlMo2ZONoPgPTOOjRPikRWXmHOwNDSExplication détaillée de la distribution des sessionso6NPbExplication détaillée de la distribution des sessionshlgl/DxXUhat66soovBUFy1APXCQExplication détaillée de la distribution des sessionsz30DDPyw==</value>
      </masterkey>
    </descriptor>
  </descriptor>
</key>";         
        public virtual IReadOnlyCollection<xelement> GetAllElements()
        {            return GetAllElementsCore().ToList().AsReadOnly();
        }        private IEnumerable<xelement> GetAllElementsCore()
        {            yield return XElement.Parse(keyContent);
        }        public virtual void StoreElement(XElement element, string friendlyName)
        {            if (element == null)
            {                throw new ArgumentNullException(nameof(element));
            }
            StoreElementCore(element, friendlyName);
        }        private void StoreElementCore(XElement element, string filename)
        {
        }
    }
}</xelement></xelement>

修改Startup.cs文件中的ConfigureServices方法加载自定义的CustomXmlRepository类

<br>

public void ConfigureServices(IServiceCollection services)
        {            ////抽取key-xxxxx.xml
            //services.AddDataProtection()            //        .PersistKeysToFileSystem(new DirectoryInfo(@"D:\XML"));            services.AddSingleton<ixmlrepository>();</ixmlrepository>

              services.AddDataProtection(configure =>

            {
                configure.ApplicationDiscriminator = "newP.Web";
            });

            services.AddSession();
            services.AddDistributedRedisCache(option =>
            {                //redis 数据库连接字符串
                option.Configuration = Configuration.GetConnectionString("RedisConnection");                //redis 实例名
                option.InstanceName = "master";
            });

            services.AddMvc();

        }

五、实现效果演示


         演示效果说明

         本机127.0.0.1也为10.2.107.100,因为电脑性能有限,没有弄windows虚拟机,只弄了10.2.107.Explication détaillée de la distribution des sessions6这台Linux虚拟机。

         MachineKey的这个实现思路也可以用到.Net Core的身份验证上。

         UNC文件也可以实现Session共享方式

         原理就是Windows和Linux通过文件共享和挂载的方式Key.xml共享一个文件,但是总觉得有点怪怪的,共享文件会不会被别人恶意篡改,所以最后采用重写的方式实现。

         对UNC方式感兴趣的请看:搭建分布式 ASP.NET Core Web

 

 

Explication détaillée de la distribution des sessions 6. Post-scriptum et pensées


J'espère que vous Vous pouvez lire cet article, permettre à chacun d'avoir une compréhension simple de la convivialité du site Web et de comprendre les avantages du stockage de session dans Redis. Cet article présente la pointe de l'iceberg en matière de contenu ergonomique des sites Web, et il reste encore beaucoup de connaissances que nous devons apprendre et accumuler.

La version .Net Core du partage distribué de Session nous donne une compréhension préliminaire de .Net Core Les hautes performances, multiplateformes et open source de .Net Core ont fait de nombreuses personnes. changer Mon opinion sur .Net, mais .Net Core a encore un long chemin à parcourir sur le marché chinois. Je pense que .Net Core n'est pas une solution miracle pour inverser la part de marché du langage .Net en Chine. La véritable solution miracle pourrait être .Neter, comme nous qui écrivons des programmes tous les jours. Même si Microsoft fait beaucoup la promotion de .Net Core et que les réussites sont partout, si nous n’apprenons pas et ne comprenons pas de nouvelles connaissances, nous finirons par être éliminés. La langue n'est qu'un outil. Ce n'est que grâce à un apprentissage continu et à un travail acharné, à la digestion, à l'absorption et enfin au partage des connaissances avec les autres que nous pouvons obtenir le plus grand gain. Lorsque nous sommes confus à la croisée des chemins, pourquoi ne pas apprendre de nouvelles connaissances et méthodes pour améliorer notre propre expérience. et l'expérience. Je dis souvent aux autres que la chose la plus importante au cours des premières années de travail n'est pas la connaissance, mais votre façon de faire les choses et votre persévérance pour atteindre vos objectifs. Comme le dit le proverbe : « Il est facile de changer la situation, mais c'est difficile. changer la nature." Si vous avez une mauvaise attitude et méthode de travail, c'est devenu votre habitude de travail. Même si vous changez de langue, de travail ou même de secteur, cela aura un grand impact sur votre développement de carrière. Les bonnes habitudes doivent être conservées. Certaines choses peuvent être conservées pendant un jour ou deux, mais si vous persistez pendant plus de trois mois, cela devient une tâche impossible, sans parler de quelques années. "Si vous n'accumulez pas de petits pas, on ne peut pas atteindre des milliers de kilomètres." Ce n'est qu'en persistant à me perfectionner chaque jour que je pourrai grandir, car je sais que je ne suis pas un génie et qu'il faut travailler dur pour grandir.

« Soyez une personne terre-à-terre et faites les choses consciencieusement. » Je crois fermement que mes efforts seront récompensés, mais je n'ai pas encore saisi l'opportunité. Enfin, je voudrais rendre hommage à ceux qui travaillent dur en première ligne pour développer en utilisant .Net Core.

Le résumé ci-dessus est la riche soupe au poulet pour l'âme que j'ai cuisinée Explication détaillée de la distribution des sessions, mais quand puis-je me débarrasser de ma procrastination en dehors du travail Explication détaillée de la distribution des sessions, cet article a ? J'ai pris du retard. La procrastination, le journal continue de tergiverser, l'apprentissage de l'anglais tergiverse, il y a encore beaucoup de choses à faire mais ça continue de tergiverser, c'est une tragédie Explication détaillée de la distribution des sessions. . . Soudain, j’ai réalisé que la montagne Yali est immense et que les mauvaises habitudes sont difficiles à changer ! Veuillez prendre cela comme un avertissement ! Bien sûr, ne soyez pas un bourreau de travail. Une bonne santé est plus importante et vous pouvez passer plus de temps avec votre famille.

Opinion personnelle, l'analyse peut être unilatérale en raison des connaissances et de l'expérience, s'il vous plaît donne-moi plus de compréhension.

7. Articles de référence


🎜 >ASP.NET Core utilise Redis et Protobuf pour la mise en cache de session

.Net Core Session utilise détaillée de la distribution des sessions>

Asp.net Core utilise Redis pour stocker la session

Utilisation de sessions et HttpContext dans ASP.NET Core et MVC Core

La relation entre .NET Core, .NET Framework et Mono

Ubuntu dans virtualbox Shared paramètres du dossier avec Windows

Créer un Web ASP.NET Core distribué

Protection des données ASP.NET Core (protection des données)

Route cahoteuse : authentification d'identité ASP.NET Core 1.0 (concentrée)

net core 1.0 réalise l'authentification unique multi-serveurs de charge

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn