>  기사  >  백엔드 개발  >  세션 분포에 대한 자세한 설명

세션 분포에 대한 자세한 설명

大家讲道理
大家讲道理원래의
2017-05-31 14:34:232723검색

1. 서문 및 복습


이전 글 SessionDistributed Sharing = Session + Redis + Nginx에서 많은 학생들이 메시지를 남기고 질문을 많이 했는데, 저는 그 중 일부는 다음과 같습니다: nginx가 중단되면 어떻게 해야 합니까? Microsoft 세션 솔루션과 비교하여 Redis 세션 솔루션을 사용하면 어떤 이점이 있습니까? Cookie도 Session을 대체할 수 있습니다. Redis의 Session 솔루션을 사용하면 어떤 이점이 있나요? Nginx의 iphash 방식이 뭔가요? MachineKey의 용도는 무엇인가요? Net Core를 구현하는 방법은 무엇입니까?

모든 분들의 질문을 보니 제 답변은 애플리케이션 수준에서 나온 것이었습니다. 기본 답변은 다음과 같이 요약할 수 있습니다. "부끄럽게도 당시에는 그의 진짜 장점이 무엇인지 완전히 이해하지 못했습니다. 직관과 경험을 바탕으로 이렇게 하는 것이 더 낫다는 것을 알았을 뿐입니다. 제어할 수 없으므로 처리해야 합니다. 분리, 시각화 및 클러스터링을 통해 시스템을 더욱 강력하게 만들 수 있지만 이론적 지원은 없습니다. 최근 정보를 참조하고 책을 읽은 후 이 기사에서는 이 세션 공유를 웹사이트 아키텍처의 유용성 관점에서 분석하고 설명하고 .net 코어를 사용하여 이 아키텍처 패턴을 다시 구현하겠습니다. (세션 분산 공유의 넷 코어 버전은 과거 경험은커녕 제작 환경에 적용할 가능성도 없어 연구용일 뿐입니다. 주의하시기 바랍니다. 정원에는 이미 관련 기사를 작성한 전문가들이 있습니다. 관련 글은 마지막에 올릴 예정입니다)

2. 웹사이트 가용성 - 세션 관리


가용성은 웹사이트 아키텍처에서 매우 중요한 부분입니다. 간단히 말해서 가용성이란 무엇입니까? , 사용자는 언제 어디서나 이 웹사이트를 열 수 있으며, 이 웹사이트의 모든 기능을 사용할 수 있습니다. 가용성이 낮으면 어떻게 되나요? 춘절 기간 동안 12306에서 티켓을 구하는 장면을 누구나 상상합니다. 웹사이트가 여러 가지 방식으로 충돌합니다. 여러분은 분명히 다음과 같이 생각할 것입니다. 티켓을 구매하는 다른 방법이 있다면 이 망가진 웹사이트 12306을 사용하지 않을 것입니다. 비즈니스 시나리오가 매우 극단적이기 때문에 이 예는 다소 극단적입니다. 물론 이러한 현상은 웹사이트 사용성에만 국한되는 문제는 아닙니다. 하지만 웹사이트가 3일마다 열리지 않거나 클릭하는 모든 페이지에 오류 페이지가 가득하고 작동에 대한 응답이 없습니다. 이 웹사이트를 계속 사용하시겠습니까? 나는 우리가 웹사이트를 탐색할 때 12306과 같은 독점 웹사이트처럼 사용할 수 없는 한, 우리는 반드시 떠나서 다른 유사한 웹사이트를 찾을 것이라고 믿습니다.

세션 관리는 웹사이트 가용성의 내용 중 하나입니다. Http가 Stateless 요청이라는 것은 누구나 알고 있습니다. 즉, 마지막 Http 요청의 관련 정보를 추적할 수 없지만 변경해야 할 필요성이 큽니다. Http는 비즈니스에서 Stateful 요청에 Session이 탄생했지만 분산 웹사이트 설계에서는 Stateless 요청이 웹사이트의 수평적 확장(애플리케이션 서버 추가 또는 제거)을 실현할 수 있으므로 Session 정보가 저장되어 있기 때문에 Session과 충돌합니다. 웹사이트 애플리케이션 서버 캐시에서는 서버를 추가할 수 없으므로 세션을 분리하는 것이 이 문제를 해결하는 열쇠입니다. 다음은 웹사이트의 일반적인 세션 관리 방법을 소개합니다.

