【问题标题】:ASP.NET SqlException when publishing in IIS Web Server在 IIS Web 服务器中发布时出现 ASP.NET SqlException
【发布时间】:2015-12-16 21:10:57
【问题描述】:

我刚刚开始在 Visual Studio 2015 和 SQL Server 2014 中开发 ASP.NET Web 应用程序。在某个地方,我需要连接到我的本地数据库并使用它:

ConnStr = "Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=my_db;Integrated Security=True";

当我在浏览器中通过 VS 运行应用程序时,它运行良好。我可以访问数据库并做任何我想做的事情。但是,当我在 IIS Web 服务器中发布我的应用程序,然后在浏览器中打开它时,它仍然可以正常工作,直到我必须访问数据库。那时它会抛出 SqlException:

System.Data.SqlClient.SqlException: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible.

可能是服务器名称问题,我应该使用 IP 和端口而不是那个名称,但我不确定,因为我没有这方面的经验。

【问题讨论】:

  • 那里提出的解决方案都不适合我。
  • 您是否真的在要发布到的网络服务器上安装了 SQL Server?您正在使用 LocalDb 连接字符串,该字符串使用 SQL Server LocalDb,需要在服务器上安装。
  • WebServer 也是我的本地机器。

标签: c# asp.net sql-server iis sqlexception


【解决方案1】:

您是对的:您应该在连接字符串中使用服务器名称和/或 IP。

使用“local”或“localhost”之类的内容意味着您的代码不可移植。另一种选择是将连接字符串存储在两个单独的配置文件中 - 一个用于本地副本(用于开发和故障排除),一个用于服务器(用于可移植性)。我的解决方案中有两个配置文件:

  • Web.config
  • WebServer.config

然后,当我部署到服务器时,我只需删除 Web.config 并将 WebServer.config 重命名为 Web.config。它完全便携,您再也不会遇到连接字符串问题!

另外值得注意的是:您没有在连接字符串中包含凭据,这意味着您在连接到 SQL Server 时正在使用 Windows 身份验证。通过 Visual Studio 进行调试时,应用程序将像您一样运行 - 如果您拥有所需的权限,它就会工作。但是,在 IIS 中运行时,它不会像您一样运行(至少,它不应该如此) - 因此您也可能会遇到问题。

编辑

此链接可能对您有用:https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx

您的连接字符串应如下所示:

Data Source=192.168.1.10,1433;Initial Catalog=YourDatabaseName;User ID=SqlUserName;Password=SqlPassword;Connection Timeout=60; Max Pool Size=3000; 

(您可以根据需要设置最大池大小和连接超时 - 或完全忽略它们。

另外,关于您的 Windows 问题 - 您需要确保 IIS 使用的 Windows 帐户有权遍历您的网络并访问您的 SQL Server 实例。也就是说,我建议您使用 SQL 帐户而不是 Windows 身份验证。

【讨论】:

  • 我创建了一个非windows用户,但还是同样的问题。我可以在 VS 中访问数据库,但在 IIS 中发布时不能。假设我的 IP 是 192.168.1.10,SQL Server 端口是 1433,这种情况下 Data Source 应该是怎样的?
【解决方案2】:

由于您在连接字符串中使用集成安全性,因此您必须修改运行应用程序的应用程序池的标识。 身份将是您的 Windows 用户名和密码。 要更改用户名和密码,您需要进入应用程序池和进程模型的高级设置,您可以看到身份,您可以在其中添加 Windows 凭据

希望对你有帮助

【讨论】:

    【解决方案3】:

    你的连接字符串有两个问题:

    “集成安全”表示您正在使用本机 Windows 系统进行身份验证。类似于使用 Windows 密码在数据库上打开 SSMS。 IIS 现在正在尝试连接到数据库,并且连接字符串告诉使用 IIS 正在运行的进程。

    您可以在 SQL Server 中创建一个非 Windows 用户并将凭据放入连接字符串中。或者,您可以授予 IIS 用户 DB 权限。或者你可以在这里做很多不同的事情,但这些是最容易让你动起来的。

    连接字符串中的第二个问题是数据源。您的本地计算机上有 SQL Server 吗?如果是这样,那就是它不起作用的原因。尝试在 VS 中运行您的应用程序,但要针对远程 SQL Server。那应该是您的下一步。

    【讨论】:

    • 我创建了一个非windows用户,但还是同样的问题。我可以在 VS 中访问数据库,但在 IIS 中发布时不能。还有什么我可以做的吗?
    【解决方案4】:

    问题是我认为 SQL Server 是使用 VS 或至少使用 SQL Server Management Studio 自动安装的。但不是。因此,据我所知,直到知道我还没有使用过真正的 SQL Server。当我检查 SQL Server 配置管理器时,SQL Server 服务上没有运行任何东西,所以我意识到我遗漏了一些东西。

    然后,我安装了 SQL Server Express 并在那里构建了我的数据库。现在即使我发布它也能正常工作。连接字符串是

    Data Source=.\\SQLEXPRESS;Initial Catalog=my_db;User ID=username;Password=pass

    也可以是:

    Data Source=localhost\\SQLEXPRESS;Initial Catalog=my_db;User ID=username;Password=pass

    【讨论】:

    • 很高兴你成功了!您基本上不应该使用 Visual Studio 附带的“内置”SQL Server。 Express 是免费的(并且代码将是可移植的),因此如果您没有完整的安装,请使用它作为最后的手段。另外,请记住接受对您帮助最大的答案,以便将来的用户能够轻松找到它。欢迎来到论坛,祝你好运!
    猜你喜欢
    • 2018-06-30
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多