ClaimsIdentity の一部のクレームで「foreach」ループを実行しているときに問題が発生します。ステップスルーすると、列挙が終了するはずの時点で、「in」に戻り、SQL Serverへの接続に関するHttpExceptionを取得する前に10秒の遅延が発生します。奇妙に聞こえるかもしれませんが、デバッグによると、FindAllClaimsByType メソッドの foreach ループで発生します (Entity Framework を使用した直後にデータベースに接続しますが、そこでのブレークポイントはヒットしません)。編集:これをスキップしてコントローラーで何かを行うと、データベースに正常に接続できることに言及する必要があります。これは ASP.NET MVC 4 にあります
編集 2: 少し絞り込みました。が見つからないときだけClaim
です。クレームをどのように列挙するかは問題ではありません (ClaimsPrincipal.HasClaim()
またはforeach
ループまたは.Any()
LINQ 式を使用する場合)。クレームが見つからない場合は、常にこの例外がスローされます。
SQL Server への接続を確立中に、ネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからないか、アクセスできませんでした。インスタンス名が正しいこと、および SQL Server がリモート接続を許可するように構成されていることを確認してください。(プロバイダー: SQL ネットワーク インターフェイス、エラー: 26 - 指定されたサーバー/インスタンスの検索中にエラーが発生しました)
私のコードは次のとおりです。
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): SQL Server への接続を確立中に、ネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからないか、アクセスできませんでした。インスタンス名が正しいこと、および SQL Server がリモート接続を許可するように構成されていることを確認してください。(プロバイダー: SQL ネットワーク インターフェイス、エラー: 26 - 指定されたサーバー/インスタンスの検索エラー)] System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 例外、ブール値の breakConnection、アクション
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 の再試行、DbConnectionOptions userOptions、DbConnectionInternal& 接続) +5313314 System.Data .ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource1 retry, DbConnectionOptions userOptions) +143 System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource
1 回の再試行) +83 System.Data.SqlClient.SqlConnection.Open() +96 System.Web.Management.SqlServices.GetSqlConnection(文字列サーバー、文字列ユーザー、文字列パスワード、ブール値の信頼済み、文字列接続文字列) +76[HttpException (0x80004005): SQL Server データベースに接続できません。] System.Web.Management.SqlServices.GetSqlConnection(String server、String user、String password、Boolean trusted、String connectionString) +131 System.Web.Management.SqlServices. SetupApplicationServices(文字列サーバー、文字列ユーザー、文字列パスワード、Boolean trusted、文字列接続文字列、文字列データベース、文字列 dbFileName、SqlFeatures 機能、ブール値インストール) +89 System.Web.Management.SqlServices.Install(文字列データベース、文字列 dbFileName、文字列接続文字列) +27 System.Web.DataAccess.SqlConnectionHelper.CreateMdfFile(String fullFileName, String dataDir, String connectionString) +386