2010-01-04 6 views
5

Đây là một điều kỳ lạ. Tôi đang tìm kiếm các ý tưởng về cách đặt câu hỏi đúng như tôi là một giải pháp thực tế.Dữ liệu người dùng ASP.net nhận được sự chuyển giao giữa những người dùng truy cập các đối tượng

Tôi có một trang web và chúng tôi vừa có một bước nhảy vọt trong lưu lượng truy cập. Bây giờ tất cả các đột ngột chúng tôi đang nhận được lỗi tham số sql trái và phải. Chúng tôi đã chuyển sang một máy chủ sql mới một vài tuần trước và mọi thứ đều ổn nhưng lưu lượng truy cập bổ sung dường như đang phá vỡ chúng tôi.

Tôi có lớp truy cập dữ liệu được gọi khi mỗi người dùng truy cập để đăng nhập. Nó chạy qua một số tác vụ trước khi cuối cùng cập nhật ngày đăng nhập cuối cùng của người dùng và chuyển tiếp họ đến phần quản trị.

Những gì tôi thấy từ nhật ký theo dõi cho thấy khi tôi đăng nhập vào một số tác vụ đầu tiên đang sử dụng dữ liệu của mình (cho phép người dùng = birk pass = word). Nhưng tại một số điểm, lớp truy cập bắt đầu gửi dữ liệu từ người khác đang cố gắng đăng nhập (cho phép người dùng = abcxyz)

Mọi kết nối mà chúng tôi thực hiện với máy chủ đều bị đóng khi chúng tôi kết thúc. Tôi vô hiệu hóa tất cả các đối tượng accessor khi tôi kết thúc với chúng. Nhưng bằng cách nào đó dữ liệu người dùng khác nhau từ các phiên khác nhau đang thực hiện theo cách của họ vào các trường hợp khác của đối tượng.

Tôi không sử dụng phiên/ứng dụng/bộ nhớ cache/viewstate để lưu trữ các đối tượng, vì vậy tôi không thực sự thấy cách họ có thể chỉnh sửa eachother ... Nó thực sự kỳ lạ và tôi không chắc chắn làm thế nào để thậm chí đi về nghiên cứu vấn đề.

này được khoảng lớp accessor ... Tôi cắt ra một số trong những phần mà không phụ thuộc vào vấn đề

Imports Microsoft.VisualBasic 
Imports System.Data 
Imports System.Data.SqlClient 
Imports System.Text.RegularExpressions 
Imports System.Text 
Imports System.IO 

