Строка подключения ASP.NET

У меня возникли проблемы с одной из строк подключения моего приложения ASP.NET 2.0. Бывают случаи, когда я получаю ошибку Свойство ConnectionString не было инициализировано, которая возникает случайным образом, с перерывами и без какой-либо причины.

Моя строка подключения на самом деле исходит от веб-службы, потому что разным пользователям предоставляются разные наборы строк подключения в зависимости от их уровня пользователя.

То, что я сделал до сих пор, выглядит следующим образом:

У меня есть главная страница (mstr.page) и соответствующий код (mstr.page.vb).

На моей главной странице я сначала извлекаю строку подключения и сохраняю ее в переменной сеанса, т.е.

Session("ConnString") = "RetrievedConnectionString"

Теперь на одной из моих страниц, скажем, page1.aspx.vb, я использую общедоступные общие функции из класса (с именем MyClass.vb) и использую его в своем page1.aspx.vb.

Некоторые коды для справки:

[MyClass.vb]
Imports System.Web

NameSpace ClassNameSpace
  Public Class Admin
    Protected Shared da as New DataAccess()

    Public Shared Function MYFunction() as String
      'Execute some sql statements here, using the DataAccess
      stringToReturn = Ctype(da.ExecuteScalar("SQLCommand"), String)
      Return stringToReturn
    End Function
  End Class
End NameSpace

[DataAccessClass.vb]
Public Class DataAccess()
  Private m_ConStr As String = ""

  Public Sub New()
    m_ConStr = HttpContext.Current.Session("ConnString")
  End Sub

  'Some methods for SQL statement execution (ExecuteQuery, ExecuteScalar)
End Class

[Page1.aspx.vb]
Imports ClassNameSpace

Protected Sub Page_Load(....) Handles Me.Load
  Dim strValue as String = Admin.MyFunction()
End Sub

Я разместил код выше, чтобы показать вам примерное представление о том, как идут дела.

По сути, функция Admin.MyFunction() иногда дает сбой, потому что в классе доступа к данным строка подключения, похоже, потеряла свое значение (либо пустое, либо ничего).

Это беспокоит меня уже довольно давно.

Я надеюсь, что кто-то может указать мне в правильном направлении, чтобы решить эту проблему. По сути, я хочу, чтобы моя строка подключения, которая извлекается каждым пользователем, посещающим веб-приложение, сохранялась все время и использовалась где угодно. Переменная сеанса не подходит, поскольку, когда ASP.NET перезапускает свой процесс, сеанс теряется.

Кстати, сначала я получаю строку подключения через главную страницу из веб-службы. Я попытался поместить ту же функцию извлечения в класс доступа к данным, когда условия заключаются в том, что переменная сеанса потеряна, но я думаю, что мое приложение не может подключиться к веб-службе во время процесса перезапуска.

Любой совет будет принят с благодарностью по этому поводу.

Обновление по этому поводу:

Я попытался использовать переменную сеанса и установить режим State Server, но, по-видимому, некоторые библиотеки DLL, которые я использую, не могут быть сериализованы, поэтому я вернулся к исходной точке.

Есть лучший способ сделать это?


person Batuta    schedule 26.02.2009    source источник


Ответы (5)


Одна вещь, которую нужно проверить, это то, что ваша сессия не забивается. Если вы используете (по умолчанию) сеанс в памяти, сеансы умирают каждый раз, когда рабочий процесс ASP.NET перезапускается. Если это вызывает вашу проблему, вам, возможно, придется изучить использование ASP.NET SessionServer в IIS или SQL Server в качестве хранилища сеансов.

person Harper Shelby    schedule 26.02.2009
comment
Я проверяю переменную сеанса до получения значения для строки подключения. Когда это Null или Nothing или Empty, я пытаюсь снова получить строку подключения из веб-службы, но, поскольку перезапуск продолжается, доступ к веб-службе также недоступен. - person Batuta; 26.02.2009

Я бы постарался максимально ограничить использование сеанса для таких вещей. Если вы используете Web.Config для хранения своих строк подключения, вы можете получить к нему доступ в любое время, и срок его действия не истечет, как у сеанса.

Вы также можете рассмотреть возможность использования статического класса доступа к данным, если он одинаков для всех пользователей экземпляра приложения...

person RSolberg    schedule 26.02.2009
comment
Как я уже упоминал, у каждого пользователя есть собственное конкретное свойство строки подключения, которое обслуживается веб-службой. По этой причине невозможно жестко закодировать строку подключения в файле web.config. - person Batuta; 26.02.2009
comment
Какие различия есть в строках подключения? Если у вас есть стандартная строка подключения, вы всегда можете изменить ее для пользователя, а затем выбросить... - person RSolberg; 26.02.2009
comment
Мне нравится этот подход с базовой/стандартной строкой подключения и ее изменением при необходимости. - person dfasdljkhfaskldjhfasklhf; 26.02.2009

Это точно такая же проблема, с которой я столкнулся, и оказалось, что переменные сеанса умирают, поэтому строка подключения не может быть правильно инициализирована.

person Community    schedule 26.02.2009
comment
Итак, какое решение вы сделали? Спасибо. - person Batuta; 26.02.2009
comment
Я увеличил время ожидания сеанса и убедился в web.config, что режим сеанса установлен на InProc. Кажется, это сработало до сих пор. Вероятно, это лучший способ сделать это, поскольку я даже не очень хороший программист ASP.Net. - person ; 26.02.2009
comment
Я также позаботился об инициализации строки подключения на каждой странице, чтобы она никогда не инициализировалась. - person ; 26.02.2009
comment
Но если бы я попытался инициализировать его на каждой странице, то это потребляло бы ресурсы, потому что строка подключения исходила бы от веб-службы. Кроме того, я использую In Proc прямо сейчас. Еще не проверял в режиме State Server. - person Batuta; 26.02.2009

Почему ваше приложение не может использовать только одну строку подключения? и почему строка подключения должна проходить через веб-сервис? это добавляет огромное количество задержек ко всему процессу. Я предполагаю, что это, вероятно, должно что-то делать с безопасностью данных в вашей базе данных.

Если вам нужно сделать это, я бы сказал, не можете ли вы использовать резервную строку подключения/строку подключения по умолчанию? Оберните свой код, который пытается вытащить его из сеанса, с некоторой обработкой ошибок, и если это не удастся, вернитесь к вашему умолчанию?

person dfasdljkhfaskldjhfasklhf    schedule 26.02.2009
comment
Какой-то тупой парень на самом деле предложил такое решение, и у нас не было другого выбора, кроме как получить строку подключения из веб-службы. Строка подключения — это совершенно другой набор сложности, где у одного пользователя может быть до 10 разных строк подключения в зависимости от посещаемых страниц. - person Batuta; 26.02.2009
comment
Иногда идеальное решение — отказаться от плохого решения, принятого ранее. Программирование (и жизнь!) даются легко, когда вы принимаете правильные решения в нужное время. - person dfasdljkhfaskldjhfasklhf; 26.02.2009

Я бы поместил ваш веб-сервис и веб-приложение в разные пулы приложений. Затем увеличьте время ожидания пула веб-приложений.

person dr.    schedule 26.02.2009
comment
Веб-служба и пул веб-приложений уже находятся на другом компьютере. Время ожидания также было увеличено, но при перезапуске ASP WP строка подключения теряется. - person Batuta; 26.02.2009