Programming Languages Hacks

Importanti regole per linguaggi di programmazione rilevanti come Java, C, C++, C#…

  • Subscribe

  • Lettori

    I miei lettori abituali

  • Twitter

Archive for the 'asp.net' Category

OWIN e KATANA

Posted by Ricibald on 14th March 2015

ASP.NET e OWIN

Nel tempo il framework ASP.NET si è trasformato. Inizialmente viveva unicamente nel contesto System.Web e le evoluzioni seguivano tempistiche di evoluzione dello stesso System.Web (annuali). In seguito l’approccio è evoluto verso componenti indipendenti da System.Web come le ASP.NET MVC e ASP.NET Web API le cui evoluzioni viaggiano indipendentemente grazie a NuGET iterando rapidamente e rimanendo "al passo".

Essendo indipendenti da System.Web sono quindi indipendenti anche da IIS: è infatti possibile fornire l’hosting di ASP.NET Web API all’interno di una semplice console o servizio windows.

La possibilità di avere un "host custom" leggero grazie ad ASP.NET Web API è stato voluto anche da numerosi altri framework, ognuno con le proprie esigenze di start/stop etc. Questo consente di non avere un IIS monolitico con tutte le funzionalità, ma avere un web server con i vari componenti indipendenti su NuGET che possono iterare indipendentemente. Avremo quindi update indipendenti per: static file serving, dynamic page generation, Web API, real-time/push notifications.

OWIN definisce un’interfaccia standard che consente di disaccoppiare il server dalle applicazioni (non sono legato fortemente a IIS o System.Web) consentendo lo sviluppo di moduli indipendenti e il deploy di applicazioni in differenti host, piattaforme e sistemi operativi. Diventa di fatto un framework generico per far interagire i framework web con i server attraverso una pipeline OWIN nota come middleware.

Tale standard, caratterizzato prevalentemente dallo scambio di strutture dati e delegati, deve poi essere implementato da un Web Server compatibile con lo standard OWIN.

Katana

L’implementazione Microsoft di tale standard open è Katana: la versione "portable" e leggera dei componenti ASP.NET. Include framework, server e host, è modulare (il size cresce solo a seconda dei moduli effettivamente utilizzati) e quindi più performante e scalabile. Porta in sostanza gli stessi benefici di Node.js mantenendosi in un contesto ASP.NET.

Nella pratica, implementeremo le nostre pipeline OWIN basandoci sul namespace generico Microsoft.Owin (indipendente dall’host) e tramite Katana potremo scegliere l’host:

  • IIS/ASP.NET: tramite package Microsoft.Owin.Host.SystemWeb in cui le pipeline OWIN sono eseguite in IIS come parte della pipeline standard ASP.NET (in pratica Katana diventa in IIS un HttpModule e un HttpHandler). Poiché server+host confluiscono nello stesso componente i due non sono separabili e non è quindi rimpiazzare nel server un’implementazione alternativa.
  • Custom Host: tramite package OwinHost in cui le pipeline OWIN sono eseguite in un nostro processo come una console, un servizio windows o un Azure Worker Role (in pratica Katana usa la classe .NET HttpListener). Nella classe Main dovremmo inserire il codice che avvia il server.
  • OwinHost.exe: come il Custom Host ma in una console indipendente pronta all’uso che avvia il server trovando la pipeline OWIN che abbiamo implementato tramite convenzioni

Si può creare un proprio modulo Katana (es. logging) semplicemente creando una pipeline che deriva da OwinMiddleware e aggiungendolo allo startup (o tramite convenzioni se si usa OwinHost.exe).

I moduli Katana già presenti sono numerosi come si nota da NuGET e vanno da SignalR a OAuth 2.0 allo stesso ASP.NET Web API. Spesso le pipeline (o moduli) creano gerarchie di dipendenze come evidente in questa immagine.

Approfondimenti

Per altre info si consulti l’articolo introduttivo mentre si rimanda al link OWIN ufficiale per la lista dei server (es. Katana), framework (es. ASP.NET o WebAPI) e implementazioni dei framework (es. ASP.NET 5)

Posted in asp.net | No Comments »

Page Doesn’t Postback After Validation Error

Posted by Ricibald on 27th June 2013

If there is a validation error, web controls that don’t need to repeat validation don’t postback on first attempt but postback on second attempt.

The reason (thanks to Lions Den) is that after running Page_ClientValidate ASP.NET runs another built in function ValidatorCommonOnSubmit. Within Page_ClientValidate, Page_BlockSubmit is set based on the validation. The postback is then blocked in ValidatorCommonOnSubmit if Page_BlockSubmit is true. No matter what, at the end of the function Page_BlockSubmit is always reset back to false. If a page does a postback without running any validation and Page_BlockSubmit has not been reset to false, the partial postback will be blocked.

First solution: reset Page_BlockSubmit

In this solution we just reset Page_BlockSubmit. This is the simplest solution and doesn’t have collateral effects. But you need to set this on every case you’ll need it.

function DoValidation() {
   var validated = Page_ClientValidate('ValidationGroup');

   // THIS IS THE CHANGE: REMOVE THE FLAG
   Page_BlockSubmit = false;

   return validated;
}

Second solution: never block postback

In this solution we redefine the code of ValidatorCommonOnSubmit returning always true (just make sure to copy and paste the same ASP.NET implementation):

function ValidatorCommonOnSubmit() {
   Page_InvalidControlToBeFocused = null;
   var result = !Page_BlockSubmit;
   if ((typeof(window.event) != "undefined") && (window.event != null)) {
      window.event.returnValue = result;
   }
   Page_BlockSubmit = false;

   // THIS IS THE CHANGE: ALWAYS RETURN TRUE
   return true;
}

Posted in asp.net | No Comments »

Adapt/convert Microsoft Ajax events to JQuery

Posted by Ricibald on 22nd July 2011

It’s very useful to express everything in JQuery instead of ASP.NET AJAX events system: in this way we can use a lot of useful JQuery controls.

To achieve this just add this snippet of javascript code:

<script type="text/javascript">
	Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(BeginRequest);
	Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequest);
	function BeginRequest(sender, args) {
		jQuery.event.trigger('ajaxSend');		
	}
	function EndRequest(sender, args) {   
		jQuery.event.trigger('ajaxComplete');		                             
	}
</script>

In this way you can capture standard JQuery event to obtain for example a modal progress feedback both in case of JQuery ajax POST and in case of ASP.NET UpdatePanel events:

<script type="text/javascript">
	$(document).bind("ajaxSend", function () {
		$("#loadingAjax").dialog({ modal: true });
	}).bind("ajaxComplete", function () {
		$("#loadingAjax").dialog("close");
	});
</script>

Posted in asp.net, javascript, jQuery | No Comments »