【问题标题】:How do I not use the App_Data folder in an ASP MVC4 application?如何不在 ASP MVC4 应用程序中使用 App_Data 文件夹?
【发布时间】:2014-10-16 19:42:41
【问题描述】:

在本地一切正常,但是当我发布时,出现以下错误。我正在使用表单身份验证,但我将自己的连接字符串定义为非 sqlexpress 数据库。我不明白为什么我的应用程序需要访问权限才能在 App_Data 文件夹中创建数据库(或其他任何内容),因为我的数据库不存在/不会存在。任何帮助表示赞赏。

连接字符串:

<connectionStrings>
    <add name="DataContext" providerName="System.Data.SqlClient" connectionString="Data Source=localhost;Initial Catalog={my db};Integrated Security=SSPI;MultipleActiveResultSets=True" />
</connectionStrings>

错误:

访问被拒绝创建 App_Data 子目录

说明:出于安全原因,身份“IIS APPPOOL\ASP.NET v4.0”(此 Web 应用程序在其下运行)无权在应用程序根目录中创建 App_Data 子目录。 ASP.NET 将用于服务(例如 Membership 和 Profile)的 Microsoft SQL Express 数据库文件存储在应用程序的 App_Data 子目录中。

编辑:它告诉我如何通过添加 App_Data 文件夹并提供正确的权限来修复错误,但我不明白为什么我需要这个文件夹,如果我可以避免更改权限,我想到。

【问题讨论】:

    标签: sql-server asp.net-mvc forms-authentication


    【解决方案1】:

    我想我终于想出了如何阻止 ASP 尝试在 App_Data 文件夹中自动创建 ASPNETDB.MDF 数据库。我发现的工作结合了两个现有的 stackoverflow 答案:

    Disable SQL Membership Provider (ASP.Net Forms Authentication)

    事实证明,在生产机器上,SQL 成员资格提供程序是在 machine.config 中定义的。我认为运营团队没有对默认的 Windows 2008 安装进行任何更改,因此该平台可能通常是这种情况。

    要删除对更高级别定义的任何 SQL 提供程序的引用,请在您的 web.config 中包含以下内容

    <membership>
        <providers>
            <clear />       
        </providers>
    </membership>
    <roleManager enabled="false">
        <providers>
            <clear />       
        </providers>
    </roleManager>
    <profile>
        <providers>
            <clear />       
        </providers>
    </profile>
    

    AspNet Role provider kicking in and it shouldn't be

    要禁用“SimpleMembership”,您可以添加应用设置 enableSimpleMembership,值为“false”(web.config)。这将阻止 webmatrix 重新配置 RoleManager。

    <configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
        <appSettings>
            <add key="enableSimpleMembership" value="false" />
        </appSettings>
    </configuration>
    

    【讨论】:

      【解决方案2】:

      检查 web.config 中“membership”节点的“connectionStringName”属性是否设置为您的连接字符串,如下所示:

      <membership defaultProvider="DefaultMembershipProvider">
        <providers>
          <add name="DefaultMembershipProvider" 
               type="System.Web.Providers.DefaultMembershipProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
               connectionStringName="DataContext"
               enablePasswordRetrieval="false" 
               enablePasswordReset="true" 
               requiresQuestionAndAnswer="false" 
               requiresUniqueEmail="false" 
               maxInvalidPasswordAttempts="5" 
               minRequiredPasswordLength="6" 
               minRequiredNonalphanumericCharacters="0" 
               passwordAttemptWindow="10" 
               applicationName="/" />
        </providers>
      </membership>
      

      【讨论】:

      • 感谢您的反馈,斯蒂芬。我想我包含了一个 nuget 包或引用或自动包含 DefaultMembershipProvider 的东西,即使我没有在我的项目中使用它。理想情况下,我试图完全摆脱它,这样我就不需要 App_Data 文件夹来存储任何文件/localdb。
      • 如果不使用,可以从web.config中删除
      • 就是这样,我的 web.config 中没有引用它。显然它在 machine.config 文件中(我对此并不熟悉),并且我不想更改任何可能影响其他应用程序/未来开发的内容。
      • 我明白了。很高兴你找到了答案:)
      【解决方案3】:
      *<membership>
          <providers>
              <clear />       
          </providers>
      </membership>
      <roleManager enabled="false">
          <providers>
              <clear />       
          </providers>
      </roleManager>
      <profile>
          <providers>
              <clear />       
          </providers>
      </profile>*
      

      【讨论】:

        猜你喜欢
        • 2014-12-25
        • 2015-11-03
        • 2010-11-28
        • 1970-01-01
        • 1970-01-01
        • 2019-07-17
        • 2020-08-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多