不行的,你的做法行不通"在asp.net下写一个.net组件,这个组件只完成返回session值,设置session值。"
"写个com组件(同时也是asp组件),这个组件访问上面的.net组件,从而实现asp下读取asp.net下的session值"这两个组件不在同一个进程中运行,你不能得到当前应用程序的Session

解决方案 »

  1.   

    在ASP.Net项目中用一个地方维护所有的Session引用,写一个Web Service,根据SessionID设置和返回Session值
    这样应为该Web Service和ASP.Net同在一个应用程序域,应该可以做到
      

  2.   

    根据SessionID返回对应Session,这个如何实现呢??
      

  3.   

    1. use SQL ServerHow to Share Session State Between Classic ASP and ASP.NET
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/converttoaspnet.asp2. use hidden controlsTransfer Session Variables from Classic ASP to ASP.NET
    http://www.eggheadcafe.com/articles/20021207.asp
      

  4.   

    你在Global里面写一个Session的List:private static Hashtable _sessionList = Hashtable.Synchronized(new Hashtable);然后在Session_Start的时候:
    _sessionList.Add(Session.SessionID,Session);Session_End的时候:
    _sessionList.Remove(Session.SessionID,Session);另外写一个设置Session值的方法:
    public static void SetSessionValue( string sessionID,object key,object value )
    {
        object session = _sessionList[sessionID];
        if( session==null )
           throw new ApplicationException("指定Session不存在!");
        ((HttpSessionState)session).Add(key,value);
    }另外类似的写一个返回Session值的方法为了满足应用,可能还需要写一些在所有Session中遍历,获取符合条件的Session进行处理,这些方法写起来就不难了最后,写一个Web Service,把要暴露的方法写成Web Method,调用Global里面的静态方法
      

  5.   


    1. use SQL ServerHow to Share Session State Between Classic ASP and ASP.NET
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/converttoaspnet.asp2. use hidden controlsTransfer Session Variables from Classic ASP to ASP.NET
    http://www.eggheadcafe.com/articles/20021207.asp
      

  6.   

    非常感谢思归,刚刚细看了这两篇文章,得出的结论是:1、use SQL ServerHow to Share Session State Between Classic ASP and ASP.NET
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/converttoaspnet.asp这个方法是完全禁用了网站提供的session 自己派生了一套session。
    然后在asp 和 asp.net 间通用。
    2. use hidden controlsTransfer Session Variables from Classic ASP to ASP.NET
    http://www.eggheadcafe.com/articles/20021207.asp这个方法是两边的session完全同步,也就是有两套session 只不过需要同步而已。暂时对这两种方案还难以取舍。
      

  7.   

    我认为,为了便于向asp.net的迁移,最好的解决方案应该是利用asp.net的session ,弃用asp的session,
    不象
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/converttoaspnet.asp
    提供的解决方案,asp 和 asp.net 的session 都弃用;
    也不象http://www.eggheadcafe.com/articles/20021207.asp 提供的方案,asp 和 asp.net的session都使用,然后提供一个同步接口;
     timmy3310(tim) 提供的 在Global里面写一个Session的List,其实是在asp.net下出现了两个保存session的地方,(微软自己的一套,我们自己的一套)
    我在考虑是不是可以公用一套??但是微软没有这样的接口,asp.net下如果选择的是把session保存在数据库中,好像应该就可以公用一套了。
      

  8.   

    我在考虑是不是可以公用一套??但是微软没有这样的接口,asp.net下如果选择的是把session保存在数据库中,好像应该就可以公用一套了。
    实际上我的方法并没有保存两套Session,Session还是由ASP.Net维护,我在Global里面只是维护了对所有Session引用的列表,其实Session还是那个Session,我并没有复制它,只是用了一个变量来引用,就象指针一样
      

  9.   

    真faint,把.net中的session设置为sqlserver的mode,让asp去connect...select呗
      

  10.   

    to: fa2002(叮当)
    1、use SQL Server
    How to Share Session State Between Classic ASP and ASP.NET
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/converttoaspnet.asp思归提供的这个方法就是自己创建了一个自己的Session 而不是使用ASP的Session ,也不是使用Asp.net的Session.
      

  11.   

    To fa2002(叮当)
      误解你的意思了,你的意思是把所有的ASP代码全部转换为ASP.net代码?? 看来你没有做过比较大型一些的网站,全部的改写不仅有商业上的巨额费用,还会出现各种本地使用中不会出现问题,上传到服务器上会去出现各种麻烦的问题。To jjstar(北人) :
    真faint,把.net中的session设置为sqlserver的mode,让asp去connect...select呗
    不是这么简单的,比如Session中可以记录各种对象,如果我ASP.net的Session中记录了一个ADO.net的对象,在ASP中我如何使用呀, 另外,更重要的一个问题是,你不清楚微软记录Session的核心代码,比如,记录一个字符串到Session中,微软用了加密,你不知道密钥,你如何获得这个字符串呀。把.net中的session设置为sqlserver的mode,让asp去connect...select呗,使用这个方法的前提条件是你知道微软对Session处理的核心代码,否则你知道这些记录的是啥东西呀。可看不可吃,这种方法只能想,无法实现。
      

  12.   

    那就用xml序列化到硬盘,给asp用,session_end时用.net删了
      

  13.   

    ghj1976(蝈蝈俊.net):呵呵,被你说对了,我以前是做ERP的,现在是在.net平台上开发企业内部的OA和相关的管理系统,工作2年多了,唯一比较幸运的是还没做过“擦屁股”的工作。 :)
      

  14.   

    在我做Web项目的经验看来,用Session最多的就是Web应用,比较大型的项目一般都不会把过多的数据放到Session里面,实际上就涉及到异构系统用统一的身份验证,我做过几个项目
    1、Asp.net & Asp.net
      这两个系统都已经成型,而且Session中放的东西都不一样,所以要公用一个Session会造成资源上的浪费,所以我做的时候,采用了一个Web Service来提供统一的验证,用自己生成的唯一的Key来标识用户,每个子系统用Mapping来对应该Key和SessionID的关系,不过有一个缺点,Web Service这边需要手动控制超时,而且必须要比子系统的Session超时时间长,要不然就会出现子系统尚未超时,而验证服务器已经超时的情况。
      这种方式是当初没办法而做出来的,后来经过检讨,感觉这种模式还是有可取之处,只是设计的时候要谨慎一些,毕竟Web Service是开放的,而且其安全性还有待提高。2、ASP & JSP
       这个案例采取的方法类似思归老大提供的第二个方案,只是更复杂一些。我们在两个系统的切换处产生一个Token,然后把要传递的数据存放到另一个供通讯的数据库,另一个系统收到Token的时候,根据Token到数据库取出传递的数据。
       另外传递Token的时候,采用了DES加密,并且在取到数据之后,把该Token设为无效,保证了尽可能的安全。
       因为这是个银行系统,所以安全性要求比较高,但是效率上受到了影响。
      

  15.   

    ghj1976(蝈蝈俊.net) :在《application center 专家指南》有关于session保存的内容也是通过数据库的方式,希望能对你有帮助。另外我觉的msdn提供的方式应该还算可以(似乎也没有其他更好的方式了),就是无形中增加了数据库负担,尤其现在的系统很多都是3层结构的,是不是可以考虑使用本地的msde或是access哪?这样存取起来会快些,而且对系统总的结构影响也小。
    四个红星应该是老前辈了。晚生斗胆说的这些还望前辈指教 :)
      

  16.   

    to: timmy3310(tim) 
    如果两个应用都是asp.net做的,完全没有必要考虑session的问题,利用asp.net提供的多台服务器的session可以保存在一台服务器上,或者一个数据库中就可以了。
    而且,两个WEB应用只有用户访问到指定的应用时候,才会给Session中增加对应的对象。你提出的用Web Service来提供统一的验证,我觉得完全没有必要。to : fa2002(叮当) 
    “擦屁股”的工作从大学毕业一直碰到过,预先定义的不够合理,后面改起来太痛苦了。公司的工作需要进度,需要时间限制,没法退掉从写,不象自己的程序,有好的想法,从新来过。
      

  17.   

    to: fa2002(叮当) 
      《application center 专家指南》 一本书??? 那里可以看到???
    另外,如果从效率的情况来考虑,保存在缓存中比数据库中要快很多,(当然,应用中不能把很多东西都保存在session中是常识)
      

  18.   

    to: timmy3310(tim) 补充:
    如果两个应用都是asp.net做的,完全没有必要考虑session的问题,利用asp.net提供的多台服务器的session可以保存在一台服务器上,或者一个数据库中就可以了。这个要求这些服务器都在同一个 Web Farm 中,如果你无法保证这个条件,只有使用你的那种方式了。
      

  19.   

    timmy3310(tim):这位前辈考虑过用remoting来代替web serivce吗?如果只是访问session的话(并且都是在内网中),建议用remoting的方式更好写。
      

  20.   

    timmy3310(tim):如果都是asp.net对asp.net可以使用application center来协调服务器之间的状态的。
      

  21.   

    ghj1976(蝈蝈俊.net):清华翻译的,wrox出版的,红皮的。计算机书店有售。
      

  22.   

    To 大家可能大家都误会了
    我的第一个应用是这样的,两个子系统不是在一个网段之中,当然使用Remoting也可以,但是当初我们选择了Web Service
    另外开始也有一种选择就是使用State Server,但是这样会有资源的浪费,这我也说过了,因为两边的Session存放的东西完全不一样,如果是开始开发的时候选择,当然不会使用这种方式。
    实际上一个系统是开发了很久,后一个系统开发了一大半之后才有这个需求的。
    我也说过了,这种方式值得商榷,只是我们当初没有办法的选择(其实也有其他的选择,只是时间关系,这种方式比较好实现)。
      

  23.   

    faint,我第一次做系统,就碰到了系统集成的问题,而且是不通厂商的系统集成,看来我是倒霉透了.系统集成要求:
    1:用户登入时,同时初始化两套系统(asp和asp.net)的session
    2:要求在主页面中显示两套系统的东西(主要时流程信息)
    3:实现两套系统的互访我现在时这样做的:
    登入页面是asp.net,在登入的时候调用一个asp页面,这个页面的功能是初始化asp系统中的session,当然,这个asp页面是放在asp系统中的,初始化系统后,各自的session保存在各自的系统中两套系统之间互访是通过一个中转页面进行的,比如asp要访问asp.net,就访问asp.net中的一个页面bridge.aspx,在bridge.aspx中觉定怎么调用asp.net系统为了保证asp访问asp.net时的域和asp.net系统内部的域相同,我的主页面是在asp.net系统中的,在主页面中嵌套了asp页面还有一点我不明白:服务器怎么判断程序域的?也就是服务器怎么判断不同的页面可以访问同一个session?谢谢
      

  24.   

    to :ljfppp(刘三疯)建议你看:《application center 专家指南》 这本书。清华翻译的,wrox出版的,红皮的。计算机书店有售。StateServer -- 使用专用的进程来管理"会话状态"。这是ASP.NET引入的一个新技术。.NET提供了一个后台进程来专门管理会话状态,这使得会话状态不再局限在一台计算机上,多台提供Web服务的计算机可以共用一台计算机的一个后台进程来专门管理会话状态,使得会话状态变量在WEB FARM中的使用成为可能,从而极大的提升了程序的可扩充性能。但是StateServer的会话状态变量存取要跨越进程甚至是网络,其速度比InProc要慢许多,而且多台Web服务器共享一个后台进程来管理"会话状态"会有潜在的可靠性问题。一旦这个后台进程出现问题,那么多台Web服务器将同时丢掉所有的状态信息。用术语来说,StateServer 是一个"Signle Point Failure"。在理论上讲,这不是一种理想的方案。另外如果多台Web服务器共享一个StateServer,那么你可能还要修改machine.config里的machine key(用来加密会话状态数据的)。多台Web服务器要使用同样的设置。validationKey和decryptionKey是一个40-128位长的16进制的字符串。例如
    <machineKey  
    validationKey="123456789adcdef123456789adcdef123456789adcdef123456789adcdef"
    decryptionKey="abcd123456789adcdefabcd123456789adcdefaaa123456789adcdef000"
              validation=SHA1" copy自:http://luyu.net/list.aspx?sid=727&fid=7
      

  25.   

    ghj1976 (蝈蝈俊.net) :今天仔细一看本贴才20分,好歹也是大牌,一出手怎么这么小气啊。 :)
    思归一放就是300啊 :P
      

  26.   

    to : fa2002
    我从来不放分,象非技术的问题,我一般都是0分,我不想让任何想捞分的人到我的帖子里面,我只想讨论。
      

  27.   

    如果不考虑安全性问题,只要保证数台服务器都在一个域里面,比如这样的服务器:
    http://www.csdn.net/
    http://expert.csdn.net/
    http://search.csdn.net/
    可以通过Cookies的domain来设置通用一个用户状态。
      

  28.   

    这问题早就讨论过呀,用临时COOKIE即可。
    第一,既然你要传SESSION,显然必须在同一个站上,因此用COOKIE没有跨域的问题。
    第二,要传的内容主要是登录信息之类的信息,量不会很大,COOKIE也能胜任。以下是一个示例:
    test.asp
    =========================
    <html>
    <head>
    <title>asp session to asp.net</title>
    </head>
    <body>
    <a href="test.aspx">asp.net</a>
    <%
    Response.Cookies("mycookie")("type1") = "sugar"
    Response.Cookies("mycookie")("type2") = "ginger snap"
    %>
    </body>
    </html>test.aspx
    ===========================================
    <%@ Page Language="vb" AutoEventWireup="false" Codebehind="test.aspx.vb" Inherits="test"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    <HEAD>
    <TITLE>test</TITLE>
    <META NAME="GENERATOR" CONTENT="Microsoft Visual Studio.NET 7.0">
    <META NAME="CODE_LANGUAGE" CONTENT="Visual Basic 7.0">
    <META NAME="vs_defaultClientScript" CONTENT="JavaScript">
    <META NAME="vs_targetSchema" CONTENT="http://schemas.microsoft.com/intellisense/ie5">
    </HEAD>
    <BODY MS_POSITIONING="FlowLayout">
    <FORM ID="Form1" METHOD="post" RUNAT="server">
    <ASP:LABEL ID="ck1" RUNAT="server"></ASP:LABEL><BR>
    <ASP:LABEL ID="ck2" RUNAT="server"></ASP:LABEL><BR>
    </FORM>
    </BODY>
    </HTML>test.aspx.vb
    =================================
    Imports System.WebPublic Class test
    Inherits System.Web.UI.Page
    Protected WithEvents ck1 As System.Web.UI.WebControls.Label
    Protected WithEvents ck2 As System.Web.UI.WebControls.Label#Region " Web Form Designer Generated Code " 'This call is required by the Web Form Designer.
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent() End Sub Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
    'CODEGEN: This method call is required by the Web Form Designer
    'Do not modify it using the code editor.
    InitializeComponent()
    End Sub#End Region Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim ck As HttpCookie
    ck = Request.Cookies("mycookie")
    ck1.Text = ck("type1")
    ck2.Text = ck("type2") End SubEnd Class
      

  29.   

    To ljfppp(刘三疯) asp和asp.net使用各自的session有一个问题就是:
    如果用户一直在访问asp的页面,等到返回asp.net页面后,
    asp.net的session却有可能超时了,这种情况该如何处理呢?
      

  30.   

    将session值存入数据库中,然后读取!
      

  31.   

    当用户一进入页面然后将session值存入DB中。ASPX和ASP页可读取。这样,也可必免用户刷
    新页面时,session值的丢失。
      

  32.   

    1对每一用户session设登录标记i
     首页判断
     if i=1 then session("name")="" then
     读取
    end if
    2对无限制用户的session变量
    读取cookie值
      

  33.   

    我记的有篇文章讲过:ASP和ASPX的SESSION所保存的路径不一样。只可惜我找不到那篇文章了,哪位知道,请尽快通知一下。
      

  34.   

    能保存到数据库,为何不保存到application,这样效率肯定高