我是using the AccessProviders,为我的ASP.Net网站而不是内置的SQLServer提供商提供会员资格,角色,个性化和个人资料。
我在IIS7上使用ASP.Net 2.0。在ASP.Net开发服务器上一切正常,整个模块正常工作,但是当我在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开发服务器上运行,但我的工作正在运行。因此,这可以清除任何恶意的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>
BIG UPDATE:我更改了AccessConnectionHelper.cs类的功能以抛出实际错误而不是静态错误。现在,它告诉我The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine.
我检查了错误,结果发现我的机器和IIS7服务器都在x64架构上。可能的解决方案是重新编译x86框架的AccessProviders项目,我尝试了但是这个错误引发: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文件夹提供正确权限的问题,但服务器人员说他们已经给予文件夹适当的权限以允许写操作。所以我现在想知道这个错误是否可能是由写入权限不足引起的,或者仅仅是一个无能的服务器人的情况?
所以,我仍然没有运气。
这就是它。非常感谢任何帮助,提前谢谢。
答案 0 :(得分:1)
问题在于您的连接字符串:
<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位。
如果无法做到这一点,请下载并安装Microsoft Access数据库引擎可再发行组件64位组件:
下载并安装:AccessDatabaseEngine_x64.exe
(这些驱动程序可能已安装在您的服务器上)
然后将连接字符串更改为:
<add name="AccessFileName"
connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|ASPNetDB.mdb"
providerName="System.Data.OleDb"/>