21

Microsoft が IE/MSIE ブラウザ表示を削除し、完全に「Mozilla」になったため、IE11 検出がサーバー側言語で機能しないことは誰もが知っています。

また、ブラウザの検出/バージョンを実行することは危険であることも知っていますが、これまではうまく機能してきました。

ウェブサイトの要件には次のようなものがあります。

特定のバージョンの Firefox 以上で動作する必要があります 特定のバージョンの chrome 以上で動作する必要があります 特定のバージョンの safari で動作する必要があります (一部はそれ以下で、一部は新しいもの) IE >= 8 で動作する必要があります

ここに問題があります... IE11は、サポートされていないことを私のリストに示しています。サーバー(ASP.NET/MVC)上のWeb側からサポートしたい

サーバー側からこれを検出する方法は明確ではありません。誰も方法を知っていますか?

これは現在 IE 11 で表示されているユーザー エージェントです。

「Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) は Gecko のように」

rv:11.0 はその IE11 を教えてくれますが、解析を行うと、たとえば、そのような要件や firefox でサポートされていない特定のバージョンのクロムである可能性があることを意味します。

それで、本当にIE 11以上かどうかを確認する最良の方法は何ですか?

「Trident」以降の検索については、他のブラウザで使用されているかどうかがわからないため、よくわかりません。

どんな方向でも大歓迎です。

4

5 に答える 5

17

次のような正規表現を使用します。

Regex.IsMatch(this.Request.UserAgent, @"Trident/7.*rv:11")

Tridentは、IE が使用するレンダリング エンジンの名前です。ウィキペディアの記事でわかるように、他のいくつかのアプリケーションも Trident エンジンを使用しています。しかし、ユーザー エージェントで Trident を検索することは問題にはなりません。他の主要なブラウザーは Trident を使用していないからです。

IE11 のみが Trident バージョン 7 を使用するためTrident/7、正規表現で検索すると、IE11 が見つかるはずです。

于 2013-11-15T12:17:48.487 に答える
13

既存のコードとの互換性を維持するためRequest.Browserに、期待どおりに情報を返すカスタム プロバイダーを作成しました。たとえばBrowser.Browser、修正プログラムをインストールした後の新しい値である "InternetExplorer" ではなく "IE" になります。

さらに、このアプローチは、互換表示の場合、バージョン 7 ではなく、IE の実際のバージョンを返します。Browser.Type検出する必要がある場合に備えて、互換ビューでは「IE7」を返すことに注意してください。または、カスタム プロバイダーを簡単に変更して .Type も変更できます。

アプローチは簡単です。クラスのインスタンスからクラスを派生させ、クラスのインスタンスにHttpCapabilitiesDefaultProvider設定BrowserCapabilitiesProviderします。

Global.asax.cs で:

protected void Application_Start(Object sender, EventArgs e)
{
    ...
    HttpCapabilitiesBase.BrowserCapabilitiesProvider = new CustomerHttpCapabilitiesProvider();
    ...
}

クラスを定義します: UPDATED TO INCLUDE MICROSOFT EDGE BROWSER

