Una delle caratteristiche chiave di Ajax è quella di poter effettuare chiamate asincrone a servizi Web direttamente dal codice javascript. Asp.Net Ajax, oltre a fornire le classi per gestire le richieste Web ed elaborare le risposte, garantisce dei metodi che astraggono dalle diverse implementazioni supportate dai diversi browser.
La classe Ajax che permette di gestire richieste HTTP in maniera indipendente dal client è WebRequest().
Nell'esempio successivo notiamo le seguenti cose:
- Il metodo WebRequest permette di specificare il VERB (POST, GET), i parametri della chiamata (set_body), il timeout.
- Un'altra cosa che si puo' dichiarare con Webrequest e' lo userContext. Con esso possiamo passare un'informazione aggiuntiva che specifica il motivo della richiesta HTTP (ovviamente possiamo anche leggerlo quando riceviamo la risposta).
- Per motivi di sicurezza, il post viene fatto ad un proxy locale alla macchina
- Possiamo agganciare un handler che gestisce la risposta
- Nell'handler, possiamo utilizzare un metodo astratto (cross-browser) che ci indica se c'e' effettivamente una risposta disponibile
- Una volta ricevuta la risposta, il risultato viene visualizzato dentro un DIV
- Il posto viene scatenato cliccando su un Asp:Button (il post back e' disabilitato grazie a return false).
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
if (Page.IsPostBack)
{
Response.Write("Postback");
}
else
{
Response.Write("First Load");
}
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>Untitled Page</title>
<script type="text/javascript">
var xmlhttp;
function makePOST(uri)
{
var webRequest = new Sys.Net.WebRequest();
webRequest.set_url(uri);
webRequest.set_userContext('motivo specifico del post');
webRequest.set_httpVerb('POST');
webRequest.set_body('content=123');
//webRequest.set_timeout(10000);
webRequest.add_completed(completedHandler);
webRequest.invoke();
}
function completedHandler(result, eventArgs)
{
if (result.get_timedOut())
{
alert('timed out');
}
if (result.get_responseAvailable())
{
var userContext = result.get_webRequest().get_userContext();
var pageRes = result.get_responseData();
$get('placeholder1').innerHTML = userContext;
$get('placeholder2').innerHTML = pageRes;
$get('placeholder3').innerText = "test";
}
}
</script>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:Button ID="Button1" OnClientClick="makePOST('localProxyOnlyWebPart.aspx');return false;" runat="server" Text="Button" />
<div id="placeholder1"></div>
<hr />
<div id="placeholder2"></div>
<hr />
<div id="placeholder3"></div>
</form>
</body>
</html>