1. 세션 복제

세션 복제는 기업 응용 프로그램 시스템에서 일반적으로 사용되는 최초의 서비스 클러스터 세션 관리 메커니즘입니다. 세션 복제 기능이 활성화되면 클러스터의 여러 서버 중 하나입니다. . 세션 간 Sessionobject을 동기화합니다. JBoss에는 이 기능이 Java에 있는 것 같습니다. .Net에서는 아직 모르겠습니다.

장점: 세션 정보를 빠르게 읽고 구현이 간단합니다.

단점 : 클러스터 규모가 커지면 서버간 Session 복제가 서버 자원과 네트워크 자원을 차지하게 되어 결국 시스템이 과부하가 걸리게 됩니다.

세션 분포에 대한 자세한 설명api가 바뀌었거나 말하는 환경이 바뀌었다는 말이 많이 통하고, 그 안에는 보지 못한 것들이 많이 있습니다. , 당신은 그것을 설명하기 위해 어떤 공식 단어를 사용해야하는지 모릅니다. 공무원은 이러한 새로운 것을 설명하기 위해 관련 단어를 찾고 있기 때문입니다. I 3) IIS에서 분리되어 크로스 플랫폼

대중적으로 말하면 Microsoft의 어머니는 새로운 환경에서 우리가 배고프지 않도록 배고프다는 말이 있습니다. 현재 환경(Windows+IIS)을 떠난 후. 그래서 그는 우리에게 언어(C#)를 가르쳐 주고, 돈을 벌 수 있는 도구(.Net Core+Kestrel)를 주면서 "자기야, 가서 스스로 일해라. 잠깐만, 잊지 마라"고 말했다. 이 Visa 카드를 가져오시면 됩니다." (.Net Core SDK) 정기적으로 돈을 보내드리겠습니다. ”

세션 분포에 대한 자세한 설명) NuGet은 점점 더 중요해지고 있습니다

몇 년간의 개발 끝에 NuGet은 점점 더 성숙해지고 있으며, .Net Core는 오픈소스입니다. 컴포넌트 획득의 주요 방법은 NuGet을 통한 것이며, 이를 통해 다양한 미들웨어 및 컴포넌트를 다운로드할 수 있으며, 편리하고 빠릅니다(네트워크 연결이 끊길 때도 있지만, 가정용 미러를 사용할 수 있음), NuGet은 Microsoft의 어머니가 우리에게 제공하는 주소록과 같으며 어떤 측면에서 도움이 필요하면 NuGet을 통해 7명의 이모와 8명의 이모를 찾아 도움을 받을 수 있다고 알려주세요.

3. 토폴로지 다이어그램

이전 기사의 성공적인 경험을 바탕으로 간단히 Windows 시스템과 .Net Core 프로그램을 호스팅하는 Ubuntu 시스템으로 변환했습니다. IIS 대신에 제가 말하고 싶은 것은 .Net Core는 글로벌화 원칙을 구현하고 기본적으로 IIS와 분리되어 있다는 것입니다. IIS에 .Net Core 프로그램을 배포하려면 동일한 것을 설치해야 합니다. 풀도 "비관리 코드"가 되어야 합니다.

세션 분포에 대한 자세한 설명. 세션을 사용하여 .Net Core 프로그램 개발

세션 분포에 대한 자세한 설명-1. 웹 프로그램 만들기

세션 분포에 대한 자세한 설명

Vs2017을 사용하여 .Net Core 웹 애플리케이션을 생성합니다. 인증정보 建

세션 분포에 대한 자세한 설명-2, .net 코어 생성 후, 세션 호출

세션 분포에 대한 자세한 설명

Net 코어 세션을 사용하려면 다음이 필요합니다. Session 관련 NuGet 패키지를 참고하기 위해 온라인으로 확인한 결과 .Net Core의 공식 Session 구성 요소가 미들웨어와 유사하며 공식적으로 Redis를 지원하는 것으로 나타났습니다. 세션 분포에 대한 자세한 설명

세션 분포에 대한 자세한 설명

참고: .Net Core의 Mvc는 Session을 직접 사용할 수 없습니다. 프로그램에 HttpContext.Session을 작성하면 다음 오류가 나타납니다.

