5

ASP.Netアプリのいくつかのページは、WIFを使用して別のサービスに直接接続しています。WIFはここに侵入しつつあり、テストサーバーと本番サーバーにインストールされている間、新しいプログラマーまたはテスターが最新の状態になり、マシンにWIFランタイムがインストールされていない状態でこれらのページにアクセスするたびに、YSODとMicrosoft.IdentityModelが見つからないというエラー...彼らはこれまで読んだことがなく、代わりにIMを起動して、アプリが壊れていることを知らせます。

WIFランタイムがインストールされているかどうかを検出し、役立つすべてのエラーメッセージを表示し、インストールされていない場合はダウンロードページにリンクしたいと思います。特定の.dllパスが変更される可能性があるため、確認したくありません...3.5と4.0にはすでに異なるパスがあります。

WIFランタイムがインストールされているかどうかを検出する最良の方法はありますか?

(明らかに、それをまだ参照していないページでは...インストールしないと正しく表示されません)

編集

WIFは4.5のフレームワークに含まれているように見えるので、3.5/4.0固有のアプローチで十分です。将来を見据えたものである必要はありません。

4

4 に答える 4

3

マイクロソフトの公式コメント:

Q: Under what registry key is WIF installed?
A: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsIdentityFoundation\setup\v3.5\.

ここを参照

于 2014-08-22T04:40:11.377 に答える
2

try/catch ブロック内の GAC から Microsoft.IdentityModel.dll を読み込んでみます。WIF ランタイムを使用していないユーザーが現在取得している特定の例外をキャッチし、それを使用してユーザーを特定のエラー ページにリダイレクトするだけです。 /メッセージ。

あなたの正確な質問に答えるために-適切なWIFインストールパッケージが存在するかどうかを検出する方法はありますか:アプリケーションがレジストリにアクセスできる場合(少なくとも読み取り専用モードで)、Windows Identity Foundation関連のアイテムかどうかを確認することもできますSOFTWARE\Microsoft\Windows Identity Foundation (および 64 ビット システムの関連する Wow6432Node) に表示されます。

于 2012-08-10T19:07:29.967 に答える
1
  1. アプリに WIF ライブラリをバンドルできます。
  2. WebPI を使用して、そこで WIF SDK を参照できます。
  3. おそらく、GAC からアセンブリを読み込もうとするとうまくいくでしょう。リフレクションのみのアセンブリの読み込み
于 2012-08-07T21:40:56.277 に答える
1

Microsoft のいくつかのインストーラーを調べて、WIF ランタイムの存在をどのように検出したかを確認した後、上記の回答からのレジストリ チェックの提案を使用しました。

これが私が行ったものです:

/// <summary>
/// Determines if WIF is installed on the machine.
/// </summary>
public static class WifDetector
{
    /// <summary>
    /// Gets a value indicating that WIF appears to be installed.
    /// </summary>
    public static bool WifInstalled { get; private set; }

    static WifDetector()
    {
        WifInstalled = IsWifInstalled();
    }

    private static bool IsWifInstalled()
    {
        try
        {
            //return File.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles),
            //                                "Reference Assemblies\\Microsoft\\Windows Identity Foundation\\v3.5\\Microsoft.IdentityModel.dll"));
            //The registry approach seems simpler.
            using( var registryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Wow6432Node\\Microsoft\\Windows Identity Foundation") ?? 
                                     Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows Identity Foundation") )
            {
                return registryKey != null;
            }
        }
        catch
        {
            //if we don't have permissions or something, this probably isn't a developer machine, hopefully the server admins will figure out the pre-reqs.
            return true;
        }
    }
}

次に、ベースページまたはマスターページで値を確認し、ユーザーに知らせます。実際のチェックは型初期化子で 1 回だけ実行され、その後は単純な静的プロパティへのアクセスになります。

    private void CheckWifInstallation()
    {
        if (!WifDetector.WifInstalled)
        {
            var alert = new ClientSideAlert(
                    "This application requires the Windows Identity Foundation runtime to be installed on the webserver:\n");
            alert.AddMessageLine("Please install the appropriate WIF runtime for this operating system by visiting:\n");
            alert.AddMessageLine("http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=17331 \n");
            alert.AddMessageLine("or simply search for 'WIF runtime install'\n");
            alert.AddMessageLine("Thanks, and have a nice day!'");
            alert.Display(Page);
        }
    }

開発者のマシン用の派手な Web 展開パッケージはありません。ソースから取得して実行するだけです。これにより、このライブラリを使用していない開発者は、YSOD やあいまいなアセンブリの読み込みエラーが発生したときに時間を無駄にすることがなくなります。

提案をありがとう。

于 2012-08-16T15:48:58.927 に答える