无法连接到LocalDB

7 c# sql-server iis wcf localdb

我正在尝试运行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>
Run Code Online (Sandbox Code Playgroud)

使用sqlcmd连接到它并运行查询运行正常:

从命令行连接到LocalDB实例就好了

Visual Studio SQL Server对象资源管理器可以很好地连接:

Visual SQL Server对象资源管理器可以很好地连接

连接字符串,当它到达有问题的行时由Visual Studio转义,因此我知道连接字符串未被错误地转义:

"Data Source=(localdb)\\v13.0;Initial Catalog=MovieDB;Integrated Security=True;AttachDbFilename=|DataDirectory|\\MovieDB.mdf"
Run Code Online (Sandbox Code Playgroud)

我尝试按照本指南(第1部分第2部分)进行操作,截至2016年4月18日,图像已被破坏,因此我无法完全理解我应该做什么.我只能得到上述错误,因为我将应用程序池标识更改为LocalSystem:

我只能得到这个错误,因为我将应用程序池标识更改为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>
Run Code Online (Sandbox Code Playgroud)

我的应用程序在".NET 4.5"应用程序池下运行

我的应用程序在

我的代码:

页面加载并调用此服务以获取数据库中的电影列表:

[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;
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

我的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;
    }
Run Code Online (Sandbox Code Playgroud)

我只能假设问题与身份验证有关,或者IIS托管的应用程序试图连接到LocalDB用户进程这一事实,但我已经尝试按照其他问题的说明进行操作并且不成功(可能是因为失败)了解真正的问题).我很茫然...

小智 3

试试这个:在您的 applicationhost 文件中,尝试将 processModel 身份类型更改为 SpecificUser,并包含用户名和密码。或者将您的应用程序池身份更改为有权访问数据库的用户。当您以应用程序池身份运行时,根据您的屏幕截图,您正在作为本地系统运行 - 这是预定义的本地帐户,而 sqlcmd 则以您登录的用户身份运行。