Asp.NET网站Session浅谈

.NET网站在Web.config的<configuration>下<system.web>下<sessionState>配置session.

sessionState节点的mode属性可以设置为:Custom、InProc、Off、SQLServer、StateServer,默认是InProc,和网站保存在同一进程,如: IIS的运用程序连接池进程w3wp.exe。

一、Session是如何工作的?Session和Cookie的关系

  默认情况下,Session是依赖cookie的,当服务器保存了一个Session后...  

二、InProc的弊端

  InProc模式的时候,如果网站中的web.config文件,dll文件,网站的Session会丢失。这种模式,Session有时候好像也不是很稳定,我们可以尝试StateServer模式。

三、如何使用StateServer保存Session?

  1. 启动ASP.NET 状态服务

    Windows系统,安装了.NET Framework之后,会自动安装一个服务:ASP.NET State Service(ASP.NET 状态服务),默认服务不启动,使用ASP.NET状态服务,首先要启动这个服务。

    服务启动后,系统会开启一个进程aspnet_state.exe,会话会单独保存在这个进程里面。

  2. 用aspnet_state进程保存Session,需要保证存放在Session中的对象,要是可以被序列化的,用[Serializable]特性标记。

    需要注意的是:

    1) 类中的属性是一个类的对象的话,该对象的类也应该能被序列化,如下面实例代码中的ProviderAddressInfo也需要能被序列化,ProviderAddressInfo类中的属性,也是同样,无限往下延伸。

    2) ClassB: ClassA,如果Session中保存了ClassB的对象,那么ClassA也需要能被序列化。

    3) 类中的常量不能被序列化,需要改写为属性。 (还是说成员变量都不行,不光是常量,必须是属性才能被序列化)

    dynamic变量?

using System;
using System.Collections.Generic;

namespace Model.Provider
{
    /// <summary>
    /// Provider Info
    /// </summary>
    [Serializable]
    public class ProviderInfo
    {
        public decimal ProviderId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string MiddleName { get; set; }    
        public ICollection<ProviderAddressInfo> ProviderAddresses { get; set; }
        public ICollection<ProviderContractInfo> ProviderContracts { get; set; }
        public ICollection<SpecialtyInfo> ProviderSpecialties { get; set; }

        public static string PCP
        {
            get
            {
                return "P";
            }
        }

    }
}

PS:工作的时候,Session保存的对象中有常量,编译没有问题,Web端调用Web API,API的Controller中正常返回了数据集,Web端的调用的时候,Web Request请求远程响应结果却是500内部服务器错误,就是因为序列化的问题,这个错误很难发现。

原文地址:https://www.cnblogs.com/sen068/p/4896412.html