【问题标题】:Can't access SQL Server via IIS无法通过 IIS 访问 SQL Server
【发布时间】:2015-08-13 02:06:27
【问题描述】:

我想在本地 IIS 8 服务器上运行我的 ASP.NET MVC 应用程序,但我无法访问 SQL Server 2014。IIS 和 SQL Server 都在同一台主机上运行,​​并且我使用的是 Windows 8。这是到目前为止我做了什么:

在应用程序中,我创建了一个名为 Employee 的模型:

public class Employee
{
    public int Id { get; set; }
    public string Name { get; set; }
}

我想使用 Entity Framework 连接到数据库,所以我创建了另一个名为 EmployeeDbContext 的类:

public class EmployeeDbContext : DbContext
{
    public DbSet<Employee> Employees { get; set; }
}

我只有一个Home 控制器:

public string Index()
{
    EmployeeDbContext employeeDbContext = new EmployeeDbContext();
    return "Hello world";
}

我正在使用带有 Windows 身份验证的 SQL Server 2014 Express 引擎,我的计算机名称是 ZSÓTÉ。这是来自web.config 的连接字符串:

<add name="EmployeeDbContext" 
     connectionString="Server=ZSÓTÉ\SQLEXPRESS;Initial Catalog=Test;Integrated Security=SSPI" 
     providerName="System.Data.SqlClient" />

Global.asax 中我没有设置任何初始化策略,所以默认情况下如果Test 数据库不存在,那么应用程序应该自动创建它。

之后,我在属性窗口中设置为使用 IIS 本地服务器,并为应用程序创建一个虚拟目录。到目前为止一切正常,我可以在 IIS 管理器中看到应用程序,并设置为在 DefaultAppPool 下运行。之后,我为 IIS APPPOOL\DefaultAppPool 对象设置了项目文件夹的所有权限。设置很好,我可以完美地从 IIS 服务器访问应用程序。

最后,我在 SQL Server Management Studio 中为IIS APPPOOL\DefaultAppPool 创建了一个登录名,并设置了这两个角色:publicdbcreator。但即使在所有这些设置之后,应用程序也无法通过 IIS 正常工作。

虽然我在浏览器上收到“Hello world”消息,但从未创建过 Test 数据库。最奇怪的是,如果我对连接字符串进行恶意更改,我什至没有收到任何编译错误,只是浏览器中的“Hello world”消息。

我做错了什么?提前谢谢!

【问题讨论】:

  • "我为 IIS "APPOOL\DefaultAppPool" 创建了一个登录名。根据您的连接字符串,您正在使用 Integrated Security。您需要查看 windows 用户 您的应用程序池正在运行。那不是 APPOOL\DefaultAppPool,更可能是 LOCAL\System 或类似的东西。那是您需要添加的 windows 用户。更令人担忧的是,您的应用程序没有在任何地方记录连接失败。
  • 另外(更简单)您可以使用 SQL 身份验证,这意味着您只需在连接字符串中使用硬编码的用户/密码。
  • 它应该在“DeafaultAppPool”虚拟帐户下运行。但为了确定,我在 IIS 上将池标识更改为我的帐户(设置用户 ID,ant 密码),所以当我运行应用程序时,任务管理器向我显示 w3wp 进程正在我的帐户下运行。但它仍然不起作用。我是否错过了一些强制性安装?因为如果我删除提供者名称属性,例如从连接字符串中,我应该收到一个编译错误,但我什么也没得到。
  • 在我们遇到错误之前,很难以这种方式进行故障排除。如果您使连接字符串无效,您将收到运行时错误而不是编译错误。但是您甚至没有收到运行时错误。有时使用 EF,它会延迟加载,甚至在您请求数据将其显示在屏幕上之前,它甚至不会连接。

标签: sql-server asp.net-mvc entity-framework iis


【解决方案1】:

数据库是在您第一次访问实体时创建的。
尝试这样做:

public string Index()
{
    EmployeeDbContext employeeDbContext = new EmployeeDbContext();
    employeeDbContext.Employees.ToList();
    return "Hello world";
}

此时如果数据库创建不起作用,您将收到错误消息。

如果仍然无法解决问题的后续步骤:
在连接字符串中使用 .\SQLEXPRESS 因为重音可能会发生任何事情。
分配给具有 SQL Server 系统管理角色的用户。如果它有效,那么您就开始减少权利(或者,更好的是,改变方法)。

【讨论】:

  • 访问实体解决了问题,非常感谢!
猜你喜欢
  • 2015-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多