SlideShare una empresa de Scribd logo
1 de 44
Sviluppo di applicazioni mobile con ASP.NET
                   MVC 4

     Andrea Dottor – Microsoft MVP ASP.NET /IIS

                  in collaborazione con



                  http://www.remedia.it
feedback

           o feedback su:
               • http://xedotnet.org/feedback


           •   Codice: KPKP2


           Email:                   andrea@dottor.net
           Blog:            http://blog.dottor.net
           Twitter:         http://twitter.com/dottor
                                      in collaborazione con
feedback




10                                    http://www.remedia.it
Alcuni numeri
From http://www.trinitydigitalmarketing.com/the-rise-of-mobile-infographic

  There are currently 6 Billion mobile
     subscribers worldwide
    This equals 87% of the world’s
     population
    China and India account for 30% of this
     growth
    There are over 1.2 Billion people
     accessing the web from their mobiles
    Over 300,000 apps have been
     developed in the past 3 years
    Google earns 2.5 Billion in mobile ad
     revenue annually
The Rise of Mobile
From http://www.trinitydigitalmarketing.com/the-rise-of-mobile-infographic
• Maggiore
                     integrazione/supporto con
                     HTML5
                   • Nuovi template
                   • Personalizzazione view/layout
                     per navigazione da mobile


Novità in
ASP.NET MVC
4 per il mobile?
Template mobile

 Nuovo template di progetto con pieno
  supporto al mobile
 Libreria JQuery Mobile inclusa e
  referenziata
 Le view presenti fanno uso di JQuery
  Mobile
demo
ASP.NET vNext - Fall 2012 Update
 Uscito il 31.Ottobre.2012
   http://www.asp.net/vnext
   http://weblogs.asp.net/jgalloway/archive/2012/10/31/te
    n-oh-wait-eleven-eleven-things-you-should-know-
    about-the-asp-net-fall-2012-update.aspx
 Nuovi template
   Single Page Application templates
   Facebook Application
 ASP.NET Web API Update
   ASP.NET Web API OData
   ASP.NET Web API Tracing
   ASP.NET Web API Help Page
 Windows Azure Authentication
 ASP.NET SignalR
 ASP.NET Friendly URLs
Single Page Application template

 Nuovo template
  Doveva essere incluso in ASP.NET MVC 4 ma è
   stato rimosso poco prima del rilascio ufficiale
 Utilizza knockout.js lato client
 Utilizza Web API lato server

 E' un'applicazione "Todo List"
 completa
demo
Differenziare il layout mobile

 Rinominare _Layout.cshtml in
  _Layout.Mobile.cshtml
 In modo automatico ASP.NET MVC è
  in grado di utilizzare il layout corretto a
  seconda del dispositivo che stà
  consumando l'applicazione
Personalizzare le View per mobile

 Come per il layout, è sufficiente
  rinominare la view aggiungendo dopo
  il nome .mobile
   Es: Index.cshtml -> Index.mobile.cshtml


 La logica nel controller rimane la
  stessa
 Viene differenziato solo il rendering
  HTML
Rendering per un preciso device

 Si ha la possibilità di personalizzare view
   e layout per un preciso
   dispositivo/browser
  Intervanire nel global.asax andando a
   personalizzare il DisplayModeProvider
DisplayModeProvider.Instance.Modes.Insert(0, new
DefaultDisplayMode("iPhone")
{
    ContextCondition = (context =>
       context.GetOverriddenUserAgent().IndexOf
        ("iPhone", StringComparison.OrdinalIgnoreCase) >= 0)
});



 Creare le nuove view/layout utilizzando
   la sintassi Index.iPhone.cshtml
demo
• Media-Query
               • ViewPort




Alcune cose
da conoscere
Media-Query

 Fa parte delle specifiche di CSS3
  http://www.w3.org/TR/css3-mediaqueries/
 E' ustensione dei media types
  (screen,print) di CSS2
 Permette di poter aggiungere degli stili
  in particolari condizioni
  Il caso più commune è quello della width
      Smartphone   320px
      Tablet       768px
      Netbook      1024px
      Desktop      1600px
