AccessProviders работает на сервере WebDevelopment, но не на IIS7 - PullRequest
1 голос
/ 15 июня 2011

Я использую AccessProviders , чтобы предоставить членство, роли, персонализацию и профили для моего веб-сайта ASP.Net вместо встроенных поставщиков SQLServer.

Я использую ASP.Net 2.0 на IIS7. На ASP.Net Development Server все работает нормально, весь модуль работает как надо, но когда я переключаю его на IIS7, он не работает, выдает следующую ошибку, когда кто-то пытается войти:

Server Error in '/' Application.

AccessFile is not valid: D:\~thewholepath~\App_Data\ASPNetDB.mdb

Source Error: 
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace: 

[Exception: AccessFile is not valid: D:\~thewholepath~\App_Data\ASPNetDB.mdb]
   Samples.AccessProviders.AccessConnectionHelper.EnsureValidMdbFile(String fileName) +231
   Samples.AccessProviders.AccessConnectionHelper.BuildConnectionForFileName(String dbFileName) +496
   Samples.AccessProviders.AccessConnectionHelper.GetConnection(String dbFileName, Boolean revertImpersonation) +205
   Samples.AccessProviders.AccessMembershipProvider.ValidateUser(String username, String password) +182
   System.Web.UI.WebControls.Login.AuthenticateUsingMembershipProvider(AuthenticateEventArgs e) +75
   System.Web.UI.WebControls.Login.AttemptLogin() +152
   System.Web.UI.WebControls.Login.OnBubbleEvent(Object source, EventArgs e) +124
   System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +70
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +29
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2981

Version Information: Microsoft .NET Framework Version:2.0.50727.4959; ASP.NET Version:2.0.50727.4955

Я искал в Интернете некоторые ответы, получил некоторые указатели, но они просто не работают для меня. Кроме того, разница во всех этих решениях заключалась в том, что их модуль не работал даже на ASP.Net Development Server, а мой работает. Итак, это очищает ASPNetDB.mdb от любого злого умысла.

Из этого я понял, что в файле web.config должна быть какая-то ошибка конфигурации, поэтому вот соответствующие части из файла web.config:

<connectionStrings>
   <add name="AccessFileName" connectionString="~/App_Data/ASPNetDB.mdb" providerName="System.Data.OleDb" />
</connectionStrings>

<authentication mode="Forms">
      <forms loginUrl="admin-login.aspx" defaultUrl="index.aspx" />
</authentication>


<authentication mode="Forms">
  <forms loginUrl="admin-login.aspx" defaultUrl="index.aspx" />
</authentication>
<membership defaultProvider="AccessMembershipProvider" hashAlgorithmType="SHA1">
  <providers>
    <clear />
    <add name="AccessMembershipProvider" type="Samples.AccessProviders.AccessMembershipProvider, SampleAccessProviders" connectionStringName="AccessFileName" enablePasswordRetrieval="false" enablePasswordReset="false" requiresUniqueEmail="false" requiresQuestionAndAnswer="false" minRequiredPasswordLength="8" minRequiredNonalphanumericCharacters="1" applicationName="fmobiles" hashAlgorithmType="SHA1" passwordFormat="Hashed" />
  </providers>
</membership>
<roleManager enabled="true" defaultProvider="AccessRoleProvider" cacheRolesInCookie="true" cookieName=".ASPXROLES" cookieTimeout="30" cookiePath="/" cookieRequireSSL="false" cookieSlidingExpiration="true" cookieProtection="All">
  <providers>
    <add name="AccessRoleProvider" type="Samples.AccessProviders.AccessRoleProvider, SampleAccessProviders" connectionStringName="AccessFileName" applicationName="fmobiles" />
  </providers>
