#153 - Invocare servizi WCF da Javascript

Con il rilascio del .NET Framework 3.5 SP1 attraverso una nuova dll di nome System.ServiceModel.Web è stato inserito in Windows Communication Foundation un nuovo webHttpBinding che pur basandosi su HTTP, semplifica i messaggi di scambio permettendo di eseguire operazioni con semplici chiamate REST o POX.

Questo consente da una parte di poter sviluppare servizi con il medesimo approccio, ma allo stesso tempo, rinunciando a caratteristiche di sicurezza e in generale di WS-*, di poterlo invocare anche tramite browser.

Sebbene con XmlHttpRequest e con i framework su di esso costruiti, come ad esempio jQuery, è piuttosto semplice effettuare una richiesta GET o POST, è necessario conoscere gli URI delle operazioni e l'XML da inviare al servizio, rendendo quindi meno immediata l'implementazione.

Il binding messo a disposizione da WCF però, si riserva un path /js che permette di ottenere un file JS autogenerato che contiene i prototipi delle classi che rappresentano il servizio e le strutture dei dati utilizzati, il tutto appoggiandosi sulle API AJAX sviluppate da Microsoft e fornendo un approccio del tutto simile al codice che in genere si utilizza in un'applicazione .NET.

Si ponga quindi di avere il seguente servizio esposto via webHttpBinding.

[ServiceContract()] 
public class IMyService 
{ 
  [WebGet()] 
  string GetDate() 
} 
 
public class MyService : IMyService 
{  
  public string GetDate() 
  {  
    return DateTime.Now(); 
  }  
}

Nel file configurazione il servizio dev'essere impostato in modo che usi il binding appropriato ed i relativi behavior.

<system.serviceModel>  
  <services>  
    <service name="MyService">  
      <endpoint address="" behaviorConfiguration="webBehavior" binding="webHttpBinding" contract="IMyService" />  
    </service>  
  </services>  
  <behaviors>  
    <endpointBehaviors>  
      <behavior name="webBehavior">  
        <webHttp />  
      </behavior>  
    </endpointBehaviors>  
  </behaviors>  
</system.serviceModel>

E' possibile ottenere lo script JS autogenerato richiamando il servizio seguito da /js. Ad esempio http://miosito/MyService.svc/js. Lo script ottenuto può quindi essere referenziato in una pagina HTML, insieme a quello della libreria AJAX di Microsoft, permettendo di istanziare e chiamare facilmente il servizio.

<script type="text/javascript"> 
 
function go() 
{ 
  var s = new MyService(); 
  s.GetDate(OnGetDate, OnError); 
} 
 
function OnGetDate(result) 
{ 
  alert(result); 
} 
 
function OnError(e) 
{ 
  alert(e.get_Message()); 
} 
 
</script>

Da notare inotre che se il servizio dispone di operazioni che accettano tipi complessi, nello script JS si ritrovano anche i corrispettivi prototipi.
In ASP.NET, utilizzando l'oggetto ScriptReference, è sufficiente utilizzare la collezione Scripts indicando il percorso al file svc.

Commenti

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Segnala su:  Facebook  Messenger  Twitter        |

Approfondimenti