我正在尝试运行IIS托管的应用程序(以电影数据库的形式)来教我自己如何设计3层架构程序:MVC应用程序,WCF服务,SQL Server数据库。由于我没有完整SQL Server的许可证密钥,因此我决定使用LocalDB并拥有包装存储过程的WCF服务。这是我第一次使用LocalDB并遇到连接到我的实例v13.0的问题。
我的问题:
在我的生活中,我无法在VS中获取我的项目以连接到LocalDB实例。我一直收到以下错误:
建立与SQL Server的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确,以及SQL Server是否配置为允许远程连接。 (提供程序:SQL网络接口,错误:50 - 发生本地数据库运行时错误。指定的LocalDB实例不存在。
我的连接字符串(来自Web.config):
<connectionStrings>
<add name="MovieDB" connectionString="Data Source=(localdb)\v13.0;Initial Catalog=MovieDB;Integrated Security=True;AttachDbFilename=|DataDirectory|\MovieDB.mdf" />
</connectionStrings>
使用sqlcmd连接到它并运行查询运行正常:
Visual Studio SQL Server对象资源管理器可以正常连接:
连接字符串,当它到达有问题的行时由Visual Studio转义,因此我知道连接字符串未被错误地转义:
"Data Source=(localdb)\\v13.0;Initial Catalog=MovieDB;Integrated Security=True;AttachDbFilename=|DataDirectory|\\MovieDB.mdf"
我尝试按照本指南(Part 1和Part 2)进行操作,截至2016年4月18日,图片已被破坏,因此我无法完全理解我的所有内容39;我应该这样做。我只能得到上述错误,因为我将应用程序池标识更改为LocalSystem:
当应用程序池在ApplicationPoolIdentity标识下运行时,我收到此错误:
建立与SQL Server的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确,以及SQL Server是否配置为允许远程连接。 (提供程序:SQL网络接口,错误:50 - 发生本地数据库运行时错误。无法获取本地应用程序数据路径。很可能未加载用户配置文件。如果在IIS下执行LocalDB,请确保启用了配置文件加载当前用户。
我甚至修改了C:\ windows \ system32 \ inetsrv \ config \ applicationHost.config文件以强制加载配置文件。仍然没有。
<applicationPools>
<add name="DefaultAppPool" />
<add name="Classic .NET AppPool" managedRuntimeVersion="v2.0" managedPipelineMode="Classic" />
<add name=".NET v2.0 Classic" managedRuntimeVersion="v2.0" managedPipelineMode="Classic" />
<add name=".NET v2.0" managedRuntimeVersion="v2.0" />
<add name=".NET v4.5 Classic" managedRuntimeVersion="v4.0" managedPipelineMode="Classic" />
<add name=".NET v4.5" managedRuntimeVersion="v4.0">
<!-- I added this, before it was an empty node -->
<processModel identityType="ApplicationPoolIdentity" loadUserProfile="true" setProfileEnvironment="true" />
</add>
<applicationPoolDefaults managedRuntimeVersion="v4.0">
<!-- This was already here -->
<processModel identityType="ApplicationPoolIdentity" loadUserProfile="true" setProfileEnvironment="false" />
</applicationPoolDefaults>
</applicationPools>
我的应用程序正在&#34; .NET 4.5&#34;应用程序池
我的代码:
页面加载并调用此服务以获取数据库中的电影列表:
[ServiceContract]
public interface IMovieDBService
{
// ...
[OperationContract]
List<Movie> GetMovies(int actorID);
// ...
}
public class MovieDBService : IMovieDBService
{
// ...
public List<Movie> GetMovies(int actorID = 0)
{
var output = new List<Movie>();
using (var connection = DBTools.GetConnection(MovieDBConnectionName)) // Does not get past here; MovieDBConnection = "MovieDB"
{
var parameters = new List<SqlParameter>
{
new SqlParameter("@actorID", actorID)
};
using (var reader = connection.ExecuteStoredProcedure("GetMovies", parameters))
{
while (reader.Read())
{
output.Add(new Movie
{
ID = reader.GetInt32("ID"),
Title = reader.GetString("Title"),
Year = reader.GetInt16("Year"),
Genre = GetGenre(reader.GetInt32("GenreID"))
});
}
}
}
return output;
}
// ...
}
我的DBTools项目中有问题的方法:
public static SqlConnection GetConnection(string connectionName)
{
var connection = new SqlConnection();
var connectionString = ConfigurationManager.ConnectionStrings[connectionName];
if (connectionString != null)
{
connection.ConnectionString = connectionString.ConnectionString;
connection.Open(); // breaks here
return connection;
}
return null;
}
我只能假设问题与身份验证有关,或者IIS托管的应用程序尝试连接到LocalDB用户进程这一事实,但我已尝试按照其他问题的说明进行操作但未成功(可能是因为未能理解真正的问题)。我不知所措......
答案 0 :(得分:1)
试试这个:在你的applicationhost文件中尝试将processModel identityType更改为SpecificUser,还包括用户名和密码。或者将您的应用程序池标识更改为具有数据库权限的用户。当您作为应用程序池标识运行时,根据您的屏幕截图,您将作为本地系统运行 - 这是一个预定义的本地帐户,而sqlcmd作为您登录的用户运行。
答案 1 :(得分:0)
问题是您的 IIS 应用程序池帐户无法看到 localdb 实例,因为只有创建该实例的帐户才能访问它,这很可能是您的个人用户帐户。您可以通过运行以下命令与您计算机上的其他用户(例如 IIS 应用程序池帐户)共享它:
sqllocaldb share v13.0 v13.0_shared
我们共享 v13.0
实例并将共享实例命名为 v13.0_shared
。然后您将连接字符串的 Data Source
部分更改为:
Data Source=(localdb)\.\v13.0_shared
注意实例名称前的前导 .\
。这表明您要连接到共享实例。
现在您的所有 IIS 应用程序池都将能够连接到 localdb 实例,而无需为每个应用程序池配置权限。