无法使用SQL身份验证从IIS托管应用程序连接到SQL Server数据库

时间:2014-08-07 21:37:10

标签: c# sql .net sql-server entity-framework

我一直在使用Entity Framework 6.0为我的后端连接在VS 2012中开发一个应用程序。我建立了与SQL Server 2008数据库的连接,并成功配置了Entity Framework模型(数据库优先)。但是,当我在IIS中运行应用程序时尝试连接到数据库时,我一直都会遇到异常。

有几层例外,但最里面的例外显示为:

  

连接尝试失败,因为连接方在一段时间后没有正确响应,或者由于连接主机无法响应而建立连接失败

我已经尝试将连接超时延长到60,但这并没有产生影响,通过其他方式连接也不会花费那么长时间,所以我不认为它与超时有关。调用应用程序是一个Web API项目并托管在本地IIS中,我已将我的EF模型项目中的确切连接字符串复制到此项目中的web.config文件,如下所示:

<add name="ConnectionName" 
     connectionString="metadata=res://*/ModelName.csdl|res://*/ModelName.ssdl|res://*/ModelName.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=server,portnumber;initial catalog=dbname;persist security info=True;user id=user;password=password;MultipleActiveResultSets=True;&quot;" 
     providerName="System.Data.EntityClient" />

我已经使用标准SQL客户端连接(不是来自IIS应用程序),通过SQL Server Management Studio成功连接到此连接,甚至在本地测试时使用相同的EF连接字符串,但由于某种原因我不能这样做在IIS中托管应用程序时连接代码。我可以在调试时确认DbContext类正在使用适当的连接信息。

更新: 我发现该问题并非特定于实体框架。当我使用SQL客户端进行测试时,问题就出现了。但是,它确实发生在IIS中托管的每个应用程序中,而不仅仅是我的Web API应用程序。但是,仍然无法准确确定问题所在。

2 个答案:

答案 0 :(得分:0)

在此连接字符串中,SQL Server名为server,端口号为portnumber。显然,在通过SSMS连接时,您不会使用此功能。为什么不改变此连接字符串以匹配SSMS中的任何工作。

至少应该是localhost而不是server

connectionString="
metadata=res://*/ModelName.csdl|
res://*/ModelName.ssdl|
res://*/ModelName.msl;
provider=System.Data.SqlClient;
provider connection string=&quot;
    data source=localhost;initial catalog=dbname;
persist security info=True;
user id=user;
password=password;
MultipleActiveResultSets=True;&quot;"

(回车只是为了清晰起见)

答案 1 :(得分:0)

我发现了这种情况发生的原因。在IIS中,我必须启用Windows身份验证并为我的应用程序禁用匿名身份验证。我不确定为什么在没有对我的Windows身份进行身份验证的情况下无法使用SQL身份验证连接到SQL Server,但这是允许我通过IIS连接的解决方案。