5

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, TaskCompletionSource1 の再試行、DbConnectionOptions userOptions、DbConnectionInternal& 接続) +5313314 System.Data .ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource1 retry, DbConnectionOptions userOptions) +143 System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource1 回の再試行) +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

4

1 に答える 1

12

Azure クラウド ソリューションの新しい ASP MVC Web ロールで同じ問題が発生しました。SQL はまだセットアップされておらず、Azure ACS フェデレーション サインオンを除いて他の機能はまだ実装されていません。ACS、WIF、および複数の ID プロバイダーの機能をテストしていました。

RoleManager 機能はデフォルトで組み込まれているようです。web.config でそれを削除すると、クレームを列挙するときに SQL Server へのアクセスを試みる必要がなくなりました。

次の行を追加します。

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

それが役立つことを願っています。

リック・シュリ

于 2013-05-01T16:03:50.100 に答える