检测是否安装了WIF运行时的最佳方法

时间:2012-08-07 20:49:46

标签: c# asp.net wif

我的ASP.Net应用程序的几页使用WIF直接连接到另一个服务。 WIF只是在这里取得进展,虽然它安装在测试和生产服务器上,但每当新的程序员或测试人员获得最新版本并碰巧在他们的机器上没有安装WIF运行时的情况下点击这些页面时,他就会获得YSOD和关于找不到Microsoft.IdentityModel的错误...他们从未阅读过,而是触发IM告诉我我的应用程序已损坏。

我想检测是否已安装WIF运行时并显示每条有用的错误消息,如果没有则链接到下载页面。我不想检查特定的.dll路径,因为这可能会改变......并且3.5和4.0已经有不同的路径。

是否有最好的方法来检测是否安装了WIF运行时?

(显然在一个没有引用它的页面中......如果没有安装它将无法正确显示)

修改

看起来像WIF is included in the framework with 4.5所以3.5 / 4.0的具体方法会没问题。没有必要面向未来。

4 个答案:

答案 0 :(得分:3)

微软的官方评论:

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

参考here

答案 1 :(得分:2)

我会尝试在try / catch -block中加载来自GAC的Microsoft.IdentityModel.dll或更好,只是捕获没有WIF运行时的特定异常用户当前正在获取并只是使用它将用户重定向到特定错误页面/消息。

要回答您的确切问题 - 有没有办法检测是否存在正确的WIF安装包:如果您的应用程序可以访问注册表(至少以只读模式),则还可以检查Windows身份是否存在基础相关项目出现在SOFTWARE \ Microsoft \ Windows Identity Foundation(以及64位系统的关联Wow6432Node)中。

答案 2 :(得分:1)

  1. 您可以将WIF库与您的应用捆绑在一起。
  2. 您可以使用WebPI并在那里引用WIF SDK。
  3. 也许如果你尝试从GAC加载程序集就可以了。 Reflection Only Assembly Loading

答案 3 :(得分: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;
        }
    }
}

然后在基页或母版页中检查值,让用户知道。实际检查仅在类型初始化程序中执行一次,之后只是简单的静态属性访问。

    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和模糊的程序集加载错误时不浪费时间。

感谢您的建议。