一直是做j2ee的web开发,最近被迫着手一个asp.net(后台程序是vb.net)的项目,从来没有做过asp.net(只是过去有一点vb的经验),一时不知如何下手,但还是磕磕碰碰的完成了客户需要的demo(总算混过了关,哈哈)。在这几天如地狱般的demo开发过程中,不断地出现问题,每次出现问题都先想想java是怎么实现的,然后就去找asp.net有没有类似的方法。还好,web原理都是那么一套逻辑,很多问题都能顺利解决,只是页面与页面之间的数据传递问题,遇到麻烦,查了很多资料,都是老生常谈(大家你抄我来,我抄他),归结起来如下:1.用session来传递数据,但是每次都要手动去删除数据,要不session里的东西太多太乱,最后都不知道有什么没什么了,太不方便!2.加到url后面(类似?xxx=yyy&zzz=kkk),缺点是只能传递字符串类型的值,对于我们自定义的对象就不适用了
我研究了一下,忽然想起原来做java的时候有一个本地线程东东,可以往里面放数据,只在本线程内使用,是线程安全的,估计.net也应该有类似的东东吧,查了一下找到了一个叫线程局部存储(TSL: Thread Local Storage)的技术, 写了一点代码,测试了一下,基本满足了我需要的功能(页面之间传递无状态临时数据),以下是我的代码:创建一个全局常量定义类ConstString.vb
------------------------------------------------------------------------------------
Imports Microsoft.VisualBasic
Public Class ConstString
    Public Const THREAD_CACHE_INFO As String = "THREAD_CACHE_INFO"
End Class然后,在web工程内的Global.asax内加入启动和关闭web时,所需要执行的代码
------------------------------------------------------------------------------------
<%@ Application Language="VB" %>
<script runat="server"> 
    Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs) 
        System.Threading.Thread.AllocateNamedDataSlot(ConstString.THREAD_CACHE_INFO)
    End Sub 
    Sub Application_End(ByVal sender As Object, ByVal e As EventArgs) 
        System.Threading.Thread.FreeNamedDataSlot(ConstString.THREAD_CACHE_INFO)
    End Sub 
    …………略
</script>编写了一个模拟HttpServletRequest setAttribute方法和getAttribute方法的代理类
------------------------------------------------------------------------------------
Imports Microsoft.VisualBasic
Imports System.Threading
Imports System.CollectionsPublic Class ThreadCache
    Public Shared Function getAttribute(ByVal name As String) As Object
        Dim ht As Hashtable = getCache()
        Return ht.Item(name)
    End Function
    Public Shared Sub setAttribute(ByVal name As String, ByVal value As Object)
        Dim ht As Hashtable = getCache()
        ht.Add(name, value)
    End Sub
    Private Shared Function getCache() As Hashtable
        Dim slot As LocalDataStoreSlot = Thread.GetNamedDataSlot(ConstString.THREAD_CACHE_INFO)
        Dim ht As Hashtable = Thread.GetData(slot)
        If ht Is Nothing Then
            ht = New Hashtable()
            Thread.SetData(slot, ht)
        End If
        Return ht
    End Function
End Class以上代码完成后,你就可以在你的asp页面的后台处理程序中利用ThreadCache的getAttribute和setAttribute方法读取你自定义的数据了,用完后,不用作清理工作,它们将在你本次访问的线程结束时自动被清除
另外必须提醒的一点是当你在asp后台代码中用Response.Redirect方法导航到其他asp页面去的时候,Response.Redirect方法的第二个参数一定要为False,这样才能保证前后两个asp是在一个thread中运行的,才能保证共享你利用ThreadCache加入的数据以上方法,不知道可行与否,请对.net framework精通的高手指点,非常感谢!