C# 单例服务中如何维护请求会话

C# 单例服务中如何维护请求会话,c#,.net,microservices,azure-service-fabric,C#,.net,Microservices,Azure Service Fabric,我在启动文件中配置我的服务,如下所示。将多次调用DocClient以获取响应。作为它的单例,服务器将有一个共享对象。它如何确保和维护所有请求的会话 services.AddSingletonASP.NET Core通过向客户端提供包含会话ID的cookie来维护会话状态,会话ID随每个请求一起发送到应用程序。应用程序使用会话ID获取会话数据 会话状态显示以下行为: 由于会话cookie是特定于浏览器的,因此不会跨浏览器共享会话。 浏览器会话结束时,将删除会话cookie。 如果接收到过期会话的c

我在启动文件中配置我的服务,如下所示。将多次调用DocClient以获取响应。作为它的单例,服务器将有一个共享对象。它如何确保和维护所有请求的会话


services.AddSingleton

ASP.NET Core通过向客户端提供包含会话ID的cookie来维护会话状态,会话ID随每个请求一起发送到应用程序。应用程序使用会话ID获取会话数据

会话状态显示以下行为:

由于会话cookie是特定于浏览器的,因此不会跨浏览器共享会话。 浏览器会话结束时,将删除会话cookie。 如果接收到过期会话的cookie,将创建一个使用相同会话cookie的新会话。 不保留空会话会话会话中必须至少设置一个值,才能跨请求持久化会话。当会话未保留时,将为每个新请求生成一个新的会话ID。 在最后一次请求后,应用程序将在有限的时间内保留会话。应用程序设置会话超时或使用默认值20分钟。会话状态非常适合存储特定于特定会话但不需要跨会话永久存储的用户数据。 在调用ISession.Clear实现或会话过期时删除会话数据。 没有默认机制通知应用程序代码客户端浏览器已关闭,或者客户端上的会话cookie已删除或过期

内存缓存提供程序将会话数据存储在应用所在服务器的内存中。在服务器场场景中:

-使用粘性会话将每个会话绑定到单个服务器上的特定应用程序实例。默认情况下,Azure应用程序服务使用应用程序请求路由ARR强制执行粘性会话。然而,粘性会话会影响可伸缩性,并使web应用程序更新复杂化。更好的方法是使用Redis或SQL Server分布式缓存,它不需要粘性会话。有关详细信息,请参阅

-会话cookie通过IDataProtector加密。必须正确配置数据保护以读取每台机器上的会话cookie。有关详细信息,请参阅ASP.NET核心数据保护和密钥存储提供程序

配置会话状态 Microsoft.AspNetCore.App元包中包含的Microsoft.AspNetCore.Session包提供了用于管理会话状态的中间件。要启用会话中间件,启动必须包含:

任何IDistributedCache内存缓存。IDistributedCache实现用作会话的备份存储。有关详细信息,请参阅。 对ConfigureServices中AddSession的调用。 在配置中调用UseSession。 以下代码显示如何使用IDistributedCache的默认内存内实现设置内存内会话提供程序:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        services.AddDistributedMemoryCache();

        services.AddSession(options =>
        {
            // Set a short timeout for easy testing.
            options.IdleTimeout = TimeSpan.FromSeconds(10);
            options.Cookie.HttpOnly = true;
        });

        services.AddMvc()
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();
        app.UseSession();
        app.UseHttpContextItemsMiddleware();
        app.UseMvc();
    }
}

感谢Mohit对用户会话的解释。正如对不同用户的描述,将创建不同的会话。由于我的服务是单例的,它如何为所有会话的事务操作共享资源。如何确保在同时服务多个请求时不违反单例原则。请查看我的更新答案。基本上,您将在整个会话中共享一个objectsingleton对象,您需要维护的唯一一件事就是并发性。希望能有帮助。