【问题标题】:MVC 4 Entity Framework Cannot Connect to Dynamically Created Database from IIS ServerMVC 4 实体框架无法从 IIS 服务器连接到动态创建的数据库
【发布时间】:2017-01-20 14:06:34
【问题描述】:

在我的本地 IIS 中托管我的应用程序后,系统突然给我错误:

无法打开登录请求的数据库“AlvinCMS”。登录 失败的。用户“NT AUTHORITY\SYSTEM”登录失败。

数据库 AlvinCMS 在运行时创建。系统在调试模式下没有问题。

这是我的 global.asax:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        //Check And Init Database
        Alvin_CMS.App_Start.DatabaseConfig.Initialize();
        ......

这是我的初始化:

public static void Initialize()
{
    Alvin_CMS.Models.AlvinCMSMigrationDBContext migrationDB = new Models.AlvinCMSMigrationDBContext();
    try
    {
        if (!migrationDB.Database.Exists())
        {
            migrationDB.Database.Initialize(false); //THIS CREATES DATABASE
            AlvinCMSExtension.Models.AccountDBContext accountDB = new AlvinCMSExtension.Models.AccountDBContext();
            accountDB.Database.Initialize(false);
            SetDefaultValue(migrationDB);
        }
        migrationDB.Database.Initialize(false);
    }
    catch (Exception e)
    {
        migrationDB.Database.Delete();
        AlvinCMSExtension.Helper.Log(e);
    }
}

这是我的上下文:

public AlvinCMSMigrationDBContext()
        : base("DefaultConnection")
{
    Database.SetInitializer<AlvinCMSMigrationDBContext>(new CreateDatabaseIfNotExists<AlvinCMSMigrationDBContext>());
}

我将应用程序池设置为使用LocalSystem,并且我的连接字符串中有IntegratedSecurity=true。我该如何解决这个错误?

注意:如果我在 Visual Studio 开发服务器上运行它,它运行良好,没有错误。此外,如果我使用 localDB 并在 IIS Express 上运行它,它也运行良好。问题只有在我使用 IIS 时才存在,即使我从 Visual Studio 本地 IIS Web 服务器调试程序,也会产生错误


更新

经过4个小时的调试,终于知道出了什么问题。错误存在是因为数据库不存在。我有另一个导致代码输入异常的数据库错误,因此没有创建数据库。

有问题的数据库有这个连接字符串:

Data Source=.\SQLEXPRESS;AttachDbFilename="C:\Users\Public\Documents\Projects\Alvin CMS Project\Alvin CMS\Alvin CMS\App_Data\db\backup\AlvinCMS_Default.mdf";Initial Catalog=AlvinCMS_Default;Integrated Security=True;MultipleActiveResultSets=True

当托管在 IIS 上时,程序无法附加数据库。它会导致此错误:

{"无法打开物理文件\"C:\Users\Public\Documents\Projects\Alvin CMS Project\Alvin CMS\Alvin CMS\App_Data\db\backup\AlvinCMS_Default.mdf\"。操作系统错误5 : \"5(拒绝访问。)\"。\r\n无法附加文件 'C:\Users\Public\Documents\Projects\Alvin CMS Project\Alvin CMS\Alvin CMS\App_Data\db\backup\AlvinCMS_Default。 mdf' 作为数据库 'AlvinCMS_Default'。"}

但是当我使用可视化开发服务器时,它工作正常。那么新的问题出现了,当托管在 IIS 服务器上时,如何安全地附加数据库而不会导致错误?

【问题讨论】:

  • 允许 NT AUTHORITY/SYSTEM 以系统管理员身份作为服务器角色。
  • 在 IIS 中启用了什么身份验证?
  • 我确实将 NT AUTHORITY/SYSTEM 更改为 sysadmin,但错误仍未修复。 IIS 的身份验证是Local System 这将使用 NT AUTHORITY/SYSTEM 访问数据库,对吗?
  • @AlvinStefanus 在问题中添加您的连接字符串。
  • 我已经更新了问题,显然还有另一个数据库导致代码进入Exception,这就是AlvinCMS数据库无法访问的原因,因为它不存在。

标签: c# asp.net-mvc entity-framework asp.net-mvc-4 iis


【解决方案1】:

您可以检查以下内容:

  1. 在您的Web.Config 中添加Integrated Security=SSPI

  2. 允许NT AUTHORITY/SYSTEM 以系统管理员身份作为服务器角色。

    转到安全 > 登录 > 选择 NT AUTHORITY\SYSTEM

为其提供应用所需的必要权限。

【讨论】:

  • 我已经将 NT AUTHORITY/SYSTEM 指定为系统管理员。我试图改变 IntegratedSecurity=SSPI。但是错误还是一样Cannot open database "AlvinCMS" requested by the login. The login failed. Login failed for user 'NT AUTHORITY\SYSTEM'.
【解决方案2】:

就像上面更新的问题一样,实际上数据库连接从来没有任何问题。实际发生的情况是,当我尝试访问另一个数据库时,访问被拒绝,这使得代码进入了异常并且从未触及数据库的创建。这就是为什么我无法登录访问数据库的原因,因为从未创建过数据库。

然后我需要修复导致故障的另一个数据库。问题是我无法附加数据库。访问一直被拒绝。在我做了一些研究之后**我发现我在使用 SQLEXPRESS 之前使用的是 LocalDB。我从 LocalDB 中删除了数据库,但显然 localDB 仍在引用该数据库,这就是为什么我的访问被拒绝的原因,因为 LocalDB 仍在使用该数据库。所以我所做的就是运行:

sqllocaldb.exe stop v11.0 来自 cmd(您也可以在 Visual Studio 的命令行中运行它)。

然后,我终于可以毫无问题地附加我的数据库了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多