Esempio: Scott Hanselman blog
demo
ViewPort

        Il viewport è un metatag introdotto con
          HTML5
           Va inserito nella sezione head della pagina
        Permette di specificare ad un browser mobile
         come gestire lo zoom e le dimensioni del sito
        Senza questo tag il browser setta un width di
         circa 850px
        Possiamo indicare di settare la width del sito
         uguale alla width del telefono
        Possiamo bloccare lo zoom da parte
         dell'utente
<meta name="viewport" content="width=device-width , user-
scalable=no" />
ViewPort – possibili valori
 width: Si può specificare un valore in pixel
    oppure "device-width".
   height: come la width ma per l'altezza. Oltre ai
    pixel si può usare "device-height".
   initial-scale: scala da 0 a 10, indica il livello di
    zoom iniziale (con 1 = nessuno zoom). Il
    consiglio è lasciare questo valore vuoto o
    settarlo a "1".
   user-scalable: yes/no. Se "no" l'utente non
    può modificare il livello di zoom della pagina.
   minimum-scale: da 0 a 10, con user-scalable
    a "yes" indica il livello minimo di zoom a cui
    l'utente può arrivare.
   maximum-scale: da 0 a 10, con user-scalable
    a "yes" indica il livello massimo di zoom a cui
    l'utente può arrivare.
demo
Esporre i dati
Come fornire i Dati?

1. JsonResult da metodi del controller
2. Servizi REST tramite WCF
  WebHttpBinding
3. Web API
4. …
JsonResult

 PRO:
  Facile come creare un normale metodo
   all'interno di un controller ASP.NET MVC
  La soluzione più semplice per fornire i dati
   all'applicazione


 CONTRO:
  Restituisce i dati solamente in formato JSON
WCF / Rest

 PRO:
  Esposizione dei dati tramite JSON o XML (nel
   caso del WebHttpBinding)
  Non necessita di un'applicazione ASP.NET MVC
  Possibilità di esporre gli stessi dati anche
   attraverso altri binding modificando solamente la
   configurazione


 CONTRO:
  La configurazione di WCF
WebApi

 PRO:
  Possibilità di fornire i dati sia in JSON che XML a
   seconda della richiesta
  Supporto query OData
  Ottimizzate per lavorare via HTTP

 CONTRO:
• Cos'è
              • Alcune soluzioni




Same origin
policy
Same origin policy

 Per fornire maggiore sicurezza ai
  browser
 Impedisce a script client (JavaScript nel
  nostro caso) di accedere a
  risorse/metodi provenienti da un
  dominio diverso da quello corrente
  Es: mobile.site.com non può accedere ai dati di
   services.site.com
Soluzione 1: proxy in locale

 Creare un proxy nel dominio corrente
  che si occupi di rieseguire/ridirezionare
  le chiamate
 Facilemente implementabile
 Può richiedere una doppia
  manutenzione
   Servizi remoti
   Proxy in locale
Soluzione 2: JSONP

 JSON with Padding
 Permette di bypassare le
 problematiche di cross-domain

  L'url della chiamata viene inserito come src di
   uno tag script
  Lo script ritornato conterrrà una chiamata ad un
   metodo di callback che deve essere specificato
   nell'url (nel parametro callback)
Esempio di chiamata JSONP

 Url:
   http://s.site.com/Products/1?callback=ShowProd
    uct
 Costruzione chiamata:
   <script type="text/javascript"
    src="http://s.site.com/Products/1?callback=Show
    Product"><script/>
 Risposta:
   ShowProduct({ "ProductName":
    "Bicicletta", "Price":950.23, "Id":23 });
JSONP con ASP.NET MVC

 Creare una classe che derivi da
  JsonResult
 Eseguire l'override del metodo
  ExecuteResult in modo da modificare
  l'output generato
  La funzione dovrà recuperare il parametro
   querystring callback, e comporre correttamente
   la risposta