Session 하지 않았다 이 애플리케이션 또는 요청에 대해 구성되었습니다.

세션 분포에 대한 자세한 설명

세션 분포에 대한 자세한 설명-2-1、Microsoft.AspNetCore.Session

.Net Core를 설치해야 Session Microsoft.AspNetCore.Session을 사용할 수 있습니다. 패키지는 다음과 같이 설치됨 그림:

세션 분포에 대한 자세한 설명

세션 분포에 대한 자세한 설명-2-2, 세션을 사용할 수 있도록 Startup.cs 수정

해당 위치에 강조 표시된 코드 추가 service s. 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?}");
     });
}

세션 분포에 대한 자세한 설명-2-3, 세션 쓰기 및 읽기

세션 리딩 방법은 .Net과 동일하지만 작성 방법은 다음과 같으며 Session의 HttpContext.Session.SetString 또는 HttpContext.Session.Set 메서드는 각각 string 및 Bytearray을 지원하므로 복잡한 엔터티에는 세션에서 Json Store로 변환됩니다.

【세션 작성 방법】

<br>

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

【세션 읽기 방법】

<br>

HttpContext.Session.GetString("key")

세션 분포에 대한 자세한 설명. 세션 저장 미디어 교체 Redis

세션 분포에 대한 자세한 설명 -1. 먼저 Redis를 구성하세요

자세한 구성 방법은 Session 분산 공유 = Session + Redis + Nginx

<br>

redis-server redis.windows.conf

자세한 구성 방법은 Session을 참고하세요. 배포 공유 = 세션 + Redis + Nginx

세션 분포에 대한 자세한 설명-2. Microsoft.Extensions.Caching.Redis.Core

NuGet에서 Microsoft.Extensions.Caching.Redis.Core를 검색하여 설치합니다. NuGet 패키지는 캐싱의 확장입니다. 즉, 캐싱 저장 매체

세션 분포에 대한 자세한 설명

세션 분포에 대한 자세한 설명-3을 대체할 수 있습니다. appsettings.json은 Redis 연결 문자열을 구성합니다.

appsettings.json은 Redis 연결 문자열(web.config의 appsetting 노드 구성과 동일), 참고: 추가 위치는 Logging 위에 있어야 합니다. 그렇지 않으면 읽을 수 없습니다. 아래 강조 표시된 부분에 코드를 추가하세요

<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.세션 분포에 대한 자세한 설명; background-color: #ffff00">  },</span>
"Logging": {    "IncludeScopes": false,    "LogLevel": {      "Default": "Warning"
    }
  }
}

세션 분포에 대한 자세한 설명 -세션 분포에 대한 자세한 설명, Startup.cs ConfigureServices 메서드에 대한 참조 추가

<br>

<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.세션 분포에 대한 자세한 설명; background-color: #ffff00">=><br></span><span style="line-height: 1.세션 분포에 대한 자세한 설명; 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是否入库。

세션 분포에 대한 자세한 설명

세션 분포에 대한 자세한 설명-세션 분포에 대한 자세한 설명、发布前指定IP和端口(重要) 

         如果你没有看这个步骤,继续下面发布步骤,等你发布时候,你会发现一个尴尬的问题,就是你用IP访问不了你的网站,用localhost可以访问,.Net Core默认是세션 분포에 대한 자세한 설명000端口,端口占用也会让你的网站访问不了。

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

세션 분포에 대한 자세한 설명

<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) 설치 Windows Server Hosting (x6세션 분포에 대한 자세한 설명 & x86), 은 IIS와 동일합니다. 설치 시 인터넷에 주의해주세요. (sdk가 자동으로 다운로드되는 것 같은데 자세한 내용은 자세히 살펴보지 않았습니다. ).

세션 분포에 대한 자세한 설명

2) 확인을 위해 dotnet 명령을 입력하세요. "'dotnet'이 내부 또는 외부 명령이 아닌 경우" "C:Program Filesdotnet" 폴더에서 dotnet.exe를 찾아 cmd를 사용하세요. dotnet.exe를 호출하여 실행하거나 시스템 환경 변수를 추가합니다 (창의 cmd 명령은 명령 작성 시 .exe를 저장할 수 있습니다. 즉, dotnet 명령은 dotnet.exe입니다.) 1] w Win7에서 오류 메시지 표시: 실패 [C: Program Filesdotnetfxr1.0.1hostfxr.dll]에서 dll을 로드하려면 hresult: 0x800700세션 분포에 대한 자세한 설명7

