UserControl, UpdatePanel UrlRewrite, una combinazione vincente!
È un po' di tempo che non faccio post sul blog, ma oggi con Stefano e GVNN, stavamo cercando di risolvere un problema in una situazione tipo la seguente:
UserControl normalissimo con all'interno un semplice UdatePanel che al click esegue delle semplici operazioni di select ed insert sul database.
E fin qui nulla di particolare se non fosse per il fatto che al primo colpo veniva eseguito il codice perfettamente, mentre al secondo giro la chiamata asincrona non andava più e veniva mostrato un messaggio di errore tipo il seguente:
Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that <machinekey> configuration specifies the same validationKey and validation algorithm. AutoGenerate cannot be used in a cluster.
Ovviamente sia EnableViewStateMac che ViewStateEncryptionMode sono impostati su false ed eravamo in locale quindi niente cluster.
Andando a guardare con fiddler le chiamate ci siamo accorti che al primo giro veniva effettuata una chiamata ad un url, mentre al secondo l'url era differente, o meglio non era più il RawUrl ad essere chiamato ma l'url non riscritto da un HttpModule interno.
Indagando un po' più a fondo ci siamo accorti che all'interno dell'evento pageLoading della classe Sys.WebForms.PageRequestManager veniva riscritto l'url da chiamare.
Il problema è risolvibile aggiungedo questo 4 righe di JavaScript:
Sys.Application.add_load(function() { var form = Sys.WebForms.PageRequestManager.getInstance()._form; form._initialAction = form.action = window.location.href; });
Devo dire che ormai non mi stupisco più quando trovo stranezze sul Framework Ajax 1.0 che ritengo più una versione 0.8, e aggiungo questo comportamento all'elenco delle cose che spero Fixate nella prossima Release (Encoding non UTF-8, WebPart, ecc) del Framework ASP.NET AJAX.
Ciauz