JSONP con WCF

            Valido dal Framework 4.0
            Utilizzo di uno WebScriptEndpoint
               Si tratta di un WebHttpBinding con impostato
                WebScriptEnablingBehavior
            Impostare
               crossDomainScriptAccessEnabled a
               true
<system.serviceModel>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
  <standardEndpoints>
    <webScriptEndpoint>
      <standardEndpoint name="" crossDomainScriptAccessEnabled="true"/>
    </webScriptEndpoint>
  </standardEndpoints>
</system.serviceModel>
JSONP con jQuery

           Utilizzare il metodo $. getJSON()
           Aggiungere nell'url il testo
             "?callback=?"
jQuery.getJSON("http://search.twitter.com/search.json?callback=?", {
    q: "XeDotNet"
}, function (tweets) {
    // Handle response here
    console.info("Twitter returned: ", tweets);
});
JSONP con jQuery

          Utilizzare il metodo $.ajax()
          Specificare
             dataType: "jsonp"
             crossDomain: true
             jsonp: "nome funzione da creare per callback"
$.ajax({
    // ...
    dataType: 'jsonp',
    // ...
});


json123456789({
       'uid': 23,
       'username': 'andreadottor',
       'name': 'Andrea Dottor' });
Esempio chiamate da JQuery

$.ajax({
    url: "http://localhost:1044/home/GetData",
    data: { id: 'ALFKI' },
    type: "GET",
    dataType: "jsonp",
    jsonp: "callback",
    success: function (data) {
         alert(data.CustomerID + " - " + data.Country);
    }
});

$.getJSON("http://localhost:1044/home/GetData?id=ALFKI&callback=?", f
unction (data) {
    alert(data.CustomerID + " - " + data.Country);
});
demo
Soluzione 3: CORS (Cross-Origin Resource
                  Sharing)

                   Specifiche uscite con HTML5
                       http://www.w3.org/TR/cors/
                   E' un set di headers che permettono
                    di bypassare/controllare le restrizioni
                    di cross-domain
                   E' equivalente all'opzione
                    CrossDomainScriptAccessEnabled di
                    del WebHttpBinding di WCF

                   Tutorial:
                      http://www.html5rocks.com/en/tutorials/cors/
http://blogs.msdn.com/b/carlosfigueira/archive/2012/02/20/implementing-cors-support-in-asp-net-web-apis.aspx
CORS headers
 Response:
  Access-Control-Allow-Origin:
    Indica gli url che possono accedere alla risorsa corrente
  Access-Control-Allow-Credentials:
    Indica che nella request possono venir passati anche i
     cookies
  Access-Control-Expose-Headers:
    Indica quali altri header il client può aver accesso


 Request:
  Origin:
    Incluso in modo automatico da tutti i browser durante tutte le
     chiamate
  Access-Control-Request-Method:
    Metodo a cui si vuole accedere alla risorsa
     PUT, GET, DELETE
  Access-Control-Request-Headers:
Esempio CORS

 Request:
 Origin: http://api.bob.com
 Access-Control-Request-Method: PUT
 Access-Control-Request-Headers: X-Custom-Header
 Host: api.alice.com
 Accept-Language: en-US
 Connection: keep-alive
 User-Agent: Mozilla/5.0...


 Response:
 Access-Control-Allow-Origin: http://api.bob.com
 Access-Control-Allow-Methods: GET, POST, PUT
 Access-Control-Allow-Headers: X-Custom-Header
 Content-Type: text/html; charset=utf-8
Thinktecture.IdentityModel

                   Modulo presente su NuGet che
                       permette di abilitare CORS
                        http://nuget.org/packages/Thinktecture.IdentityMo
                           del
                   Supporta MVC4
                   Supporta WebAPI
                   Altamente configurabile
                          Filtro delle risorse esposte tramite CORS
                          Filtro degli url abilitati ad accedere alle risorse
                          Filtro degli header
                          …
