3

私の Web アプリケーション (WCF サービス) はSqlRoleProviderVisual Studio Development Serverで正常に動作する を使用しています。IIS8 Expressに切り替えると、次のようにスローされNullReferenceExceptionます。

Roles.IsUserInRole(username, role) // neither of them actually null

メソッドのドキュメントにIsUserInRoleこの例外のヒントが見つかりませんでした。Visual Studio 開発サーバーに戻すと、機能します。この例外の原因は何ですか?どうすれば適切に修正できますか? プロジェクトのターゲット フレームワーク.NET Framework 4です。

構成された接続文字列は次のとおりです。

<add name="ConnectionString"
      connectionString="Data Source=.\sqlexpress;Initial Catalog=DevWeb;Integrated Security=True"
      providerName="System.Data.SqlClient" />

そして、これはroleManager/providersノードです:

<clear />
<add connectionStringName="ConnectionString" applicationName="MyApp" name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider"/>
4

3 に答える 3

4

ウラジミールが言ったことは真実ですが、実際に何が起こっているのかを説明していません。NullReferenceException をスローするのは、IsUserInRole と GetRolesForUser にある EtwTrace コードです。Roles クラスの他のすべては、HttpContext.Current が null になる可能性があるという事実を説明しています。これは、 http://referencesource.microsoft.com/netframework.aspxにある「NET、バージョン 4.5」の Microsoft リファレンス ソースを調べて見つけました。

私が試した他のすべてのテスト環境では、トレース レベルが NullReferenceException をトリガーするのに十分ではありませんでした。問題が発生したのは、Visual Studio 2013 をインストールした後に IIS Express 8 を使用したときだけであり、IIS Express でのみ発生しました。

それについて何ができますか?

1 つのオプションは、WCF の「ASP.Net 互換モード」を有効にすることです。最初に、web.config で属性 aspNetCompatibilityEnabled="true" をノード <configuration><system.serviceModel><serviceHostingEnvironment> に追加します。次に、属性 [System.ServiceModel.Activation.AspNetCompatibilityRequirements(RequirementsMode = System.ServiceModel.Activation.AspNetCompatibilityRequirementsMode.Allowed)] をクラス定義に追加して、サービス クラスを動作に選択します。この機能を有効にすると、HttpContext.Current が設定されます。ウラジミールが言及したようなバックグラウンド スレッドで作業していないと仮定して、Roles クラスからロールを要求するまでに (その場合は、最初に HttpContext.Current にパッチを適用する必要があります)。WCF の ASP.NET 互換モードの詳細については、次の URL を参照してください。http://blogs.msdn.com/b/wenlong/archive/2006/01/23/516041.aspx .

もう 1 つのオプションは、これら 2 つのメソッドの Roles クラスをバイパスすることです。Roles.IsUserInRole を呼び出す代わりに、Roles.Provider.IsUserInRole を呼び出します。Roles.GetRolesForUser を呼び出す代わりに、Roles.Provider.GetRolesForUser を呼び出します。各メソッドには、利用可能な同じオーバーロードがあります。トレース ストップとローカル ロール キャッシュは失われますが、null 参照例外はバイパスされます。

于 2013-11-27T23:23:56.090 に答える
1

Roles.IsUserInRole を別の Thread で呼び出す場合は、HttpContext を確認する必要があります。この場合は空になります。したがって、修正するには、メインスレッドから子スレッドに HttpContext をコピーする必要があります。

        var context = HttpContext.Current;
        Thread thread = new Thread(delegate() {
            if (HttpContext.Current == null)
                HttpContext.Current = context;
        });

        thread.Start();
于 2013-05-22T13:47:31.720 に答える
0

問題がデータベースとそれにアクセスするアカウントの許可にあることはほぼ確実です。IIS アカウントを sa priv に追加して、問題が解決するかどうかを確認してください。存在する場合は、アクセス許可がありません。

于 2012-10-22T12:24:25.723 に答える