【问题标题】:Server-side detection if the browser is Internet Explorer in ASP.NET Core服务器端检测浏览器是否为 ASP.NET Core 中的 Internet Explorer
【发布时间】:2020-11-06 22:55:00
【问题描述】:

我正在尝试确定浏览器是否是服务器端 ASP.NET Core 中的 Internet Explorer。

在我的 cshtml 中以前的 ASP.NET 4 版本中:

@if (Request.Browser.Browser == "IE")
{
    //show some content
}

但在 ASP.NET 5/ASP.NET Core 中,Context.Request 的智能感知没有Browser 的选项

我可以得到 UserAgent 但这似乎相当复杂,因为 IE 有许多类型的字符串

Context.Request.Headers["User-Agent"]

对于 Internet Explorer 11.0 我得到了

 Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko

这使得很难从中确定任何过去、当前或未来的 IE 版本。

【问题讨论】:

  • IE 团队更改 IE11 的用户代理字符串的全部原因是试图阻止人们嗅探 IE。至于未来的版本,要么他们尝试结束浏览器嗅探而成功(即你手头的任务会失败),要么他们必须做出进一步的改变来击败你当前的嗅探技术,如果他们成为受欢迎。

标签: asp.net-core asp.net-core-mvc


【解决方案1】:

我觉得有必要说,如果可以的话,通常最好尽量避免服务器端浏览器嗅探。但我完全意识到有时它会有所帮助。所以...

根据此列表http://www.useragentstring.com/pages/useragentstring.php?name=Internet+Explorer,看起来几乎所有 Internet Explorer 版本的 UserAgent 都包含 MSIE,因此这将是您要查找的主要内容。

有趣的是,查看此 IE 用户代理列表时,您观察到的用户代理是极少数不包含 MSIE 的用户代理之一。如果您检查用户代理中是否存在 MSIE 或 Trident,这应该可以很好地识别 Internet Explorer 的所有情况。

(Trident 是支持 Internet Explorer 的布局引擎,仅用于 Internet Explorer)

例如,判断浏览器是否为 IE 的代码可以写成:

public static bool IsInternetExplorer(string userAgent) {
    if(userAgent.Contains("MSIE") || userAgent.Contains("Trident")) {
        return true;
    } else {
        return false;
    }
}

这可以像这样从控制器内部调用:

string userAgent = Request.Headers["User-Agent"];

if(IsInternetExplorer(userAgent)) {
    //Do your special IE stuff here

} else {
    //Do your non IE stuff here
}

【讨论】:

  • 我列出了 IE11 它不包含 MSIE。
  • 这就是为什么还需要检查用户代理是否也包含“Trident”。如果它包含“MSIE”或“Trident”,则它是 Internet Explorer。我已经添加了示例代码并在 IE 11 上测试了代码。
  • @greay - 如果它适合您,请不要忘记接受这个答案。谢谢!
【解决方案2】:

在 ASP.NET Core Pages 和 ASP.NET Core Blazor 中,您可以使用以下内容:

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
     services.AddHttpContextAccessor();
     // ...
}

SomeComponent.razor

@inject IHttpContextAccessor HttpContextAccessor

@if (HttpContextAccessor.HttpContext != null 
  && HttpContextAccessor.HttpContext.Request.IsInternetExplorer())
{
    <input type="text" @bind="ViewModel.TextInput" />
}
else
{
    <input type="date" @bind="ViewModel.DateTimeInput" />
}

HttpRequestExtensions.cs

public static class HttpRequestExtensions
{
    public static bool IsInternetExplorer(this HttpRequest request)
    {
        return IsInternetExplorer(request.Headers["User-Agent"]);
    }

    private static bool IsInternetExplorer(string userAgent)
    {
        return userAgent.Contains("MSIE")
               || userAgent.Contains("Trident");
    }
}

【讨论】:

  • 完全限定名是Microsoft.AspNetCore.Http.IHttpContextAccessor
【解决方案3】:

我输入了一个扩展方法来评估这个:

public static bool IsInternetExplorer(string userAgent)
{
    return (userAgent.Contains("MSIE") || userAgent.Contains("Trident"));
}

// Extension for Request
public static bool IsInternetExplorer(this HttpRequestBase req)
{
    return IsInternetExplorer(req.Headers["User-Agent"]);
}

用法:

if (Request.IsInternetExplorer())
{
    // Do something microsofty          
}

(基于 Ron C 的回答)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 2013-08-12
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    相关资源
    最近更新 更多