• 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内部服务器错误,就是因为序列化的问题,这个错误很难发现。

  • 相关阅读:
    Linux PCI网卡驱动的详细分析
    moand的编程学形式:一个(高阶)类型包办程序的组织--类型关乎复合
    范畴论完全解读:函子是范畴(高阶类型)间的映射
    函数式编程从起点到终点
    锁的本质:操作的序列化
    并发编程概述--C#并发编程经典实例
    异步IO的概念
    基于事件的并发编程
    runloop是iOS系统上的actor模式
    Monad、Actor与并发编程--基于线程与基于事件的并发编程之争
  • 原文地址:https://www.cnblogs.com/sen068/p/4896412.html
Copyright © 2020-2023  润新知