2016-04-18 93 views
7

Sto tentando di eseguire un'app ospitata da IIS (sotto forma di database di film) per insegnarmi come progettare un programma di architettura a 3 livelli: app MVC, servizi WCF, database SQL Server. Dal momento che non ho una chiave di licenza per SQL Server completo, ho deciso di utilizzare LocalDB e di avere servizi WCF che avvolgono le mie stored procedure. Questa è la prima volta che utilizzo LocalDB e sto riscontrando problemi relativi alla mia istanza, v13.0.Impossibile connettersi a LocalDB

mio problema:

Non posso, per la vita di me, ottenere il mio progetto in VS per connettersi all'istanza LocalDB. Continuo a ricevere il seguente errore:

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.

mia stringa di connessione (da web.config):

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

Utilizzando sqlcmd per connettersi ad esso ed eseguire query funziona bene:

Connecting to LocalDB instance just fine from command line

Visual Studio SQL Server Object Explorer può connettersi perfettamente:

Visual SQL Server Object Explorer can connect just fine

La stringa di connessione, come scappai da Visual Studio quando si arriva alla linea problematico, quindi so che la stringa di connessione non è sfuggito in modo non corretto:

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

Ho provato seguendo questa guida (Part 1 e Part 2) e le immagini sono rotte a partire da almeno 18/04/2016, quindi non sono stato in grado di comprendere appieno cosa dovrei fare. Ero solo in grado di ottenere l'errore di cui sopra, perché ho cambiato il pool di app identità per LocalSystem:

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

Quando la piscina applicazione è in esecuzione con l'identità ApplicationPoolIdentity, ricevo questo errore:

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.

Sono persino arrivato al punto di modificare il file C: \ windows \ system32 \ inetsrv \ config \ applicationHost.config per forzare il caricamento del profilo. Ancora niente.

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

La mia app è in esecuzione su ".NET 4.5" app piscina

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

My Code:

pagina carica e chiede questo servizio per ottenere l'elenco dei film nel 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; 
    } 

    // ... 
} 

E il metodo problematico da il mio progetto 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; 
    } 

Posso solo presumere che il problema abbia a che fare con l'autenticazione o il fatto che un'applicazione ospitata da IIS stia tentando di connettersi a un processo utente LocalDB, ma ho provato a seguire le istruzioni di altre domande e ho avuto esito negativo (probabilmente perché di non riuscire a capire il vero problema). Sono in perdita ...

+0

LocalDB è per _development_ ed è specifico per l'utente che sta tentando di eseguirlo. Potrebbe essere meglio cambiare SQL Express in un ambiente ASP.NET. –

+0

@Chris Bowe Hey chris. Ho lo stesso errore. Mi stavo chiedendo come lo hai risolto? –

risposta

1

Prova questo: nel tuo file applicationhost prova a cambiare processModel identityType su SpecificUser e includi anche nome utente e password. OPPURE modifica l'identità del pool di applicazioni all'utente che dispone dell'autorizzazione al database. Quando si esegue l'identità del pool di applicazioni, in base agli screenshot che si esegue come sistema locale, che è un account locale predefinito mentre sqlcmd è in esecuzione come utente con cui si è effettuato l'accesso.