Rilevare dispositivi Mobile in Asp.Net

Ci sono diversi modi per capire se il dispositivo che sta visitando il sito è uno smartphone o un pc Desktop.

Funzione standard di Asp.Net: Request.Browser

Asp.Net fornisce una funzione chiamata Request.Browser che serve a fornire informazioni riguardo il client che sta visitando la pagina.
Tra le proprietà messe a disposizione è interessante la IsMobileDevice che ci dice se il client è un dispositivo Mobile (smartphone).

Questa funziona può essere richiamata nel PreInit della pagina:

Protected Sub CheckBrowserCaps()

 Dim labelText As String = ""
 Dim myBrowserCaps As System.Web.HttpBrowserCapabilities = Request.Browser
 If (CType(myBrowserCaps, System.Web.Configuration.HttpCapabilitiesBase)).IsMobileDevice Then
  labelText &= "Device is Mobile"
 Else
  labelText &= "Device is NOT Mobile"
 End If

 Label1.Text = labelText

End Sub

Purtroppo questa proprietà non è sempre accurata. Ad esempio ho notato che il browser Firefox su Android 4.4 viene riconosciuto erroneamente come piattaforma Desktop.
Anche altre proprietà non sono accurate, come le dimensioni dello schermo o la marca del dispositivo. E' quindi naturale cercare librerie di terze parti che forniscano dati corretti.

Librerie di terze parti: 51Degrees

51Degrees Device Detection può essere un'ottima alternativa alle funzioni native di .Net. E' sufficiente usare la versione gratuita per avere le fuzionalità di base più interessanti.

Gli esempi riportati nella documentazione effettuano un redirect automatico nel caso in cui il dispositivo sia mobile. E' quindi possibile costruire un altro sito specifico per gli smartphone verso il quale vengono reindirizzati in automatico i dispositivi mobili.

Se è questo il comportamento che desiderate allora attenetevi alla documentazione ufficiale. Nel mio caso invece voglio semplicemente avere una variabile che mi dice se il dispositivo è Mobile, per poi gestire manualmente i comportamenti del sito.

Scaricare i files

Su Codeplex sono presenti i file necessari, compatibili con le versioni 3.5 e >4 del framework .Net

51Degrees DLL Website Enhancer

  • 51Degrees.config
  • FiftyOne.Foundation.dll

51Degrees Lite Device Data - Version 3.1 Format

  • 51Degrees-Lite.dat

51Degrees.config

E' il file di configurazione della libreria.
Rispetto alla versione di default ho commentato la sezione che effettua il redirect automatico perché come ho scritto sopra voglio gestire manualmente i comportamenti del sito.
Notare anche che ho disattivato l'aggiornamento automatico, il monitoraggio della banda e la condivisione delle informazioni con 51Degrees al fine di non intaccare le prestazioni.

<?xml version="1.0"?>
 <configuration>
 <configSections>
  <sectionGroup name="fiftyOne">
  <!-- <section name="redirect" type="FiftyOne.Foundation.Mobile.Configuration.RedirectSection, FiftyOne.Foundation" requirePermission="false" allowDefinition="Everywhere" restartOnExternalChanges="false" allowExeDefinition="MachineToApplication"/> -->
  <section name="detection" type="FiftyOne.Foundation.Mobile.Detection.Configuration.DetectionSection, FiftyOne.Foundation"
   requirePermission="false" allowDefinition="Everywhere" restartOnExternalChanges="false"
   allowExeDefinition="MachineToApplication"/>
  </sectionGroup>
 </configSections>
 <fiftyOne>
 
 <!-- Redirect automatico per dispositivi mobili -->
 <!--
 <redirect firstRequestOnly="false"
 mobileHomePageUrl="~/M.aspx"
 timeout="20"
 mobilePagesRegex="M.aspx">
 </redirect>
 -->
 
 <!-- Rilevamento tipo di dispositivo -->
 <detection binaryFilePath="~/app_data/51Degrees-Lite.dat" enabled="true" autoUpdate="false" shareUsage="false"
  bandwidthMonitoringEnabled="false" featureDetectionEnabled="true" />

 </fiftyOne>
</configuration>

FiftyOne.Foundation.dll

Questa DLL va copiata all'interno della cartella speciale BIN del sito Asp.Net.

Web.Config

A seconda della versione di Asp.Net può essere necessario modificare il Web.Config per far riconoscere correttamente la nuova DLL. Questa parte è spiegata bene nella documentazione ufficiale.

<system.webServer>
 <modules>
  <remove name="Detector"/>
  <add name="Detector" type="FiftyOne.Foundation.Mobile.Detection.DetectorModule, FiftyOne.Foundation"/>
 </modules>
</system.webServer>

51Degrees-Lite.dat

Questo file contiene la definizione degli User Agent e dei tipi di dispositivi; è l'archivio che viene usato da 51Degrees per capire se il dispositivo è di tipo Mobile.
La versione  LITE è gratuita e viene aggiornata con meno frequenza rispetto alla versione Premium a pagamento.

Il percorso di questo file viene indicato nel 51Degrees.config nella sezione binaryFilePath. E' consigliabile depositarlo nella cartella speciale App_Data di Asp.Net.
Se non specificato, la DLL userà una sua definizione interna la quale però ha meno definizioni e ovviamente è meno aggiornata.

Riavviare IIS

Per far sì che il tutto funzioni correttamente è necessario riavviare il sito tramite IIS.
In locale mi è stato sufficiente chiudere Cassini e far ripartire il progetto da Visual Studio.
Invece per il sito online (attualmente www.Dev-oClock.com è ospitato su Aruba) mi sono dovuto collegare remotamente a IIS tramite il pannello locale del mio pc, come spiegato in questo articolo.
Il riavvio (o riciclo) permette a IIS di registrare correttamente la DLL FiftyOne.Foundation.dll

Testare il funzionamento

Se tutto è andato buon fine, la libreria di 51Degrees ha sovrascritto alcune proprietà fornite da Request.Browser. Questo significa che non è necessaria alcuna modifica al codice già presente, e si può usare la stessa funzione IsMobileDevice del primo esempio di questo articolo.

A questo indirizzo si trova l'elenco delle proprietà che vengono sovrascritte.

IsMobileDevice viene sovrascritta con la nuova proprietà IsMobile, che può essere testata con questo codice:

Dim labelText As String = ""
Try
 labelText &= "51 Degrees detection - IsMobile: " & Request.Browser("IsMobile").ToString() & "<br />"
Catch ex As Exception
 labelText &= "51 Degrees overwrite is NOT working :( "
End Try

La versione a pagamento fornisce ulteriori proprietà utili come IsTablet, IsTv e IsConsole.

Autore: Sergio Roberto Boarina