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

C# 检测是否安装了WIF运行时的最佳方法,c#,asp.net,wif,C#,Asp.net,Wif,我的ASP.Net应用程序的一些页面使用WIF直接连接到另一个服务。WIF只是在这里取得进展,虽然它安装在测试和生产服务器上,但每当一个新的程序员或测试人员获得最新信息,并且碰巧在他们的机器上没有安装WIF运行时,他就会收到一个YSOD和一个关于找不到Microsoft.IdentityModel的错误。。。他们从来没有读过,而是发了一条即时消息告诉我我的应用程序坏了 我想检测是否安装了WIF运行时,并显示每个有用的错误消息,如果没有,则显示下载页面的链接。我不想检查特定的.dll路径,因为这可

我的ASP.Net应用程序的一些页面使用WIF直接连接到另一个服务。WIF只是在这里取得进展,虽然它安装在测试和生产服务器上,但每当一个新的程序员或测试人员获得最新信息,并且碰巧在他们的机器上没有安装WIF运行时,他就会收到一个YSOD和一个关于找不到Microsoft.IdentityModel的错误。。。他们从来没有读过,而是发了一条即时消息告诉我我的应用程序坏了

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

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

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

编辑

看起来3.5/4.0特定的方法就可以了。它不必是未来的证明

  • 您可以将WIF库与应用程序捆绑在一起
  • 您可以在那里使用WebPI和参考WIFSDK
  • 如果您尝试从GAC加载程序集,可能会达到这个目的
    我会尝试在try/catch-block中从GAC加载Microsoft.IdentityModel.dll,或者更好,只捕获没有WIF运行时的用户当前获取的特定异常,并使用该异常将用户重定向到特定错误页/消息


    回答您的确切问题——是否有一种方法来检测是否存在正确的WIF安装包:如果您的应用程序可以访问注册表(至少在只读模式下),也可以检查Windows身份基础相关的条目是否出现在软件\微软\ Windows身份基础中(以及64位系统的相关Wow6432Node)。

    在检查了一些来自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;
            }
        }
    }
    
    我们没有针对开发人员机器的花哨的web部署包,它只是从源代码获取并运行。这将允许没有此库的开发人员在遇到YSOD和模糊的程序集加载错误时不会浪费时间


    感谢您的建议。

    微软官方评论:

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

    参考

    因为只有少数页面需要WIF,所以我希望在应用启动后立即检查,并在到达这些页面之前让他们知道应用缺少所需的组件。我们不进行任何奇特的部署打包,因此没有安装程序来执行此项工作。此注册表检查是其他Microsoft安装程序所做的全部(我剖析了其中的几个)。请参阅下面我的答案,了解我最终得到的代码。
    Q: Under what registry key is WIF installed?
    A: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsIdentityFoundation\setup\v3.5\.