public class CustomerHttpCapabilitiesProvider : HttpCapabilitiesDefaultProvider
{
    public override HttpBrowserCapabilities GetBrowserCapabilities(HttpRequest request)
    {
        HttpBrowserCapabilities browser = base.GetBrowserCapabilities(request);

        // Correct for IE 11, which presents itself as Mozilla version 0.0
        string ua = request.UserAgent;

        // Ensure IE by checking for Trident
        // Reports the real IE version, not the compatibility view version. 
        if (!string.IsNullOrEmpty(ua))
        {
            if (ua.Contains(@"Trident"))
            {
                if (!browser.IsBrowser(@"IE"))
                {
                    browser.AddBrowser(@"ie");
                    browser.AddBrowser(@"ie6plus");
                    browser.AddBrowser(@"ie10plus");
                }

                IDictionary caps = browser.Capabilities;
                caps[@"Browser"] = @"IE";

                // Determine browser version
                bool ok = false;
                string majorVersion = null; // convertable to int
                string minorVersion = null; // convertable to double
                Match m = Regex.Match(ua, @"rv:(\d+)\.(\d+)");
                if (m.Success)
                {
                    ok = true;
                    majorVersion = m.Groups[1].Value;
                    minorVersion = m.Groups[2].Value; // typically 0
                }
                else
                {
                    m = Regex.Match(ua, @"Trident/(\d+)\.(\d+)");
                    if (m.Success)
                    {
                        int v;
                        ok = int.TryParse(m.Groups[1].Value, out v);
                        if (ok)
                        {
                            v += 4; // Trident/7 = IE 11, Trident/6 = IE 10, Trident/5 = IE 9, and Trident/4 = IE 8
                            majorVersion = v.ToString(@"d");
                            minorVersion = m.Groups[2].Value; // typically 0
                        }
                    }
                }

                if (ok)
                {
                    caps[@"MajorVersion"] = majorVersion;
                    caps[@"MinorVersion"] = minorVersion;
                    caps[@"Version"] = String.Format(@"{0}.{1}", majorVersion, minorVersion);
                }
            }
            else if (ua.Contains(@"Edge"))
            {
                if (!browser.IsBrowser(@"Edge"))
                {
                    browser.AddBrowser(@"edge");
                }

                IDictionary caps = browser.Capabilities;
                caps[@"Browser"] = @"Edge";

                // Determine browser version
                Match m = Regex.Match(ua, @"Edge/(\d+)\.(\d+)");
                if (m.Success)
                {
                    string majorVersion = m.Groups[1].Value;
                    string minorVersion = m.Groups[2].Value;
                    caps[@"MajorVersion"] = majorVersion;
                    caps[@"MinorVersion"] = minorVersion;
                    caps[@"Version"] = String.Format(@"{0}.{1}", majorVersion, minorVersion);
                }
            }
        }

        return browser;
    }
}
于 2013-12-30T21:33:04.457 に答える
1
    public ActionResult Index()
    {
        var browser = this.Request.Browser;
        System.Diagnostics.Trace.WriteLine(browser.Browser); // InternetExplorer
        System.Diagnostics.Trace.WriteLine(browser.MajorVersion); // 11
        return View();
    }

IE11 を正しく検出するには、 http://support.microsoft.com/kb/2836939/en-usがインストールされた.NET 4.5 または .NET 4.0 が必要であることに注意してください。

于 2013-11-15T11:33:00.450 に答える
-1

ブラウザをホワイトリストに登録しているように聞こえますが、これは良い考えではありません。通常、代わりにクライアント側で機能を検出する必要があります。MVC は実際にどのブラウザーであるかを認識していません。Request.Browser オブジェクトから何らかのアイデアが得られますが、信頼性は高くありません。これは IE 11 の場合です。私の開発マシンではバージョン 11 ですが、私の開発マシンでは 7 です。これは壊滅的なミスになる可能性があります。

私はシングル ページ アプリケーションを構築しており、ブラウザの現在および以前のバージョンのみをサポートするという Google と同様の姿勢をとっています。時代遅れのブラウザーを検出すると、基本的な CSS とマークアップだけで JavaScript を使用しない「コア」サイトをサーバーします。そのほうが簡単で、開発がはるかに簡単になります。

とにかく、私が検出する方法は、次のように IE の現在のバージョンをテストすることです。

    public static bool IsModernIE() {

        return HttpContext.Current.Request.Browser.Browser == "InternetExplorer";

    }

HTMLヘルパーメソッドです。したがって、cshtml でテストを使用できます。私のコントローラでは、個々のバージョン テストを呼び出します。これは最終的には非常に壊れやすい方法です。私は基本的に、最新の IE (10/11) と古い IE (9-) の間に境界線を引いています。このテストは、次のバージョンでは無関係になる可能性があります。たとえば、Xbox One に対してはまだテストしていません。

私が使用しているライブラリがあり、GitHub に投稿されています。私は今それを使用可能なアルファと呼んでいるので、それを受け入れて、必要に応じて実行してください. テストをより外部から構成できるようにしたいなど。リポジトリの URL はhttps://github.com/docluv/SPAHelperです。実際にブログhttp://love2dev.comで使用しています。

于 2013-11-15T20:36:35.127 に答える