</roleManager>
<profile enabled="true" defaultProvider="AccessProfileProvider">
  <providers>
    <add name="AccessProfileProvider" type="Samples.AccessProviders.AccessProfileProvider, SampleAccessProviders" connectionStringName="AccessFileName" applicationName="fmobiles" description="Stores and retrieves profile data from an ASP.NET_Access_Providers database." />
  </providers>
  <properties>
    <add name="FriendlyName" type="string" allowAnonymous="true" serializeAs="String" />
    <add name="Height" type="int" allowAnonymous="true" serializeAs="String" />
    <add name="Weight" type="int" allowAnonymous="true" serializeAs="Xml" />
  </properties>
</profile>
<anonymousIdentification enabled="false" cookieName=".ASPXANONYMOUS" cookieTimeout="100000" cookiePath="/" cookieRequireSSL="false" cookieSlidingExpiration="true" cookieProtection="None" domain="" />
<webParts>
  <personalization defaultProvider="AccessPersonalizationProvider">
    <providers>
      <add name="AccessPersonalizationProvider" type="Samples.AccessProviders.AccessPersonalizationProvider, SampleAccessProviders" connectionStringName="AccessFileName" applicationName="fmobiles" />
    </providers>
  </personalization>
</webParts>

БОЛЬШОЕ ОБНОВЛЕНИЕ: Я изменил функцию класса AccessConnectionHelper.cs, чтобы выдавать фактическую ошибку, а не статическую ошибку. Теперь он говорит мне, что The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine. Я искал в отношении ошибки, и оказалось, что моя машина и сервер IIS7 работают на архитектуре x64. Возможное решение для этого состоит в том, чтобы перекомпилировать проект AccessProviders для платформы x86, я попробовал это, но затем эта ошибка выдает: Could not load file or assembly 'SampleAccessProviders' or one of its dependencies. An attempt was made to load a program with an incorrect format.

ПОСЛЕДНИЕ ОБНОВЛЕНИЯ: С помощью Mr.Kev причина ошибки была сужена до установки параметра Включить 32-битные приложения в значение true для пула приложений моего веб-сайта, серверные ребята сделали эту настройку и эта ошибка исчезла. Теперь появилась новая проблема: файл ASPNetDB.mdb, в котором хранятся данные аутентификации / членства / ролей, читается нормально (я знаю это, поскольку при вводе неверных учетных данных ошибка не является ошибкой ASP.Net), но файл не может быть записан (поскольку, когда я устанавливаю правильные учетные данные, модуль AccessProviders пытается записать информацию для входа в файл), возникает ошибка: «Операция должна использовать обновляемый запрос». Я знаю, что это просто вопрос предоставления необходимых разрешений для папки App_Data, но серверные ребята говорят, что они уже дали соответствующие разрешения для папки, чтобы разрешить операцию записи. Теперь мне интересно, может ли эта ошибка быть вызвана чем-то, кроме недостаточных прав на запись, или это просто случай некомпетентного сервера?

Итак, я все еще застрял без удачи.

Вот и все. Любая помощь высоко ценится, заранее спасибо.

1 Ответ

1 голос
/ 15 июня 2011

Проблема с вашей строкой соединения:

<add name="AccessFileName" 
     connectionString="~/App_Data/ASPNetDB.mdb" 
     providerName="System.Data.OleDb" />

Что вы хотите:

<add name="AccessFileName" 
     connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|ASPNetDB.mdb" 
     providerName="System.Data.OleDb" />

Обновление:

Решитьпроблема The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine., измените пул приложений, на котором работает сайт, на 32-битный режим.Это связано с тем, что этот драйвер является 32-разрядным.

Если это невозможно, загрузите и установите распространяемые 64-разрядные компоненты Microsoft Access Database Engine:

База данных Microsoft AccessРаспространяемый Engine 2010

Скачать и установить: AccessDatabaseEngine_x64.exe

(эти драйверы уже могут быть установлены на вашем сервере)

Затем измените строку подключения на:

<add name="AccessFileName" 
     connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|ASPNetDB.mdb" 
     providerName="System.Data.OleDb"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...