在IIS Web服务器发布时出现ASP.NET SqlException

3

我刚开始在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和端口而不是名称,但我不确定,因为我没有经验。


可能是重复的问题 http://stackoverflow.com/questions/12816164/cannot-connect-sql-server-2008-from-another-computer?lq=1 - nobody
那里提出的解决方案都对我不起作用。 - Dionis Beqiraj
你是否在要发布的 Web 服务器上实际安装了 SQL Server?你正在使用 LocalDb 连接字符串,它使用 SQL Server LocalDb,需要在服务器上安装。 - Erik Funkenbusch
Web服务器也是我的本地机器。 - Dionis Beqiraj
4个回答

1
您说得对:在连接字符串中应该使用服务器名称和/或IP。使用类似“local”或“localhost”的内容意味着您的代码不可移植。另一个选择是将连接字符串存储在两个单独的配置文件中 - 一个用于本地副本(用于开发和故障排除),另一个用于服务器(用于可移植性)。我的解决方案中有两个配置文件:
Web.config
WebServer.config
然后,当我部署到服务器时,只需删除Web.config并将WebServer.config重命名为Web.config即可。它完全可移植,您将永远不会再遇到连接字符串问题!
还值得注意的是:您没有在连接字符串中包含凭据,这意味着在连接到SQL Server时使用Windows身份验证。通过Visual Studio进行调试时,应用程序将作为您运行 - 如果您具有所需的权限,则可以正常工作。但是,在IIS中运行时,它不会作为您运行(至少不应该) - 因此您也可能会遇到问题。
编辑

这个链接可能对你有用:https://msdn.microsoft.com/zh-cn/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。在这种情况下,数据源应该如何设置? - Dionis Beqiraj

1
由于您在连接字符串中使用了集成安全性,因此您需要修改应用程序池的身份,该应用程序池是您的应用程序正在运行的下层。身份将是您的Windows用户名和密码。要更改用户名和密码,您需要进入应用程序池和进程模型的高级设置,您可以看到身份,您可以添加您的Windows凭据。希望这能帮到您。

1

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

"Integrated Security" 表示您正在使用本机 Windows 系统进行身份验证。类似于使用 Windows 密码在数据库上打开 SSMS。现在,IIS 尝试连接到数据库,并且连接字符串要求使用 IIS 正在运行的进程。

您可以在 SQL Server 中创建非 Windows 用户,并将凭据放入连接字符串中。或者您可以授予 IIS 用户 DB 权限。或者您可以在这里进行许多不同的操作,但这些是使您继续前进最容易的方法。

连接字符串中的第二个问题是数据源。您本地计算机上是否安装了 SQL Server?如果是,则不能正常工作。尝试在 VS 中运行应用程序,但针对远程 SQL Server 运行。那应该是您的下一步。


我创建了一个非Windows用户,但问题仍然存在。我可以在VS中访问数据库,但在将其发布到IIS时却不能。还有其他什么我可以做的吗? - Dionis Beqiraj

0
问题在于我以为 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 是免费的(而且代码可移植),所以如果你没有完整的安装包,可以将其作为最后的选择。另外,请记得接受对你最有帮助的答案,这样未来的用户就能轻松找到它。欢迎来到论坛,祝你好运! - Stan Shaw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接