Получение & # 8220; Ошибка автоматического создания файла базы данных SQLExpress & # 8221; для сайта, который использует AspNetSqlMembershipProvider, но строка подключения к SQL Server 2005

StackOverflow https://stackoverflow.com/questions/1402430

Вопрос

У меня есть веб-сайт ASP.NET v2.0 (не веб-приложение), где корневой каталог общедоступен, но администратор " Администратор " Подкаталог требует аутентификации. Все в настройке очень общее - я использовал строку подключения, определенную в корневом web.config, и стандартный поставщик AspNetSqlMembershipProvider , и я использую элемент управления ASP.NET Login.
Файл web.config в каталоге Admin указывает, что пользователь должен иметь " Admin " роль.

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

когда я вхожу в систему, элемент управления " OnLoggedIn " события пожары.
Последняя строка в этом коде события перенаправляет меня на мою страницу Admin / Default.aspx . Моя точка останова в "OnLoggedIn" показывает мне, что все хорошо, пока перенаправление вниз в мой каталог администратора ... а затем ...

... а потом я жду ... и жду ...

А затем я получаю сообщение об ошибке, сообщающее, что произошла ошибка SQLExpress при создании файла базы данных . "

Почему в мире вдруг создается файл SQL Server Express? Почему он вдруг игнорирует мою строку подключения?

Одна странная подсказка: непосредственно перед последней строкой " OnLoggedIn " Событие, которое я поместил в это:

bool blnTest = User.IsInRole("Admin");

Я хотел посмотреть, если blnTest = true .
Происходит следующее: процесс попадает в эту строку ... и ждет ... и в конечном итоге говорит мне, что не может получить доступ к базе данных SQL Server Express. Кажется, что любая ссылка (или в моем коде, или за кулисами) для определения роли пользователя вызывает неверную базу данных.

РЕДАКТИРОВАТЬ: Argh, иногда ждет, когда я тестирую blnTest. В других случаях он немедленно сообщает значение как «ложное».

Это было полезно?

Решение

Судя по вашему комментарию, похоже, что вы явно не настроили поставщика ролей для своего сайта.

Если все, что есть в вашем файле web.config, это:

<roleManager enabled="true" />

Затем вы полагаетесь на провайдеров по умолчанию, объявленных далее в иерархии конфигурации (machine.config, global web.config и т. д.)

В machine.config у вас, вероятно, есть что-то вроде:

<roleManager>
  <providers>
    <add name="AspNetSqlRoleProvider" 
      connectionStringName="LocalSqlServer" 
      applicationName="/" 
      type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
    <add name="AspNetWindowsTokenRoleProvider" 
      applicationName="/" 
      type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
  </providers>
</roleManager>

Как видите, первый провайдер настроен на использование connectionString с именем LocalSqlServer, который также обычно объявляется в machine.config:

<add name="LocalSqlServer" 
     connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" 
     providerName="System.Data.SqlClient"/>

И это предназначено для использования локальной файловой базы данных, которая будет создана, если она еще не существует.

Таким образом, чтобы заставить роли работать на вашем сайте, вы должны изменить свой корневой web.config на что-то вроде:

<roleManager enabled="true">
  <providers>
    <clear />
    <add name="AspNetSqlRoleProvider" 
      connectionStringName="YourConnectionStringName" 
      applicationName="/" 
      type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
  </providers>
</roleManager>

Использование < clear / > Элемент удалит все ранее определенные провайдеры для этого типа.

Другие советы

Когда вы указываете параметр AttachDBFilename в строке подключения, вы на самом деле запрашиваете свой собственный экземпляр SQL Server, предоставленный как раз вовремя, или «пользовательский экземпляр». Этот экземпляр создается путем запроса к экземпляру «master» (экземпляру. \ SQLEXPRESS) предоставления дочернего экземпляра, что подразумевает копирование master / model / msdb в ваш профиль, начиная новый процесс SQL Server под вашей учетной записью, настроенный для использования только что скопированный master / model / msdb, затем запрашивающий этот «дочерний» экземпляр присоединить указанный «файл» в качестве новой базы данных. Подробности объясняются в пользовательских экземплярах SQL Server 2005 Express Edition .

Процесс создания дочернего экземпляра чрезвычайно хрупок, и когда он прерывает вызов БД, это приводит к ошибке времени ожидания при открытии соединения. В вашем случае кажется, что процесс прерывается в некоторых случаях (когда вы попадаете на защищенную часть сайта). Почему это ломается, очень сложно догадаться без правильной информации. Посмотрите на Общие проблемы в связанной статье и посмотрите, относится ли это к вам. Также проверьте системный журнал событий на наличие сообщений о том, почему дочерние экземпляры не могут запуститься или не могут открыть файл MDF. Обратите внимание, что распространенной ошибкой является запрос одного и того же физического файла с AttachDBFilename под разными учетными данными: у каждого удостоверения будет свой собственный дочерний экземпляр, и только первый сможет подключить нужную базу данных.

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

Проверьте в services.msc, чтобы увидеть, запущена ли служба sqlexpress. Если это так, проверьте, установлен ли на вашем компьютере sql express

scroll top