Namespace ABC 
    Public Class DataAccess 
     Public Class SQL 
      Dim objConnection As SqlConnection 
      Dim objAdapter As SqlDataAdapter 
      Dim objDataset As DataSet 
      Dim objTable As DataTable 
      Dim strSQL As String 
      Dim strCommandType As String 
      Shared sqlparams As List(Of param) 
      Public params As New Parameters 
      Shadows Application As HttpApplicationState = HttpContext.Current.Application 
      Shadows Server As HttpServerUtility = HttpContext.Current.Server 
      Shadows Response As HttpResponse = HttpContext.Current.Response 
      Shadows Session As HttpSessionState = HttpContext.Current.Session 

      Public Sub New() 
       Connection() 
      End Sub 

      Public Sub New(ByVal startingSql As String) 
       Connection() 
       sql = startingSql 
      End Sub 

      Private Sub Connection() 
       sqlparams = New List(Of param) 
       objConnection = New SqlConnection(ConfigurationManager.ConnectionStrings("sqlServerProd").ConnectionString) 
      End Sub 

      Public Function DataNQ(ByVal type As CommandType, Optional ByVal query As String = "") As Boolean 
       If query <> "" Then 
        sql = query 
       End If 
       Dim objCommand As SqlCommand 
       Try 
        objConnection.Open() 
       Catch ex As Exception 
        objConnection.Close() 
        objConnection.Open() 
       End Try 
       objCommand = New SqlCommand(sql, objConnection) 
       objCommand.CommandType = type 
       Dim cmd As New SqlCommand 
       HttpContext.Current.Trace.Warn(sql) 
       'HttpContext.Current.Trace.Write("Adding " & sqlparams.Count & " parameters") 
       HttpContext.Current.Trace.Warn(params.writeParams) 
       If sqlparams.Count > 0 Then 
        For Each p As param In sqlparams 
         Dim sparam As SqlParameter = p.makeParam 
         HttpContext.Current.Trace.Write(sparam.DbType.ToString, sparam.ParameterName & "=" & sparam.Value) 
         objCommand.Parameters.Add(p.makeParam) 
        Next 
        sqlparams = New List(Of param) 
       End If 
       HttpContext.Current.Trace.Warn("Successfully added " & objCommand.Parameters.Count & " parameters") 
       HttpContext.Current.Trace.Warn(params.writeParams) 

       '-- Create a SqlParameter object to hold the output parameter value 
       Dim paramRetVal As New SqlParameter("@RETURN_VALUE", SqlDbType.Int) 
       '-- Must set .Direction as ReturnValue 
       paramRetVal.Direction = ParameterDirection.ReturnValue 
       '-- Finally, add the parameter to the Command's Parameters collection 
       objCommand.Parameters.Add(paramRetVal) 
       '-- Call the sproc... 
       Dim reader As SqlDataReader = objCommand.ExecuteReader() 
       'Now you can grab the output parameter's value... 

       Dim intRetVal As Integer = Convert.ToInt32(paramRetVal.Value) 
       If intRetVal = 0 Then 
        objConnection.Close() 
        objCommand = Nothing 
        reader = Nothing 
        Return True 
       Else 
        objConnection.Close() 
        objCommand = Nothing 
        reader = Nothing 
        Return False 
       End If 
       objConnection.Close() 

      End Function 

      Public Sub freeResources() 
       sqlparams = Nothing 
       params = Nothing 
       objConnection = Nothing 
       objAdapter = Nothing 
       objDataset = Nothing 
       objTable = Nothing 
       strSQL = Nothing 
       strCommandType = Nothing 
      End Sub 

     Public Sub add(ByVal parameterName As String, ByVal dbType As System.Data.SqlDbType, ByVal size As Integer, ByRef value As Object) 
      HttpContext.Current.Trace.Write("adding param name/type/size/value", parameterName & " " & value) 
      Dim p As param 
      p = New param(parameterName, dbType, size, value) 
      p.Value = value 
      sqlparams.Add(p) 
     End Sub 

      Private Class param 
       Public name As String = Nothing 
       Public size As Integer = Nothing 
       Public type As System.Data.SqlDbType = Nothing 
       Public value As Object = Nothing 
       Public Function makeParam() As SqlParameter 
        HttpContext.Current.Trace.Warn("before make param name=" & name & " type=" & type.ToString & " value=" & value) 
        Dim p As New SqlParameter(name, type) 
        If size <> Nothing Then 
         p.Size = size 
        End If 
        p.Value = value 
        HttpContext.Current.Trace.Warn("after make param name=" & p.ParameterName & " type=" & p.DbType.ToString) 
        Return p 
       End Function 

     Public Sub New(ByVal pname As String, ByRef ptype As System.Data.SqlDbType, ByRef val As Object) 
      'HttpContext.Current.Trace.Write("new param object name/type/value name=" & pname & " type=" & ptype.ToString) 
      name = pname 
      type = ptype 
      value = val 
      'HttpContext.Current.Trace.Warn("added param name=" & name & " type=" & type.ToString) 
       End Sub 
      End Class 


     End Class 
    End Class 

BẤT CỨ ý tưởng hay suy nghĩ sẽ là tuyệt vời. Cảm ơn

+2

Tại sao "sqlparams" được khai báo là được chia sẻ? –

+0

Tôi trang bị thêm lớp để làm việc với các trang cũ hơn mà không yêu cầu thay đổi mã và tại thời điểm rời khỏi trang này khi được chia sẻ dường như phù hợp với nhu cầu tốt hơn so với thêm thuộc tính có tên sqlparams. Đó là giá trị một viết lại mặc dù. – Birk

Trả lời

7

Bạn có sqlparams As List(Of param) được khai báo là Shared. Điều này có nghĩa rằng chỉ có một ví dụ của nó được tạo ra trong bộ nhớ, bao giờ hết.

Mọi tham chiếu đến nó từ mọi trang được instantiated là sử dụng cùng một trường hợp của sqlparams.

Điều này có nghĩa là một phiên bản trang của bạn đã điền nó với một số thông số và một số phiên bản khác của trang khởi động, gọi phương thức Connection() của bạn và xóa nó. Khi bộ xử lý chuyển về chủ đề của trang đầu tiên, sqlparams hiện là mới, (hoặc thậm chí tệ hơn, Nothing nếu một chuỗi khác chỉ được gọi là phương thức freeResources()).

Trang của bạn vốn không an toàn với mã này. Thay thế tất cả các biến số Shared của bạn bằng các biến mẫu và nó sẽ giải quyết vấn đề.

+0

Tôi đã xóa cờ công khai khỏi sqlparams và điều chỉnh phần còn lại của mã phù hợp vào lúc này mọi thứ dường như đang hoạt động. CẢM ƠN BẠN RẤT NHIỀU! – Birk

2

Nếu lớp học SQL của bạn chỉ được khởi tạo và không chứa phương pháp tĩnh/chia sẻ thì đó không phải là một phần của sự cố.

EDIT: bộ sưu tập của bạn params (sqlparams) là Shared, mà sẽ cho phép cross-over giữa instantiations của SQL cho các thông số của họ.

1

biến tĩnh cũng sẽ gây ra sự cố và giống như Trạng thái ứng dụng .... Tôi nghĩ rằng Shared giống như static trong C# .... Tôi cho rằng biến số Shared của bạn là vấn đề của bạn. Biến chúng thành các biến mẫu và nó sẽ hoạt động.