세션 분포에 대한 자세한 설명

솔루션: 丁 补 패치 설치 필요: kb2세션 분포에 대한 자세한 설명33623

다운로드 주소는 다음과 같습니다:

세션 분포에 대한 자세한 설명Https: // Support.microsoft.com/en-us/kb/2세션 분포에 대한 자세한 설명33623

【Pit 2】

.net Core 버전에 주의하세요. 다음 두 스크린샷은 잘못된 버전을 누른 결과입니다. -2, Ubuntu 설치.Net Core 릴리스 환경[10.2.107.세션 분포에 대한 자세한 설명6]

Ubuntu에 .Net Core 설치공식적으로 작성되어 있으니 Linux 시스템과 충돌하지 마세요. 충돌하는 경우 .Net Core를 사용하지 마십시오. Ubuntu와 Linux의 관계를 모르는 경우 Baidu로 이동하십시오.

마지막으로 dotnet 명령을 사용할 수 있는지 확인합니다.

6-3. 웹사이트 게시

프로젝트를 마우스 오른쪽 버튼으로 클릭 ->게시...

세션 분포에 대한 자세한 설명<br><br>

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

세션 분포에 대한 자세한 설명

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

        说明:我的项目叫做세션 분포에 대한 자세한 설명生成了세션 분포에 대한 자세한 설명这个为主要的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这个应用程序。)

세션 분포에 대한 자세한 설명

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

세션 분포에 대한 자세한 설명

 cmd命令找到PublishOutput

<br>

cd C:\PublishOutput

세션 분포에 대한 자세한 설명

dotnet运行网站命令

dotnet SessionTest.dll

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

세션 분포에 대한 자세한 설명

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

세션 분포에 대한 자세한 설명

 

6-3-2、Ubuntu启动.Net Core网站[10.2.107.세션 분포에 대한 자세한 설명6:7201]

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

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

dotnet SessionTest.dll

세션 분포에 대한 자세한 설명

访问http://10.2.107.세션 분포에 대한 자세한 설명6:7201/

세션 분포에 대한 자세한 설명

7、Nginx配置

7-1、网站端口修改

        nginx.conf配置修改

세션 분포에 대한 자세한 설명

        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.세션 분포에 대한 자세한 설명6: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-세션 분포에 대한 자세한 설명、Nginx启动命令

        C:\server\nginx-1.0.2>start nginx

        或

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

7-세션 분포에 대한 자세한 설명、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中啥样,见下图:

