2016-05-13 16 views
7

Sto cercando di determinare se il browser è Internet Explorer in ASP.NET Core sul lato server.Rilevazione lato server se il browser è Internet Explorer in ASP.NET Core

Nella precedente versione di ASP.NET 4 nel mio cshtml:

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

ma in ASP.NET 5/ASP.NET core intellisense per Context.Request non ha un'opzione per Browser

posso ottenere l'UserAgent ma questo sembra piuttosto complesso come IE ha alcuni molti tipi di stringhe

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

per Internet Explorer 11.0 ottengo

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

che rende molto difficile determinare versioni precedenti, attuali o future di IE.

+0

Tutta la ragione per cui il team di IE ha cambiato la stringa user agent per IE11 è stato quello di cercare di * fermata * persone sniffing per IE . Per quanto riguarda le versioni future, o avranno successo con questo tentativo di terminare lo sniffing del browser (cioè fallirai con il tuo compito a portata di mano), o dovranno fare ulteriori cambiamenti per sconfiggere le tue attuali tecniche di sniffing, se diventano popolare. –

risposta

9

Mi sento obbligato a dire che in genere è meglio cercare di evitare lo sniffing del browser lato server, se possibile. Ma mi rendo perfettamente conto che a volte può essere utile. Quindi ...

Sulla base di questo elenco http://www.useragentstring.com/pages/useragentstring.php?name=Internet+Explorer sembra che UserAgent per quasi tutte le versioni di Internet Explorer contenga MSIE in modo che sia la cosa principale che si desidera cercare.

È interessante notare che quando si esamina questo elenco di agenti utente di IE, l'agente utente che si è osservato è uno dei pochi che non contiene MSIE. Se si controlla la presenza di MSIE o Trident nell'agent user che dovrebbe funzionare abbastanza bene per identificare tutti i casi di Internet Explorer.

(Trident è il motore di layout che alimenta Internet Explorer ed è utilizzato solo per Internet Explorer)

Così, per esempio, il codice per determinare se il browser è IE potrebbe essere scritto come:

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

e questo potrebbe essere chiamato da all'interno del controller in questo modo:

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

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

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

Ho elencato che per IE11 non contiene MSIE. – greay

+0

Ecco perché è anche necessario verificare se l'agente utente contiene anche "Trident". Se contiene "MSIE" o "Trident" è Internet Explorer. Ho aggiunto codice di esempio al mio e testato il codice su IE 11. –

+0

@greay - Non dimenticare di accettare questa risposta se funziona per te. Grazie! –

0

ho messo in un metodo di estensione per valutare questo:

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"]); 
} 

Usage:

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

(in base alla risposta di Ron C)