User.IsInRole抛出与网络相关或特定于实例的错误

我有这个非常基本的MVC4应用程序通过对象实体模型连接到数据库。 应用程序和数据库之间的连接很好,因为用户能够登录并且Global.asax的以下代码正在工作(它从数据库中成功检索用户角色)。

 protected void Application_AuthenticateRequest(object sender, EventArgs args) { if (User != null) { IEnumerable roles = new BusinessLayer.Roles().getAllUserRoles(Context.User.Identity.Name); string[] rolesArray = new string[roles.Count()]; for (int i = 0; i < roles.Count(); i++) { rolesArray[i] = roles.ElementAt(i).RoleName; } GenericPrincipal gp = new GenericPrincipal(Context.User.Identity, rolesArray); Context.User = gp; } } 

错误发生在以下行:

 @if(User.IsInRole("Administrator")) { testtttt } 

而不是上面,我也尝试了以下但仍然有同样的错误:

 Roles.AddUserToRole("test.user","Administrator"); 

确切的错误是:

 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: 26 - Error Locating Server/Instance Specified) 

堆栈跟踪:

 [SqlException (0x80131904): 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: 26 - Error Locating Server/Instance Specified)] System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +5340635 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +244 System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, Boolean withFailover) +5350895 System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover) +145 System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout) +922 System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, SqlCredential credential, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance) +307 System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData) +518 System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions) +5353705 System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup, DbConnectionOptions userOptions) +38 System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection) +5355906 System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) +146 System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) +16 System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry) +94 System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry) +110 System.Data.SqlClient.SqlConnection.Open() +96 System.Web.Management.SqlServices.GetSqlConnection(String server, String user, String password, Boolean trusted, String connectionString) +75 [HttpException (0x80004005): Unable to connect to SQL Server database.] System.Web.Management.SqlServices.GetSqlConnection(String server, String user, String password, Boolean trusted, String connectionString) +130 System.Web.Management.SqlServices.SetupApplicationServices(String server, String user, String password, Boolean trusted, String connectionString, String database, String dbFileName, SqlFeatures features, Boolean install) +89 System.Web.Management.SqlServices.Install(String database, String dbFileName, String connectionString) +27 System.Web.DataAccess.SqlConnectionHelper.CreateMdfFile(String fullFileName, String dataDir, String connectionString) +386 

更详细的错误屏幕截图

我在以前使用SimpleMembership但已更改为使用基于Owin Authentication MiddlewareSingle Sign-on的应用程序时遇到了同样的问题。 将以下内容添加到我的web.config为我解决了这个问题:

      

不久前就陷入了类似的问题。 正在使用多个项目解决方案。 能够无问题地进行身份validation的用户; 当他们去更新他们的用户档案时,他们会得到你提到的错误。

最后,我们发现Visual Studio已将连接字符串插入到基础结构项目的app.config中,该项目指向开发环境数据库,该数据库无法从生产环境中访问。

我们从App.config中删除了连接字符串设置,重新部署,之后生活很好。

多项目解决方案

您的错误明确指出您尝试使用本地SQL Express实例,要求它创建文件并将其附加到服务器。

以下是您可以查看的一些内容:

  • 运行应用程序的帐户是否具有对相关目录的读/写访问权限? (默认为App_Data)

  • 您是否正确配置了连接字符串?

如果查看InitializeDatabaseConnection的方法签名(用于设置角色和成员资格提供程序),它是:

 public static void InitializeDatabaseConnection(string connectionStringName, string userTableName, string userIdColumn, string userNameColumn, bool autoCreateTables); 

连接字符串需要一个“常规”连接字符串,而不是由Entity Framework的Db / Model第一个模式生成的连接字符串。

我还注意到你正在使用用户test.userSimpleMembershipProviderSimpleRoleProvider使用字符串连接来构建查询。 你在那里的时期可能会导致问题。 你可以在没有这段时间的情况下进

看起来您正在使用ASP.NET成员资格提供程序,它可以指定不同的连接字符串。 validation您是否指向正确的连接字符串。 请参阅配置ASP.NET应用程序以使用成员身份

尝试在两种情况下中断GetSqlConnection(…)以查看传递的参数。

如果您未在web.config指定,则您正在使用的角色提供程序将从machine.config文件中获取配置。 这将导致您的应用程序在App_Data创建LocalSql数据库。 连接字符串和提供程序详细信息在machine.config中指定,因此您的web.config将仅添加或删除它们。 例如,你的machine.config可能会说:

    

你的web.config有这个:

    

您的应用程序将能够查看和使用这两个字符串。 要修复它,您可以首先清除连接字符串,如下所示:

     

但是,这仍然存在需要在web.config设置角色提供程序的根本问题。 为此,添加如下内容:

         

这里的关键部分可能只是行,它删除了machine.configinheritance中的所有内容。 或者,您可以像这样指定默认提供程序:

    ...etc...