Свойство ConnectionString не инициализировано

Я просмотрел множество сообщений на разных форумах, где другие получали такую ​​же ошибку. Большинство говорят, что они неправильно ссылались на строку подключения из файла web.config или пытались открыть соединение до установки строки подключения. Что ж, если это было для меня, то как это работает на двух разных системах, но не на третьей? Он работает на моем компьютере разработки и на сервере разработки, но не в производственной среде. Разница в том, что веб-сервер и сервер БД являются отдельными физическими серверами в моей производственной среде и на одном сервере для разработки. Мои настройки, сообщение об ошибке и код будут перечислены ниже.

Я могу смоделировать ошибку на своем ПК, если переименую строку подключения в любом разделе файла web.config (настройки приложения, строки подключения) на что-то другое. Ниже вы увидите, как я тестировал оба варианта.

Любая помощь будет ОЧЕНЬ признательна, потому что у меня не хватает времени, чтобы понять, почему это не сработает в производственной среде.


Ошибка сервера в приложении '/'

Свойство ConnectionString не инициализировано.

Описание: необработанное исключение произошло во время выполнения текущего веб-запроса. Просмотрите трассировку стека для получения дополнительных сведений об ошибке и ее происхождении в коде.

Сведения об исключении: System.InvalidOperationException: свойство ConnectionString не инициализировано.

Line 114:
Line 115:  Private Sub Page_Error(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Error
Line 116:   ErrHandler.LogError(Server.GetLastError)
Line 117:  End Sub
Line 118:

Source File: D:\IIS\SSIP\web\App_Code\SitePage.vb    Line: 116
[InvalidOperationException: The ConnectionString property has not been initialized.]
   System.Data.SqlClient.SqlConnection.PermissionDemand() +4876643
   System.Data.SqlClient.SqlConnectionFactory.PermissionDemand(DbConnection outerConnection) +20
   System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) +117
   System.Data.SqlClient.SqlConnection.Open() +122
   Database.Open(String connectionstring) in C:\wwwroot\EIIASSIP\common\Core\Database.vb:47
   Components.BasePage.get_DB() in C:\wwwroot\EIIASSIP\common\Core\BasePage.vb:41
   Components.BasePage.get_ErrHandler() in C:\wwwroot\EIIASSIP\common\Core\BasePage.vb:49
   Components.SitePage.Page_Error(Object sender, EventArgs e) in D:\IIS\SSIP\web\App_Code\SitePage.vb:116
'** web.config'
<appSettings>
    <add key="ConnectionString" value="Persist Security Info=True;Initial Catalog=[database];Data Source=[server];User ID={0};Password={1};"/>
</appSettings>

<connectionStrings>
    <add name="ConnectionString" connectionString="Data Source=[server];Initial Catalog=[database];Persist Security Info=True;User ID={0};Password={1};" providerName="System.Data.SqlClient"/>
</connectionStrings>

'** BasePage.vb'
Public ReadOnly Property DB() As Database
    Get
        If m_DB Is Nothing Then
            'open database connection
            m_DB = New Database
            m_DB.Open(ConnectionString) ' ********** Line 41'
        End If
        Return m_DB
    End Get
End Property

Public ReadOnly Property ErrHandler() As ErrorHandler
    Get
        If m_ErrHandler Is Nothing Then m_ErrHandler = New ErrorHandler(DB)
        Return m_ErrHandler '**********Line 49'
    End Get
End Property

Private Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreInit
    'if using "appSettings" section for connectionstring'
    ConnectionString = DBConnectionString.GetConnectionString(ConfigurationManager.AppSettings("ConnectionString"), ConfigurationManager.AppSettings("ConnectionStringUsername"), ConfigurationManager.AppSettings("ConnectionStringPassword"))
    'if using "connectionStrings" section for getting connectionstring'
    'ConnectionString = DBConnectionString.GetConnectionString(ConnectionStrings.Item("ConnectionString").ConnectionString, AppSettings("ConnectionStringUsername"), AppSettings("ConnectionStringPassword"))'
End Sub

'** ConnectionStrings.vb'
Public Shared Function GetConnectionString(ByVal cs, ByVal Username, ByVal Password) As String
    Dim ConnString As DBConnectionString = New DBConnectionString(cs, Username, Password)
    Return ConnString.ConnectionString
End Function

