Получение «ошибки автоматического создания файла базы данных SQLExpress» для сайта, который использует AspNetSqlMembershipProvider, но строка подключения к SQL Server 2005 - PullRequest
7 голосов
/ 10 сентября 2009

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

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

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

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

А потом я получаю сообщение об ошибке, сообщающее, что он испытал «SQLExpress database file auto-creation error

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

Одна странная подсказка: перед последней строкой события OnLoggedIn я вставил следующее:

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

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

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

Ответы [ 3 ]

12 голосов
/ 10 сентября 2009

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

Если все, что есть в вашем файле 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>

Как видите, первый провайдер настроен на использование строки соединения с именем 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>

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

1 голос
/ 10 сентября 2009

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

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

0 голосов
/ 13 мая 2013

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

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

...