세션 분포에 대한 자세한 설명

       数据保护(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文件

세션 분포에 대한 자세한 설명세션 분포에 대한 자세한 설명

 

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>
  <creationdate>2017-0세션 분포에 대한 자세한 설명-27T06:1세션 분포에 대한 자세한 설명:07.219세션 분포에 대한 자세한 설명692Z</creationdate>
  <activationdate>2017-0세션 분포에 대한 자세한 설명-27T06:1세션 분포에 대한 자세한 설명:07.18세션 분포에 대한 자세한 설명세션 분포에 대한 자세한 설명6세션 분포에 대한 자세한 설명7Z</activationdate>
  <expirationdate>2017-07-26T06:1세션 분포에 대한 자세한 설명:07.18세션 분포에 대한 자세한 설명세션 분포에 대한 자세한 설명6세션 분포에 대한 자세한 설명7Z</expirationdate>
  <descriptor>
    <descriptor>
      <encryption></encryption>
      <validation></validation>
      <masterkey>
        <!-- Warning: the key below is in an unencrypted form. -->
      <value>HOz세션 분포에 대한 자세한 설명8FE6STtDHlMo2ZONoPgPTOOjRPikRWXmHOwNDS세션 분포에 대한 자세한 설명o6NPb세션 분포에 대한 자세한 설명hlgl/DxXUhat66soovBUFy1APXCQ세션 분포에 대한 자세한 설명z30DDPyw==</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.세션 분포에 대한 자세한 설명6这台Linux虚拟机。

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

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

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

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

 

 

세션 분포에 대한 자세한 설명 6. Postscript & Reflections


이 글을 통해 모든 분들이 웹사이트의 유용성을 간단하게 이해하고 Redis에 Session을 저장하는 것의 장점을 이해할 수 있기를 바랍니다. 이 기사에서는 웹사이트 사용성 콘텐츠의 빙산의 일각을 소개하고 있으며, 아직 우리가 배우고 축적해야 할 지식이 많이 있습니다.

.Net Core 버전의 세션 분산 공유를 통해 .Net Core의 고성능, 크로스 플랫폼 및 오픈 소스로 인해 많은 사람들이 .Net Core에 대한 견해를 바꾸게 되었습니다. 아직 중국 시장에서 갈 길이 멀다고 생각합니다. .Net Core는 중국에서 .Net 언어의 시장 점유율을 뒤집을 수 있는 만능 무기는 아닙니다. 진짜 묘책은 매일 프로그램을 작성하는 우리 같은 .Neter일 수 있습니다. Microsoft가 .Net Core를 많이 홍보하고 성공 사례가 어디에나 있더라도 새로운 지식을 배우고 이해하지 않으면 결국 도태될 것입니다. 언어는 단지 도구일 뿐입니다. 끊임없는 학습과 노력, 소화, 흡수 및 최종적으로 다른 사람들과의 공유를 통해서만 우리는 가장 큰 이득을 얻을 수 있습니다. 갈림길에서 혼란스러울 때, 우리 자신의 경험을 향상시키기 위한 새로운 지식과 방법을 배우는 것은 어떨까요? 그리고 경험. 나는 종종 다른 사람들에게 일을 시작하면서 가장 중요한 것은 지식이 아니라 일을 처리하는 스타일과 목표를 달성하는 인내심이라고 말합니다. “상황을 바꾸는 것은 쉽지만 어렵습니다. 성격을 바꾸려면." 나쁜 일하는 태도와 방법이 있으면 그것은 일하는 습관이 되었습니다. 언어나 직업, 심지어 업종을 바꾸더라도 경력 발전에 큰 영향을 미칠 것입니다. 좋은 습관은 지속되어야 한다. 어떤 것들은 하루 이틀 지속할 수 있지만, 3개월 이상 지속하면 몇 년은 커녕 불가능한 일이 된다. 천 마일도 갈 수 없습니다." 나는 매일 자신을 단련하는 것을 지속해야만 성장할 수 있습니다. 왜냐하면 나는 천재가 아니며 성장하려면 노력이 필요하다는 것을 알기 때문입니다.

“현실적인 사람이 되어 성실하게 일하세요.” 나는 나의 노력이 보상받을 것이라고 굳게 믿고 있지만 아직 기회를 잡지 못했습니다. 마지막으로 .Net Core를 활용한 개발을 위해 최전선에서 열심히 노력하고 있는 분들께 경의를 표하고 싶습니다. 위 요약은 제가 끓인 진한 맛의 닭육수인데, 일 외의 미루는 일을 언제 바꿀 수 있을까요? 정말 비극이군요. . . 갑자기 나는 얄리산이 거대하고 나쁜 습관은 바꾸기 어렵다는 것을 깨달았습니다! 이것을 경고로 받아들여주세요! 물론, 일 중독자가 되지 마십시오. 건강이 더 중요하며 가족과 더 많은 시간을 보낼 수 있습니다.

세션 분포에 대한 자세한 설명세션 분포에 대한 자세한 설명 세션 분포에 대한 자세한 설명

개인적인 의견, 지식과 경험에 따른 분석은 일방적일 수 있으니 양해 부탁드립니다. 7. 참조 기사

ASP.NET Core는 세션 캐싱을 위해 Redis 및 Protobuf를 사용합니다.


.Net 핵심 세션 사용

Asp.net Core는 Redis를 사용하여 세션을 저장합니다세션 분포에 대한 자세한 설명>

ASP.NET Core 및 MVC Core에서 세션 및 HttpContext 사용

.NET Core와 .NET Framework Mono L 간의 관계 VirtualBox 설정의 Ubuntu 및 Windows 공유 폴더

분산형 asp.net 코어 웹 구축

ASP.NET Core 데이터 보호

험난한 길: ASP.NET Core 1.0 신원 인증(중앙 세트)

Net core 1.0은 다중 서버 싱글 사인온 로드를 구현합니다

위 내용은 세션 분포에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.