http://brockallen.com/2012/06/28/cors-support-in-webapi-mvc-and-iis-with-thinktecture-identitymodel/
demo
Domande?
feedback

           o feedback su:
               • http://xedotnet.org/feedback


           •   Codice: KPKP2


           Email:                   andrea@dottor.net
           Blog:            http://blog.dottor.net
           Twitter:         http://twitter.com/dottor
                                      in collaborazione con
feedback




10                                    http://www.remedia.it

Más contenido relacionado

Más de Andrea Dottor

Blazor ♥️ JavaScript
Blazor ♥️ JavaScriptBlazor ♥️ JavaScript
Blazor ♥️ JavaScriptAndrea Dottor
 
Blazor, lo sapevi che...
Blazor, lo sapevi che...Blazor, lo sapevi che...
Blazor, lo sapevi che...Andrea Dottor
 
Dal RenderFragment ai Generics, tips for Blazor developers
Dal RenderFragment ai Generics, tips for Blazor developersDal RenderFragment ai Generics, tips for Blazor developers
Dal RenderFragment ai Generics, tips for Blazor developersAndrea Dottor
 
Blazor per uno sviluppatore Web Form
Blazor per uno sviluppatore Web FormBlazor per uno sviluppatore Web Form
Blazor per uno sviluppatore Web FormAndrea Dottor
 
Come sta la nostra applicazione? Un viaggio alla scoperta degli Health Check ...
Come sta la nostra applicazione? Un viaggio alla scoperta degli Health Check ...Come sta la nostra applicazione? Un viaggio alla scoperta degli Health Check ...
Come sta la nostra applicazione? Un viaggio alla scoperta degli Health Check ...Andrea Dottor
 
Blazor ha vinto? Storie di casi reali
Blazor ha vinto? Storie di casi realiBlazor ha vinto? Storie di casi reali
Blazor ha vinto? Storie di casi realiAndrea Dottor
 
What's New in ASP.NET Core 3
What's New in ASP.NET Core 3What's New in ASP.NET Core 3
What's New in ASP.NET Core 3Andrea Dottor
 
Alla scoperta di gRPC
Alla scoperta di gRPCAlla scoperta di gRPC
Alla scoperta di gRPCAndrea Dottor
 
Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente
Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente
Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente Andrea Dottor
 
Real case: migrate from Web Forms to ASP.NET Core gradually
Real case: migrate from Web Forms to ASP.NET Core graduallyReal case: migrate from Web Forms to ASP.NET Core gradually
Real case: migrate from Web Forms to ASP.NET Core graduallyAndrea Dottor
 
ASP.NET Core - Razor Pages
ASP.NET Core - Razor PagesASP.NET Core - Razor Pages
ASP.NET Core - Razor PagesAndrea Dottor
 
ASP.NET Core - dove siamo arrivati
ASP.NET Core - dove siamo arrivatiASP.NET Core - dove siamo arrivati
ASP.NET Core - dove siamo arrivatiAndrea Dottor
 
Dependency injection questa sconosciuta
Dependency injection questa sconosciutaDependency injection questa sconosciuta
Dependency injection questa sconosciutaAndrea Dottor
 
Customize ASP.NET Core scaffolding
Customize ASP.NET Core scaffoldingCustomize ASP.NET Core scaffolding
Customize ASP.NET Core scaffoldingAndrea Dottor
 
ASP.NET, ottimizziamo con la cache
ASP.NET, ottimizziamo con la cacheASP.NET, ottimizziamo con la cache
ASP.NET, ottimizziamo con la cacheAndrea Dottor
 
Cosa c'è di nuovo in asp.net core 2 0
Cosa c'è di nuovo in asp.net core 2 0Cosa c'è di nuovo in asp.net core 2 0
Cosa c'è di nuovo in asp.net core 2 0Andrea Dottor
 
