2010-10-06 7 views
8

È possibile disattivare la funzionalità browserCaps in ASP.NET?È possibile disattivare la funzionalità browserCaps in ASP.NET?

Vorrei che il mio sito venisse servito in modo affidabile e preciso come lo ho definito per tutti i browser, indipendentemente dalle loro capacità.

Se il browser non supporta il sito, questo è il loro problema. Il mio sito non dovrebbe essere un po 'come tentare di degradarsi per ospitare il client defunto.

Questo è molto frustrante quando sembra avere la sfortuna degli spider che presumo la scansione del sito, ottenendo la versione minore del sito che causa il caching dell'output per servire il file stripped.

+0

@Svend eri anche a conoscenza del fatto che la modifica del programma utente può alterare l'output in bundle/minification? Coperto in [questo post SO] (http://stackoverflow.com/q/21991736/1810243) e un po 'più in profondità [in questo post del blog] (http://www.mikesmithdev.com/blog/aspnet-bundling -Cambiamenti-output-con-user-agent-eureka-1 /). – MikeSmithDev

+0

@MikeSmithDev No, ma non sono sorpreso. Ho già litigato con i phantomjs e questa "caratteristica". L'attuale incarnazione che sto guardando è la codifica del testo HTML, stiamo vedendo il rendering di "ø" come à ¸ in Chrome o ø in IE, la cosa divertente è che quando eseguiamo il sito Web localmente il rendering è invertito (IE ottiene le due entità, mentre Chrome ottiene quella). – Svend

+2

@MikeSmithDev L'uso del file di navigazione per attivare la funzionalità è probabilmente la cosa più orribile che ho visto nelle tecnologie web negli ultimi 10 minuti. – Svend

risposta

2

Si può mettere ClientTarget = "uplevel" nella direttiva di pagina o nel Page.Init

<%@ Page ClientTarget="uplevel" ...... %> 

o

Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) _ 
     Handles Me.Init 
    Page.ClientTarget = "uplevel" 
End Sub 

Un'altra opzione è quella di aggiungere un file .browser al tuo sito, in la cartella App_Browsers (una cartella Asp.NET predefinita). Dovrebbe essere indirizzato a tutti i browser con un'espressione regolare e in qualche modo disabilitare il normale rilevamento del browser aggiungendo funzionalità. Sto solo usando questo per rendere il controllo del menu nel modo giusto in Safari, ma non so esattamente come farlo per tutti gli output in una volta.

2

Una soluzione folle che sto attualmente provando è quella di iniettare il nostro HttpCapabilitiesDefaultProvider che restituisce un valore statico HttpBrowserCapabilities. Il trucco è quindi quello di restituire sempre lo stesso oggetto di capacità, quindi chiamando base.GetBrowserCapabilities durante l'utilizzo di IE9, abbiamo usato Newtonsoft per creare una serializzazione, e salvando questa stringa nel sorgente, possiamo costruire un oggetto di capacità IE9 indipendentemente da cosa il browser ha avviato la richiesta.

public class CustomerHttpCapabilitiesProvider : HttpCapabilitiesDefaultProvider 
{ 
    private const string m_IE9Definition = "{\r\n \"$type\": \"System.Web.Mobile.MobileCapabilities, System.Web.Mobile\",\r\n \"UseOptimizedCacheKey\":..... "; 
    private readonly static Lazy<MobileCapabilities> m_Capabilities = new Lazy<MobileCapabilities>(() => JsonConvert.DeserializeObject<MobileCapabilities>(m_IE9Definition), true); 

    public override HttpBrowserCapabilities GetBrowserCapabilities(HttpRequest request) 
    { 
     return m_Capabilities.Value; 
    } 
} 

e assegnando il provider in Application_Start:

HttpCapabilitiesBase.BrowserCapabilitiesProvider = new CustomerHttpCapabilitiesProvider(); 

Questo non ha davvero stato testato tuttavia, sicuri di ciò che è esattamente l'impatto di questo cambiamento.

+0

Non mi sembra pazzo che mi sembra il più vicino possibile disabilitarlo. –

Problemi correlati