Я использую 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, но серверные ребята говорят, что они уже дали соответствующие разрешения для папки, чтобы разрешить операцию записи. Теперь мне интересно, может ли эта ошибка быть вызвана чем-то, кроме недостаточных прав на запись, или это просто случай некомпетентного сервера?
Итак, я все еще застрял без удачи.
Вот и все. Любая помощь высоко ценится, заранее спасибо.