Creare API pubbliche, come evitare gli errori comuni
 Creare API pubbliche, come evitare gli errori comuni Creare API pubbliche, come evitare gli errori comuni
Creare API pubbliche, come evitare gli errori comuniAndrea Dottor
 
Deploy & Run on Azure App Service
Deploy & Run on Azure App ServiceDeploy & Run on Azure App Service
Deploy & Run on Azure App ServiceAndrea Dottor
 
L'evoluzione del web
L'evoluzione del webL'evoluzione del web
L'evoluzione del webAndrea Dottor
 

Más de Andrea Dottor (20)

Blazor ♥️ JavaScript
Blazor ♥️ JavaScriptBlazor ♥️ JavaScript
Blazor ♥️ JavaScript
 
Blazor, lo sapevi che...
Blazor, lo sapevi che...Blazor, lo sapevi che...
Blazor, lo sapevi che...
 
Dal RenderFragment ai Generics, tips for Blazor developers
Dal RenderFragment ai Generics, tips for Blazor developersDal RenderFragment ai Generics, tips for Blazor developers
Dal RenderFragment ai Generics, tips for Blazor developers
 
Blazor per uno sviluppatore Web Form
Blazor per uno sviluppatore Web FormBlazor per uno sviluppatore Web Form
Blazor per uno sviluppatore Web Form
 
Come sta la nostra applicazione? Un viaggio alla scoperta degli Health Check ...
Come sta la nostra applicazione? Un viaggio alla scoperta degli Health Check ...Come sta la nostra applicazione? Un viaggio alla scoperta degli Health Check ...
Come sta la nostra applicazione? Un viaggio alla scoperta degli Health Check ...
 
Blazor ha vinto? Storie di casi reali
Blazor ha vinto? Storie di casi realiBlazor ha vinto? Storie di casi reali
Blazor ha vinto? Storie di casi reali
 
What's New in ASP.NET Core 3
What's New in ASP.NET Core 3What's New in ASP.NET Core 3
What's New in ASP.NET Core 3
 
Alla scoperta di gRPC
Alla scoperta di gRPCAlla scoperta di gRPC
Alla scoperta di gRPC
 
Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente
Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente
Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente
 
Real case: migrate from Web Forms to ASP.NET Core gradually
Real case: migrate from Web Forms to ASP.NET Core graduallyReal case: migrate from Web Forms to ASP.NET Core gradually
Real case: migrate from Web Forms to ASP.NET Core gradually
 
ASP.NET Core - Razor Pages
ASP.NET Core - Razor PagesASP.NET Core - Razor Pages
ASP.NET Core - Razor Pages
 
ASP.NET Core - dove siamo arrivati
ASP.NET Core - dove siamo arrivatiASP.NET Core - dove siamo arrivati
ASP.NET Core - dove siamo arrivati
 
Dependency injection questa sconosciuta
Dependency injection questa sconosciutaDependency injection questa sconosciuta
Dependency injection questa sconosciuta
 
Customize ASP.NET Core scaffolding
Customize ASP.NET Core scaffoldingCustomize ASP.NET Core scaffolding
Customize ASP.NET Core scaffolding
 
ASP.NET, ottimizziamo con la cache
ASP.NET, ottimizziamo con la cacheASP.NET, ottimizziamo con la cache
ASP.NET, ottimizziamo con la cache
 
Cosa c'è di nuovo in asp.net core 2 0
Cosa c'è di nuovo in asp.net core 2 0Cosa c'è di nuovo in asp.net core 2 0
Cosa c'è di nuovo in asp.net core 2 0
 
Creare API pubbliche, come evitare gli errori comuni
 Creare API pubbliche, come evitare gli errori comuni Creare API pubbliche, come evitare gli errori comuni
Creare API pubbliche, come evitare gli errori comuni
 
Deploy & Run on Azure App Service
Deploy & Run on Azure App ServiceDeploy & Run on Azure App Service
Deploy & Run on Azure App Service
 
