2013-03-16 72 views
4

当我在ClaimsIdentity中的某些声明中进行'foreach'循环时,遇到问题。 当我逐步完成它时 - 它应该完成枚举,我看到它回到'in'中,然后在得到关于连接到SQL Server的HttpException之前得到10秒的延迟。 我知道这听起来很奇怪,但那是根据调试发生的时候 - 在FindAllClaimsByType方法的foreach循环中(我在使用Entity Framework之后很快连接到数据库,但是我的断点从来没有碰到过)。 编辑:我应该提到我可以连接到我的数据库罚款,如果我跳过这一点,并在控制器做一些事情。这是在ASP.NET MVC 4通过声明枚举导致HttpException SqlException

编辑2:我已经缩小了一点。只有当它找不到Claim。不管我如何通过索赔列举(如果我使用ClaimsPrincipal.HasClaim()foreach循环或.Any() LINQ表达式) - 如果它找不到索赔,它总是会抛出此异常。

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)

我的代码如下:

public class ClaimsService 
{ 

    private ClaimsIdentity _identity; 

    public ClaimsService(ClaimsIdentity identity) 
    { 
     _identity = identity; 
    } 

    private Claim FindFirstClaimByType(string claimtype) 
    { 
     return FindAllClaimsByType(claimtype).FirstOrDefault(); 
    } 

    private IEnumerable<Claim> FindAllClaimsByType(string claimtype) 
    { 
     ICollection<Claim> claims = new Collection<Claim>(); 
     foreach (Claim claim in _identity.Claims) 
     { 
      if (claim.Type == claimtype) 
      { 
       claims.Add(claim); 
      } 
     } 

     return claims; 
    } 

    public School FindSchoolFromClaims() 
    { 
     string realm = FindFirstClaimByType(Data.Configuration.RealmClaimType).Value.ToString(); 

     using (SqlDatabaseContext db = new SqlDatabaseContext()) 
     { 
      School school = null; 


      school = db.Schools.Where(s => s.Realm == realm).FirstOrDefault(); 

      return school; 
     } 
    } 

    public Developer FindDeveloperFromClaims() 
    { 
     string realm = FindFirstClaimByType(Data.Configuration.RealmClaimType).Value.ToString(); 
     string nameidentifier = FindFirstClaimByType(ClaimTypes.NameIdentifier).Value.ToString(); 

     using (SqlDatabaseContext db = new SqlDatabaseContext()) 
     { 
      Developer developer = null; 


      if (realm == Data.Configuration.SoloDeveloperRealmMsft) 
      { 
       developer = db.Developers.OfType<SoloDeveloper>().Where(dev => dev.NameIdentifier == nameidentifier).FirstOrDefault(); 
      } 
      else 
      { 
       developer = db.Developers.OfType<CompanyDeveloper>().Where(dev => dev.Realm == realm).FirstOrDefault(); 
      } 

      return developer; 
     } 
    } 
} 

堆栈跟踪:

[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) +5296071 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +558 System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, Boolean withFailover) +5308555 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) +920 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) +434 System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions) +5311099 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& connection) +5313314 System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource 1 retry, DbConnectionOptions userOptions) +143 System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource 1 retry) +83 System.Data.SqlClient.SqlConnection.Open() +96 System.Web.Management.SqlServices.GetSqlConnection(String server, String user, String password, Boolean trusted, String connectionString) +76

[HttpException (0x80004005): Unable to connect to SQL Server database.] System.Web.Management.SqlServices.GetSqlConnection(String server, String user, String password, Boolean trusted, String connectionString) +131 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

+0

打开SQL分析器。如果循环枚举,那么在循环结束时它是干什么的?什么? – 2013-03-16 13:10:04

+0

连接字符串中的用户名和密码不正确,或者您尝试连接的网络出现问题 – dakait 2013-03-16 14:35:49

+0

@soadyp使用SQL Profiler吗?目前我正在使用LocalDB,但我可以切换到SQL Azure。 @dakait连接字符串是好的 - 如果我不使用'ClaimsService',那么我可以访问我的数据库很好 – 2013-03-16 23:38:15

回答

11

我有在Azure云解决方案全新的ASP MVC Web角色相同的问题。尚未设置SQL,除Azure ACS联合登录之外,还没有其他功能实现。我只是测试ACS,WIF和多个身份提供者的功能。

默认情况下,RoleManager功能似乎是烘焙的。一旦我在web.config中将其删除 - 枚举声明时不再尝试访问SQL Server。

加入这一行:

<modules> 
    <remove name="RoleManager" /> 
    ... 

希望帮助。

Rick Shuri

+0

完美,在将EntityFramework nuget添加到组织登录模板后遇到同样的问题。 – angularsen 2015-10-07 13:07:10