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

本文关键字:最佳 方法 运行时 WIF 是否 安装 检测 | 更新日期: 2024-11-08 07:00:49

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

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

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

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

编辑

看起来 WIF 包含在 4.5 的框架中,因此 3.5/4.0 特定的方法就可以了。 没有必要面向未来。

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

微软官方评论:

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

参考这里

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

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

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

在检查了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 和晦涩的程序集加载错误时不会浪费时间。

感谢您的建议。