ASP.NET Core
ASP.NET CoreASP.NET Core
ASP.NET Core
 
L'evoluzione del web
L'evoluzione del webL'evoluzione del web
L'evoluzione del web
 

Sviluppo di applicazioni mobile con ASP.NET MVC 4

  • 1. Sviluppo di applicazioni mobile con ASP.NET MVC 4 Andrea Dottor – Microsoft MVP ASP.NET /IIS in collaborazione con http://www.remedia.it
  • 2. feedback o feedback su: • http://xedotnet.org/feedback • Codice: KPKP2 Email: andrea@dottor.net Blog: http://blog.dottor.net Twitter: http://twitter.com/dottor in collaborazione con feedback 10 http://www.remedia.it
  • 3. Alcuni numeri From http://www.trinitydigitalmarketing.com/the-rise-of-mobile-infographic  There are currently 6 Billion mobile subscribers worldwide  This equals 87% of the world’s population  China and India account for 30% of this growth  There are over 1.2 Billion people accessing the web from their mobiles  Over 300,000 apps have been developed in the past 3 years  Google earns 2.5 Billion in mobile ad revenue annually
  • 4. The Rise of Mobile From http://www.trinitydigitalmarketing.com/the-rise-of-mobile-infographic
  • 5. • Maggiore integrazione/supporto con HTML5 • Nuovi template • Personalizzazione view/layout per navigazione da mobile Novità in ASP.NET MVC 4 per il mobile?
  • 6. Template mobile  Nuovo template di progetto con pieno supporto al mobile  Libreria JQuery Mobile inclusa e referenziata  Le view presenti fanno uso di JQuery Mobile
  • 8. ASP.NET vNext - Fall 2012 Update  Uscito il 31.Ottobre.2012  http://www.asp.net/vnext  http://weblogs.asp.net/jgalloway/archive/2012/10/31/te n-oh-wait-eleven-eleven-things-you-should-know- about-the-asp-net-fall-2012-update.aspx  Nuovi template  Single Page Application templates  Facebook Application  ASP.NET Web API Update  ASP.NET Web API OData  ASP.NET Web API Tracing  ASP.NET Web API Help Page  Windows Azure Authentication  ASP.NET SignalR  ASP.NET Friendly URLs
  • 9. Single Page Application template  Nuovo template  Doveva essere incluso in ASP.NET MVC 4 ma è stato rimosso poco prima del rilascio ufficiale  Utilizza knockout.js lato client  Utilizza Web API lato server  E' un'applicazione "Todo List" completa
  • 10. demo
  • 11. Differenziare il layout mobile  Rinominare _Layout.cshtml in _Layout.Mobile.cshtml  In modo automatico ASP.NET MVC è in grado di utilizzare il layout corretto a seconda del dispositivo che stà consumando l'applicazione
  • 12. Personalizzare le View per mobile  Come per il layout, è sufficiente rinominare la view aggiungendo dopo il nome .mobile  Es: Index.cshtml -> Index.mobile.cshtml  La logica nel controller rimane la stessa  Viene differenziato solo il rendering HTML
  • 13. Rendering per un preciso device  Si ha la possibilità di personalizzare view e layout per un preciso dispositivo/browser  Intervanire nel global.asax andando a personalizzare il DisplayModeProvider DisplayModeProvider.Instance.Modes.Insert(0, new DefaultDisplayMode("iPhone") { ContextCondition = (context => context.GetOverriddenUserAgent().IndexOf ("iPhone", StringComparison.OrdinalIgnoreCase) >= 0) });  Creare le nuove view/layout utilizzando la sintassi Index.iPhone.cshtml
  • 14. demo
  • 15. • Media-Query • ViewPort Alcune cose da conoscere
  • 16. Media-Query  Fa parte delle specifiche di CSS3  http://www.w3.org/TR/css3-mediaqueries/  E' ustensione dei media types (screen,print) di CSS2  Permette di poter aggiungere degli stili in particolari condizioni  Il caso più commune è quello della width  Smartphone 320px  Tablet 768px  Netbook 1024px  Desktop 1600px
  • 18. demo
  • 19. ViewPort  Il viewport è un metatag introdotto con HTML5  Va inserito nella sezione head della pagina  Permette di specificare ad un browser mobile come gestire lo zoom e le dimensioni del sito  Senza questo tag il browser setta un width di circa 850px  Possiamo indicare di settare la width del sito uguale alla width del telefono  Possiamo bloccare lo zoom da parte dell'utente <meta name="viewport" content="width=device-width , user- scalable=no" />
  • 20. ViewPort – possibili valori  width: Si può specificare un valore in pixel oppure "device-width".  height: come la width ma per l'altezza. Oltre ai pixel si può usare "device-height".  initial-scale: scala da 0 a 10, indica il livello di zoom iniziale (con 1 = nessuno zoom). Il consiglio è lasciare questo valore vuoto o settarlo a "1".  user-scalable: yes/no. Se "no" l'utente non può modificare il livello di zoom della pagina.  minimum-scale: da 0 a 10, con user-scalable a "yes" indica il livello minimo di zoom a cui l'utente può arrivare.  maximum-scale: da 0 a 10, con user-scalable a "yes" indica il livello massimo di zoom a cui l'utente può arrivare.
  • 21. demo
  • 23. Come fornire i Dati? 1. JsonResult da metodi del controller 2. Servizi REST tramite WCF  WebHttpBinding 3. Web API 4. …
  • 24. JsonResult  PRO:  Facile come creare un normale metodo all'interno di un controller ASP.NET MVC  La soluzione più semplice per fornire i dati all'applicazione  CONTRO:  Restituisce i dati solamente in formato JSON
  • 25. WCF / Rest  PRO:  Esposizione dei dati tramite JSON o XML (nel caso del WebHttpBinding)  Non necessita di un'applicazione ASP.NET MVC  Possibilità di esporre gli stessi dati anche attraverso altri binding modificando solamente la configurazione  CONTRO:  La configurazione di WCF
  • 26. WebApi  PRO:  Possibilità di fornire i dati sia in JSON che XML a seconda della richiesta  Supporto query OData  Ottimizzate per lavorare via HTTP  CONTRO:
  • 27. • Cos'è • Alcune soluzioni Same origin policy
  • 28. Same origin policy  Per fornire maggiore sicurezza ai browser  Impedisce a script client (JavaScript nel nostro caso) di accedere a risorse/metodi provenienti da un dominio diverso da quello corrente  Es: mobile.site.com non può accedere ai dati di services.site.com
  • 29. Soluzione 1: proxy in locale  Creare un proxy nel dominio corrente che si occupi di rieseguire/ridirezionare le chiamate  Facilemente implementabile  Può richiedere una doppia manutenzione  Servizi remoti  Proxy in locale
  • 30. Soluzione 2: JSONP  JSON with Padding  Permette di bypassare le problematiche di cross-domain  L'url della chiamata viene inserito come src di uno tag script  Lo script ritornato conterrrà una chiamata ad un metodo di callback che deve essere specificato nell'url (nel parametro callback)
  • 31. Esempio di chiamata JSONP  Url:  http://s.site.com/Products/1?callback=ShowProd uct  Costruzione chiamata:  <script type="text/javascript" src="http://s.site.com/Products/1?callback=Show Product"><script/>  Risposta:  ShowProduct({ "ProductName": "Bicicletta", "Price":950.23, "Id":23 });
  • 32. JSONP con ASP.NET MVC  Creare una classe che derivi da JsonResult  Eseguire l'override del metodo ExecuteResult in modo da modificare l'output generato  La funzione dovrà recuperare il parametro querystring callback, e comporre correttamente la risposta
  • 33. JSONP con WCF  Valido dal Framework 4.0  Utilizzo di uno WebScriptEndpoint  Si tratta di un WebHttpBinding con impostato WebScriptEnablingBehavior  Impostare crossDomainScriptAccessEnabled a true <system.serviceModel> <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> <standardEndpoints> <webScriptEndpoint> <standardEndpoint name="" crossDomainScriptAccessEnabled="true"/> </webScriptEndpoint> </standardEndpoints> </system.serviceModel>
  • 34. JSONP con jQuery  Utilizzare il metodo $. getJSON()  Aggiungere nell'url il testo "?callback=?" jQuery.getJSON("http://search.twitter.com/search.json?callback=?", { q: "XeDotNet" }, function (tweets) { // Handle response here console.info("Twitter returned: ", tweets); });
  • 35. JSONP con jQuery  Utilizzare il metodo $.ajax()  Specificare  dataType: "jsonp"  crossDomain: true  jsonp: "nome funzione da creare per callback" $.ajax({ // ... dataType: 'jsonp', // ... }); json123456789({ 'uid': 23, 'username': 'andreadottor', 'name': 'Andrea Dottor' });
  • 36. Esempio chiamate da JQuery $.ajax({ url: "http://localhost:1044/home/GetData", data: { id: 'ALFKI' }, type: "GET", dataType: "jsonp", jsonp: "callback", success: function (data) { alert(data.CustomerID + " - " + data.Country); } }); $.getJSON("http://localhost:1044/home/GetData?id=ALFKI&callback=?", f unction (data) { alert(data.CustomerID + " - " + data.Country); });
  • 37. demo
  • 38. Soluzione 3: CORS (Cross-Origin Resource Sharing)  Specifiche uscite con HTML5  http://www.w3.org/TR/cors/  E' un set di headers che permettono di bypassare/controllare le restrizioni di cross-domain  E' equivalente all'opzione CrossDomainScriptAccessEnabled di del WebHttpBinding di WCF  Tutorial: http://www.html5rocks.com/en/tutorials/cors/ http://blogs.msdn.com/b/carlosfigueira/archive/2012/02/20/implementing-cors-support-in-asp-net-web-apis.aspx
  • 39. CORS headers  Response:  Access-Control-Allow-Origin:  Indica gli url che possono accedere alla risorsa corrente  Access-Control-Allow-Credentials:  Indica che nella request possono venir passati anche i cookies  Access-Control-Expose-Headers:  Indica quali altri header il client può aver accesso  Request:  Origin:  Incluso in modo automatico da tutti i browser durante tutte le chiamate  Access-Control-Request-Method:  Metodo a cui si vuole accedere alla risorsa PUT, GET, DELETE  Access-Control-Request-Headers:
  • 40. Esempio CORS  Request: Origin: http://api.bob.com Access-Control-Request-Method: PUT Access-Control-Request-Headers: X-Custom-Header Host: api.alice.com Accept-Language: en-US Connection: keep-alive User-Agent: Mozilla/5.0...  Response: Access-Control-Allow-Origin: http://api.bob.com Access-Control-Allow-Methods: GET, POST, PUT Access-Control-Allow-Headers: X-Custom-Header Content-Type: text/html; charset=utf-8
  • 41. Thinktecture.IdentityModel  Modulo presente su NuGet che permette di abilitare CORS  http://nuget.org/packages/Thinktecture.IdentityMo del  Supporta MVC4  Supporta WebAPI  Altamente configurabile  Filtro delle risorse esposte tramite CORS  Filtro degli url abilitati ad accedere alle risorse  Filtro degli header  … http://brockallen.com/2012/06/28/cors-support-in-webapi-mvc-and-iis-with-thinktecture-identitymodel/
  • 42. demo
  • 44. feedback o feedback su: • http://xedotnet.org/feedback • Codice: KPKP2 Email: andrea@dottor.net Blog: http://blog.dottor.net Twitter: http://twitter.com/dottor in collaborazione con feedback 10 http://www.remedia.it