'** Database.vb'
    Public Sub Open(ByVal connectionstring As String)
        RefCount = RefCount + 1

        If con Is Nothing Then
            con = New SqlConnection(connectionstring)
        End If
        If Not IsOpen() Then
            con.Open() ' ********** Line 47'
        End If
    End Sub

'** SitePage.vb'
Private Sub Page_Error(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Error
    ErrHandler.LogError(Server.GetLastError) '********** Line 116'
End Sub

person Community    schedule 15.07.2009    source источник


Ответы (2)


Сюда входит несколько факторов, которые необходимо проверить дальше.

*) Убедитесь, что ваша строка подключения действительно правильная. Вы можете попробовать подключиться к тому же серверу, но с другой базой данных. Но убедитесь, что строка подключения верна, чтобы мы могли исключить одну возможность.

*) Есть ли брандмауэр между сервером БД и сервером приложений? Поскольку брандмауэр может прервать существующее соединение с SQL Server, если соединение через некоторое время останется открытым. Некоторое оборудование брандмауэра имеет некоторую конфигурацию для автоматического прерывания соединения SQL по истечении времени X

*) Я думаю, что есть способ или какой-нибудь фрагмент кода, чтобы проверить, установлено ли соединение SQL или нет. Или, как вариант, сделайте следующее:

  • Создайте файл, например, connection.udl (убедитесь, что это не connection.udl.txt, а должно быть connection.udl). этот файл должен быть создан на сервере APP.
  • Дважды щелкните этот файл
  • Настроить необходимую строку подключения,
  • и, наконец, нажмите Test Connection
  • если тестовое соединение работает успешно, это означает, что он может правильно подключиться к серверу БД

РЕДАКТИРОВАТЬ :

Эта конкретная строка ошибки довольно интересна: System.Data.SqlClient.SqlConnection.PermissionDemand (), как видно из трассировки стека сообщений об ошибке, возможно, вам нужно погуглить, используя ключевое слово PermissionDemand.

Другое дело: пробовали ли вы использовать встроенную проверку подлинности Windows или проверку подлинности SQL? Попробуйте использовать пользователя Windows ИЛИ пользователя SQL и проверьте результат. Я вижу, что в строке подключения в web.config вы используете Integrated Security = true, что означает, что потребуется проверка подлинности учетной записи пользователя, которая запускает пул приложений веб-приложения ASP.NET. Я подозреваю, что у этой учетной записи пользователя недостаточно прав для доступа к SQL Server.

Чтобы локализовать проблему, попробуйте аутентифицироваться с помощью аутентификации SQL, если она работает, это означает, что эта интегрированная безопасность является виновником.

Можете ли вы проверить учетную запись пользователя, который запускает пул приложений текущего веб-приложения ASP.NET?

person Community    schedule 15.07.2009
comment
Спасибо за идеи. Я получаю сообщение об ошибке при запуске приложения, потому что первое, что оно делает, - это подключается к базе данных. Строка подключения работает. Я модифицировал его на своем ПК, чтобы подключиться к производственной базе данных, чтобы быть уверенным, и он подключился. Я также тестировал возможность подключения к производственной базе данных различными способами (через VS Server Explorer, используя DSN {на моем компьютере, сервере разработки, сервере prod} и настраивая соединение через SQL Server {на моем компьютере, сервере разработки , prod server}). Все серверы находятся в одной сети. Так что никаких проблем с брандмауэром. Есть другие мысли? - person ; 15.07.2009
comment
Я использую пользователя SQL Server для своей строки подключения с SQL Server и проверкой подлинности окна. Я не нашел ничего полезного в отношении PermissionDemand. Тем не менее, я решил проблему. Смотрите мой ответ ниже. - person ; 15.07.2009

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

Оба сервера используют IIS7, поскольку они, естественно, находятся на Windows 2008 Server. Я перешел к расширенным настройкам для каждого пула приложений и заметил, что для параметра «Включить 32-разрядные приложения» в разделе «Общие» было установлено значение «Ложь» на сервере разработки, на котором работает веб-сайт, и «Истина» на производственном сервере, где он не работал. Поэтому я переключил его на False на рабочем сервере, чтобы он заработал!

Спасибо, Хади, за ваше время и помощь.

person Community    schedule 15.07.2009
comment
@ Джейсон, пожалуйста. Спасибо, что поделились информацией о том, как решить эту проблему. Видимо, я упускаю из виду настройки IIS. - person hadi teo; 16.07.2009