lunedì 13 febbraio 2012

jquery asp.net mvc e chiamate cross domain

Pensavo fosse una cosa semplicissima.

Il progetto: chiamare una pagina nel dominio del motore di ricerca e ottenere le strutture messe in offerta in tempo reale.

La soluzione: creare un nuovo controllore, la relativa azione, configurare il routing in modo che la richiesta di un indirizzo corrisponda la restituzione di json completo di tutte le strutture.

Sembrava una cosa semplicissima il controller sfruttando la potenza del framework .Net:

[HttpGet]
        public JsonResult GetListaOfferte(int num = 0)
        {
            IEnumerable<ProdottoListinoViewModel> listaRisultati = _siteService.GetProdottoOffertaCatalogo();
            return Json(listaRisultati.Distinct(new ProdottoListinoViewModelComparer()).ToList().Take(num), JsonRequestBehavior.AllowGet);
        } 
Il passo successivo è stata la scrittura del javascript:


$.ajax({
url: "(..)/api/GetListaOfferte",
data: {num: "8"},
type: "GET", contentType: "application/json; charset=utf-8", success: function(response) {
alert(response);
}, dataType: "json"
});

Da questo punto in poi sono cominciati i guai. Il problema è che $.ajax subisce i limiti di sicurezza definiti dalla same-domain policy.

La soluzione è stata utilizzare JSONP e quindi implementare un action filter (grande .Net) e poi cambiare la chiamata ajax:


public class JsonpFilterAttribute : ActionFilterAttribute    {
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            if (filterContext == null)
                throw new ArgumentNullException("filterContext");
            
            string callback = filterContext.HttpContext.Request.QueryString["callback"];
            if (callback != null && callback.Length > 0)
            {
               
                JsonResult result = filterContext.Result as JsonResult;
                if (result == null)
                {
                    throw new InvalidOperationException("JsonpFilterAttribute must be applied only " +
                        "on controllers and actions that return a JsonResult object.");
                }
                filterContext.Result = new JsonpResult                {
                    ContentEncoding = result.ContentEncoding,
                    ContentType = result.ContentType,
                    Data = result.Data,
                    Callback = callback
                };
            }
        }
    }


aggiungere l'attributo [JsonpFilter] all'azione del controller.
E infine modificare la chiamata ajax:


$.getJSON(
"http://(...)/api/GetListaOfferte?callback=?",
{num: "8" },
function(data) {
alert(data);
});

mercoledì 11 gennaio 2012

IE8 e il metodo find() di jquery

Internet Explorer 8 presenta un bug: il metodo find() non funziona con tag xml a meno di non costruire un oggetto ActiveX.
Se la variabile xml rappresenta il codice da analizzare la soluzione è la seguente:

var data;

    if ($.browser.msie) 
    {
       data = new ActiveXObject("Microsoft.XMLDOM");
       data.async = false;
       data.loadXML(xml);
    } 
    else 
    {
       data = xml;
    }

su data adesso è possibile utilizzare il metodo find() per individuare un nodo particolare.

giovedì 29 dicembre 2011

OrientDb e i database NoSql

Da circa un anno l'azienda ha avviato un sistema che sostanzialmente riprende i criteri del multilevel marketing.
L'ambiente informatico che supporta questo sistema è nato e cresciuto in modo disomogeneo, è arrivato il momento di riprogettarlo.
Per ora siamo ancora ad una fase esplorativo e io mi sono preso la strada più lontana da quello che è l'attuale implementazione. 
Ho un albero perciò lo voglio rappresentare con un grafo e poi persistere su un database NoSql. Il prodotto su cui ho messo gli occhi è OrientDb.

Per ora mi sta facendo impazzire, ma è un oggetto molto interessante. Nei prossimi post fisserò le operazioni che sto compiendo.

martedì 13 settembre 2011

Php e Sql Server: come recuperare il return code di una stored procedure

$tsql_callSP = "{?=call sp_LoginUtente(?,?)}";
  $risultato=1;
  $params = array(
   array(&$risultato,SQLSRV_PARAM_OUT),
   array($username, SQLSRV_PARAM_IN),
   array($password, SQLSRV_PARAM_IN)  
   );
il trucco è definire un parametro di output uguale al valore di ritorno della stored procedure.

lunedì 1 agosto 2011

Symfony 2

Dopo circa 3 anni di sviluppo esce finalmente la versione 2.0 del framework Symfony... devo assolutamente trovare il tempo di studiarmela.