我继承了一些非常旧的ASP.Net代码。最初在1.0中编写然后转换为2.0有一个页面使用自定义寻呼机控件。该控件具有以下逻辑:
Private _DataSource As PagedDataSource
Public Property DataSource() As PagedDataSource
Get
If Not IsNothing(Session("DataSource")) Then
_DataSource = Session("DataSource")
Return _DataSource
End If
Return Nothing
End Get
Set(ByVal value As PagedDataSource)
_DataSource = value
If Not IsNothing(value) Then
Session("DataSource") = value
Else
Session("DataSource") = Nothing
End If
End Set
End Property
使用该寻呼机的页面中包含以下逻辑:
Private PagedData As PagedDataSource
Private Function GetData() As DataTable
Dim DT As New DataTable
Dim CategoryID As Integer = -1
If IsNothing(ddlCategories.SelectedValue) OrElse Not Integer.TryParse (ddlCategories.SelectedValue, CategoryID) Then
CategoryID = -1
End If
Dim myConnection As New SqlConnection(ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString)
Dim myAdapter As New SqlDataAdapter
myAdapter = New SqlDataAdapter("SearchResources", myConnection)
myAdapter.SelectCommand.CommandType = CommandType.StoredProcedure
If SearchText <> String.Empty Then
trFiltered.Visible = True
End If
With myAdapter.SelectCommand.Parameters
.AddWithValue("@CategoryID", CategoryID)
.AddWithValue("@SearchText", SearchText)
.AddWithValue("@CompanyID", CompanyID)
End With
If Not Security.IsSiteAdmin Then
myAdapter.SelectCommand.Parameters.AddWithValue("@UserIsAdmin", 0)
myAdapter.SelectCommand.Parameters.AddWithValue("@FTPUserID", Security.GetUserID(Context.User.Identity.Name))
Else
myAdapter.SelectCommand.Parameters.AddWithValue("@UserIsAdmin", 1)
End If
Try
myAdapter.Fill(DT)
Catch ex As Exception
ErrorLog.LogError(ex.Message, ex.StackTrace, HttpContext.Current.User.Identity.Name, HttpContext.Current.Request.Url.ToString)
HttpContext.Current.Response.Redirect("~/error.aspx", False)
Return Nothing
End Try
Return DT
End Function
Protected Sub ReloadData()
CurrentPage = 0
CheckFilters()
BindData()
End Sub
手头的任务是删除所有会话变量。在不使用会话的情况下表示此数据的最佳方法是什么。最初我被告知将所有会话项目放入一个cookie,而这适用于大多数项目,由于cookie大小限制,它不适用于此,我也不想热衷于将它保存在ViewState中,或者即使这是一个选择。我是VB的新手,并没有很多重复写入遗留代码。会话不是一个选项,因为它被移动到一个Web场,Sticky会话被关闭,所以它必须在没有会话的情况下工作。
非常感谢任何建议。对不起,如果我问一个有明显答案的问题。
提前谢谢, -詹姆士。答案 0 :(得分:0)
好吧,有人可能会过来投票给我...但我会说你最好的选择是ViewState。
如果您因为不使用SessionState而受限制而且遇到cookie大小限制,我只能考虑其他两个选项(Cache和ViewState),我当然不会为此推荐Cache。
现在您知道可以使用进程外会话状态(SQL Server或StateServer)吗?
更多信息可以在这里找到: http://msdn.microsoft.com/en-us/library/ms178586.aspx