2016-04-18 31 views
7

Próbuję uruchomić aplikację hostowaną w IIS (w postaci bazy danych filmów), aby nauczyć się projektowania trójwarstwowego programu architektury: aplikacji MVC, usług WCF, SQL Server DB. Ponieważ nie mam klucza licencyjnego do pełnego serwera SQL, zdecydowałem się przejść z LocalDB i mam usługi WCF, które otaczają moje zapisane procedury. Po raz pierwszy używam LocalDB i mam problemy z połączeniem z moją instancją, v13.0.Nie można połączyć się z LocalDB

Mój problem:

Nie mogę za życie mnie dostać mój projekt w VS podłączyć do instancji LocalDB. Wciąż otrzymuję następujący błąd:

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 50 - Local Database Runtime error occurred. The specified LocalDB instance does not exist.

Moje ciąg połączenia (od Web.config):

<connectionStrings> 
    <add name="MovieDB" connectionString="Data Source=(localdb)\v13.0;Initial Catalog=MovieDB;Integrated Security=True;AttachDbFilename=|DataDirectory|\MovieDB.mdf" /> 
</connectionStrings> 

Korzystanie sqlcmd się z nim połączyć i uruchomić kwerendy działa prawidłowo:

Connecting to LocalDB instance just fine from command line

Visual Studio SQL Server Object Explorer może łączyć się dobrze:

Visual SQL Server Object Explorer can connect just fine

Ciąg połączenia, jak uciekł przez Visual Studio, kiedy dojdzie do problematycznej linii, więc wiem, ciąg połączenia nie uciekł niepoprawnie:

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

Próbowałem po tej prowadnicy (Part 1 i Part 2), a zdjęcia są przerywane co najmniej od 4/18/2016, więc nie byłem w stanie w pełni zrozumieć, co powinienem zrobić. Byłem tylko w stanie uzyskać powyższy błąd, bo zmienił tożsamość LocalSystem aplikacja Basen:

I was only able to get this error because I changed the app pool identity to LocalSystem

Kiedy pula aplikacja jest uruchomiona pod tożsamości ApplicationPoolIdentity, otrzymuję ten błąd:

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 50 - Local Database Runtime error occurred. Cannot get a local application data path. Most probably a user profile is not loaded. If LocalDB is executed under IIS, make sure that profile loading is enabled for the current user.

Posunąłem się nawet do modyfikacji pliku C: \ windows \ system32 \ inetsrv \ config \ applicationHost.config, aby wymusić załadowanie profilu. Wciąż nic.

<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> 

Moja aplikacja działa pod ".NET 4.5" app basen

My app is running under the ".NET 4.5" app pool

mój kod:

strona ładuje i wywołuje tę usługę, aby uzyskać listę filmów w DB:

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

    // ... 
} 

a problematyczną metodę z mój projekt 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; 
    } 

Mogę tylko założyć, że problem ma związek z uwierzytelnianiem lub faktem, że hostowana aplikacja IIS próbuje połączyć się z procesem użytkownika LocalDB, ale próbowałem wykonać instrukcje z innych pytań i nie udało się (prawdopodobnie dlatego, że nieumiejętności zrozumienia prawdziwego problemu). Brakuje mi ...

+0

LocalDB jest dla _development_ i jest specyficzne dla użytkownika, który próbuje go uruchomić. Możesz lepiej wyłączyć SQL Express w środowisku ASP.NET. –

+0

@Chris Bowe Hey Chris. Mam ten sam błąd. Zastanawiałem się, jak to rozwiązałeś? –

Odpowiedz

1

Spróbuj tego: W pliku applicationhost zmień processModel identityType na SpecificUser, a także wpisz nazwę użytkownika i hasło. LUB zmień tożsamość puli aplikacji na użytkownika, który ma uprawnienia do bazy danych. Po uruchomieniu jako tożsamość puli aplikacji, w oparciu o zrzuty ekranu, działasz jako system lokalny - czyli predefiniowane konto lokalne, podczas gdy sqlcmd działa jako użytkownik, na którym jesteś zalogowany.