ASP.NET App Suspend

by Andrea Dottor 12 October 2013 12:12

All’interno del .NET Framework 4.5.1 è stata introdotta una nuova funzionalità dal nome ASP.NET App Suspend, che farà la gioia di molti di voi (me compreso).

Di che cosa si tratta?

AppSuspend_wfASP.NET App Suspend permette di ridurre i tempi di avvio di un’applicazione ASP.NET (che solitamente ricadevano nell’utente che si trovava ad eseguire la prima richiesta), in quanto si ha possibilità di specificare che, dopo il tempo di inattività dell’ApplicationPool invece di terminare il processo, ora potrà andare in uno stato di sospensione, permettendo così alla richiesta successiva di non dover ricompilare totalmente l’applicazione.
Questa novità permette di ridurre i tempi di primo avvio del ben 90%.
Altro aspetto da non sottovalutare è che questa funzionalità permetterà così di poter avere più siti in host all’interno dello stesso server, ben 7 volte i siti attuali.
AppSuspend_stats

Vincoli

Per poter utilizzare questa funzionalità, l’applicazione dovrà essere sviluppata con il .NET Framework 4.5.1 e dovrà essere pubblicata in un server Windows Server 2012 R2.

Abilitare la funzionalità

Per abilitare la funzionalità di dovrà intervenire nei settings dell’ApplicationPool andando a selezionare (all’interno delle impostazioni avanzate) nel parametro “Idle Time-out Action” la voce “Suspend” invece di quella di default che è “Terminate”.
AppSuspend_enable

Ed ora non ci resta che aspettare di aggiornare/migrare i nostri server a Windows Server 2012 R2 e godere di questa nuova funzionalità.

Per maggiori informazioni a riguardo, vi consiglio la lettura dei seguenti post:

Tags: , ,

ASP .NET | .NET

Codice e slide della sessione Il buon programmatore - consigli pratici per una vita felice

by Andrea Dottor 12 October 2013 11:38

Venerdì 11 Ottobre 2013 ho tenuto la sessione “Il buon programmatore - consigli pratici per una vita felice”.

Lavorando come consulente mi sono trovato spesso di fronte a problematiche (a volte banali), ma che erano la causa di gravi problemi di performance dell'appliccazione realizzata, oppure più banali, ma che rendevano il codice meno manutenibile e gestibile, specialmente lavorando in team. Vedere che nel tempo, persone/realtà diverse, commettono gli stessi errori mi ha fatto pensare a questa sessione...dove intendo elencare i problemi più comuni, che per causa di tempo o scarsa conoscenza, vengono commessi, e proporre delle soluzioni semplici da poter applicare fin da subito. (ASP.NET, ma non solo)

 

Questa sessione, e specialmente i vostri commenti post-sessione fanno capire quanto spesso le basi, o funzionalità che abbiamo ogni giorno sotto agli occhi, vengano sottovalutate.
Questa sessione è solo un punto di partenza, e chissà che trovi il tempo di approfondire questi ed altri argomenti simili direttamente qui nel blog.

Ringrazio tutti i partecipanti, vedere la sala piena, e gente che prende appunti da una soddisfazione che non immaginate…grazie.
Vi ricordo il prossimo appuntamento su SignalR giovedì 7 Novembre, e per info:
http://www.xedotnet.org/Home/Meeting/20131108

Tags: , , ,

.NET | ASP .NET | XeDotNet

Conoscere se un Type è di tipo Nullable<T>

by Andrea 30 September 2013 14:14

Oggi sono re-incappato nel caso di dover verificare su un tipo T all'interno di una funzione generica fosse di tipo Nullable<> o no.

Ed ecco una possibile soluzione:

Type type = typeof(T);
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof (Nullable<>))
{
 
}

Fonte MSDN: How to: Identify a Nullable Type (C# Programming Guide)

Ci sono operazioni che non si fanno tutti i giorni, dove per ritrovare quella riga di codice necessario basterebbe riaprire del vecchio codice, oppure cercare un pò in rete...ma visto che potrebbe essere utile non solo a me, ho deciso di riportarla qui nel blog.
;-)

Tags: ,

.NET

Convertire file Word in PDF – Aspose.Word for .NET

by Andrea Dottor 18 June 2013 16:08

Non faccio spesso pubblicità a componenti di terze parti, ma questa volta faccio un’eccezione in quando ha permesso a me (ed al mio cliente) di risparmiare molto molto tempo (e sappiamo che il tempo è denaro) :-).

aspose_words_netIl componente in questione è Aspose.Word for .NET.
Si tratta di una libreria che permette di leggere, modificare e convertire documenti Word (non solo .docx ma anche .doc).

Nel mio caso, avevo necessità di dover convertire dei documenti già generati, o da generare, da Word a PDF. Cercando in rete si trovano varie soluzioni ma che spesso richiedono Word installato nel server...e questo era assolutamente da evitare.

Guardando la documentazione di Aspose, scopro che con 2 sole righe di codice è possibile convertire un documento Word, in svariati formati tra cui il PDF. Incredulo, scarico subito la libreria (di prova) da Nuget (che trovate a questo link https://nuget.org/packages/Aspose.Words/), e cosa scopro?! Scopro che effettivamente tutto ciò è vero...2 righe di codice e potete convertire il documento Word in pdf, xps, epub, jpg, tiff, html, e molti altri formati.

Document doc = new Document("c:\\TestDocument.docx");
doc.Save("C:\\TestDocument.pdf", SaveFormat.Pdf);

La cosa ancora più eccezzionale è che questa libreria permette di lavorare in memoria utilizzando direttamente gli stream, che permetterebbe (come nel mio caso) di non dover modificare l’esistente logica di creazione dei file Word (generati con l’SDK di Open XML) e poter ritornare da una pagina web lo stream del file, senza la necessità di salvare nulla ne file-system.

at-glance-aspose-words-for-net

Spero che questo post aiuti chi si dovesse trovare nella mia stessa situazione.

Il costo della licenza non è proprio irrisorio, ma sono convinto del fatto che svilupparselo in casa avrebbe un costo decisamente superiore...e sicuramente non si arriverebbe ad avere per le mani una libreria completa come questa.

Tutti i documenti convertiti/creati fino ad ora hanno rispettato sotto tutti gli aspetti quelli del documento originale (stili, proprietà di pagina, colori, margini, ...) …e sono stati la motivazione per cui ho voluto scrivere questo post.

Tags: , ,

.NET | ASP .NET

Inviare email tramite un SMTP con certificato self-signed

by Andrea Dottor 05 September 2012 23:14

Può capitare (in fase di sviluppo) di dover inviare delle mail ad un server SMTP che ha un certificato self-signed.
Se provate ad inviare una mail da codice vi ritroverete con una bella eccezzione a causa del fallimento della validazione del certificato.

Un possibile work-around è quello di forzare il check della validità dei certificati in modo da far ritornare sempre true.
Il codice necessario è il seguente:

ServicePointManager.ServerCertificateValidationCallback =
                                (sender, certificate, chain, sslPolicyErrors) => true;

NOTE: il codice in questione è valido ogni qualvolta vi troviate a dover bypassare degli errori dovuti ai certificati.
Per ovvi motivi di sicurezza, siate ben consci di utilizzare questo codice solamente durante le fasi di sviluppo, altrimenti tanto varrebbe evitare l’uso del certificato.

Ed ecco il codice completo da utilizzare, compreso di invio della mail

ServicePointManager.ServerCertificateValidationCallback =
                                (sender, certificate, chain, sslPolicyErrors) => true;

MailMessage mail = new MailMessage();
mail.To.Add(new MailAddress("mail del destinatario"));
mail.Subject = "Oggetto";
mail.Body = "Corpo della mail";
mail.From = new MailAddress("mail del mittente");

SmtpClient smtp = new SmtpClient("smtp.miaazienda.it");
smtp.Credentials = new NetworkCredential("user", "password", "dominio");
smtp.EnableSsl = true;

smtp.Send(mail);

Tags: ,

ASP .NET | .NET

Baroliere - L'app per vincere/barare ai giochi di parole

by Andrea Dottor 12 June 2012 00:30

La mia esperienza con Windows Phone non si è assolutamente fermata, ed infatti ecco che me ne sono uscito con un'applicazione dedicata a chi ha difficoltà a vincere ai giochi di parole come ad esempio scrubble, scarabeo, o simili.
Se vi serve un aiuto per battere un vostro amico o familiare a questi giochi, ecco l'app che fa per voi!

La potete trovare al seguente link:
http://www.windowsphone.com/it-IT/apps/6753e7e0-4de1-4d56-854f-fdedf980cc4d

Barare+parole=BAROLIERE
Vincere ai giochi di parole non è mai stato così facile.
Immetti le lettere che hai a disposizione e ti verranno visualizzate tutte le parole disponibili nel dizionario italiano.

Paroliere, scrubble, scarabeo sono solo alcuni dei giochi in cui quest'applicazione ti può facilitare la vita.

Sviluppare per Windows Phone è divertente ed immediato, e quest'app lo dimostra...

Una sera, giocando a scrubble online, mi sono ritrovato di fronte ad un file txt contenente tutte le parole presenti all'interno del dizionario Italiano, e subito mi è nata l'idea di utilizzarlo per realizzare un'applicazione Windows Phone. Ed allora eccomi, qualche sera davanti a Visual Studio e questo è il risultato.

SplashScreenImagemainPageinfoPage

L'app è disponibile a pagamento con 3 giorni di trial...più che sufficienti per capire il funzionamento di questa semplice applicazione.
Ho aggiornato il prezzo a 1,29€ che per barare mi sembrano il minimo Winking smile

Tags: , , ,

Tempo libero | .NET | Windows Phone

Libero professionista a tempo pieno

by Andrea 10 September 2011 04:05

logoEbbene si, da quasi un mese, sono libero professionista a tempo pieno. Una nuova sfida da affrontare.

Sono più di 3 anni che ho la partita iva, ma fino al mese scorso ho sempre lavorato come dipendete. Questo mi ha permesso di aver le spalle sempre coperte e riuscire al tempo stesso a confrontarmi con sempre nuove prove.
L’essere dipendete ha sicurametne molti vantaggi, ma al tempo stesso può essere (a volte) limitante. (per poter tenere un corso (come speaker) dovevo prendermi ferie…per clienti che mi richiedevano la presenza da loro, avevo principalmente solo il sabato…)

Ho scelto di fare un passo importante, di lanciarmi in una nuova sfida, e mettermi totalmente in gioco decidendo di intraprendere questa nuova strada.
Alcune persone mi hanno spinto in questa decisione, altre mi hanno fatto riflettere, specialmente a riguardo del periodo non proprio positivo, e ho tirato le somme.
Per me (e per mia moglie) questo era il momento giusto, ed ora non mi rimane altro che impegnarmi a pieno in questo nuovo obbiettivo e continuare a crederci fino in fondo.

Il tutto sembra esser iniziato proprio nel migliore dei modi Open-mouthed smile

Tags:

+1 | ASP .NET | Pensieri | Generale

Aggiornare un UpdatePanel da un differente UserControl

by andrea 11 March 2009 06:54

Quando si utilizza un UpdatePanel consiglio sempre di impostare la proprietà UpdateMode a Conditional e ChildrenAsTriggers a False, per avere il pieno controllo su ciò che accade, e far trafficare il minimo html possibile.

Ci sono condizioni però in qui questo non sembra possibile.
Uno di questi casi è quando il postback asincrono dovrebbe essere scatenato da un controllo contenuto all'interno di un'altro UserControl. La soluzione più semplice sarebbe stata quella di settare UpdateMode ad Always, ma questo causerebbe l'aggiornamento durante un qualsiasi postback asincrono.
Ma anche a questo caso esiste una soluzione, e la soluzione sono gli eventi.

UserControl 1
Controllo che contiene il pulsante che deve scatenare il PostBack asincrono.

Questo UserControl esporrà un evento Command, che servirà come trigger per indicare che è stato scatenato un evento in un controllo in esso contenuto (in questo caso un LinkButton).
Andiamo a gestire l'evento OnCommand del LInkButton, e al suo interno faremo rilanciare l'evento utilizzando il metodo RaiseBubbleEvent.

Gli UserControl possono contenere controlli che scatenano eventi. Il metdo RaiseBubbleEvent permette di rilanciare all'esterno questi eventi, permettendo di riassegnare il sender.

Si ha quindi la condizione che l'evento OnCommand scatenato dal LinkButton verrà visto come evento OnCommand (contenente le stesse informazioni) ma generato dallo UserControl.

   1: public event CommandEventHandler Command;
   2:  
   3:  
   4: protected void Button_Command(object sender, CommandEventArgs e)
   5: {
   6:     CommandEventHandler handler = this.Command;
   7:  
   8:     if (handler != null)
   9:         handler(this, e);
  10:  
  11:     base.RaiseBubbleEvent(this, e);
  12: }

UserControl 2
Controllo che contiene l'UpdatePanel da aggiornare con il PostBack asincrono.

Il controllo contiene un UpdatePanel che deve essere aggiornato dal PostBack asincrono scatenato dal controllo contenuto nel primo UserControl.

Quello che si può fare è esporre la collection del Triggers dell'UpdatePanel, in modo da poterli impostare da chi utilizza il controllo.

Creiamo una proprietà Triggers (di tipo UpdatePanelTriggerCollection) nello UserControl e gli facciamo ritornare la collezione di trigger dell'UpdatePanel.
Per poterla vedere nel design, aggiungiamo gli attributi DesignerSerializationVisibility e PersistenceMode.

DesignerSerializationVisibility permette di specificare la visibilità della proprietà a design-time.

PersistenceMode specifica come la proprietà viene inserita nello UserControl, se tramite attributo o come proprietà interna.
Esempio di Attribute è la proprietà ID="…", o runat="sever" , che vendono specificate come attributi del tag.
Esempio di InnerProperty sono i SelectedParameters, o i Triggers, che devono essere specificati in un elemento contenuto nel tag del controllo, e non come attributi.

   1: [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
   2: [PersistenceMode(PersistenceMode.InnerProperty)]
   3: public UpdatePanelTriggerCollection Triggers
   4: {
   5:     get { return updPanel.Triggers; }
   6: }

La pagina

Inseriamo nella pagina i due UserControl. Come sarà possibile vedere, nel controllo DisplayData (UserControl 2) sarà visibile una proprietà Triggers che ci da la possibilità di inserire un trigger associato al controllo Filters (e che si aggancerà all'evento Command che noi abbiamo esposto).
In questo modo, al click del pulsante contenuto nel UserControl di ricerca, avremo l'aggiornamento asincrono dell'UpdatePanel contenuto nel UserControl DisplayData.

   1: <dtr:Filters ID="filters" runat="server" />
   2: <dtr:DisplayData ID="displayData" runat="server">
   3:   <Triggers>
   4:       <asp:AsyncPostBackTrigger ControlID="filters" EventName="Command" />
   5:   </Triggers>
   6: </dtr:DisplayData>

Ecco quindi che grazie alla possibilità di esporre (e gestire) gli eventi, abbiamo potuto mantenere l'UpdatePanel con UpdateMode a Conditional, permettendo quindi di non far scatenare postback asincroni del tutto inutili.

Tags: , , ,

ASP.NET AJAX | ASP .NET | .NET

MultiHandleSliderExtender in un Templated Control

by Andrea 05 March 2009 05:18

Se provate a utilizzare un MultiHandleSliderExtender all'interno di una GridView, o di un Repeater o di un altro Templated Control, vi capiterà con una bella eccezione javascript (null is null or not an object) in quanto non l'extender non riesce a trovare i controlli impostati come MultiHandleSliderTarget.
Dando un'occhiata al file javascript di questo extender si può notare che il controllo esegue la funzione $get (recupera un elemento all'interno della pagina) usando come parametro l'id inserito, ma che nel caso di inserimento in un Templated Control, questo sarà differente dall'effettivo id utilizzato nella pagina (ClientID), sollevando quindi l'eccezione.

Per risolvere questo è sufficiente gestire l'evento RowDataBound (nel caso della GridView) e sostituire in ogni MultiHandleSliderTarget l'id dei controlli con i rispetti ClientID.

Ecco il codice necessario:

   1: protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
   2: {
   3:     if (e.Row.RowType == DataControlRowType.DataRow)
   4:     {
   5:         MultiHandleSliderExtender slider = e.Row.FindControl("multiHandleSliderExtenderTwo") as MultiHandleSliderExtender;
   6:         foreach (MultiHandleSliderTarget target in slider.MultiHandleSliderTargets)
   7:             target.ControlID = e.Row.FindControl(target.ControlID).ClientID; 
   8:     }
   9: }

Tags: , , , ,

.NET | ASP .NET | ASP.NET AJAX

Utilizzare una pagina dei Dynamic Data in una folder differente

by andrea 16 February 2009 02:17

Può capitare di voler riutilizzare una pagina dei Dynamic Data (al di fuori della cartella dei Dynamic Data), e questo per avere "a gratis" le validazioni dei campi, oppure semplicemente perchè utilizzano dei FiledTemplate custom (su cui magari abbiamo investito parecchio tempo).
Nel mio caso, la necessità è nata dal voler far editare le informazioni della propria Azienda, senza dare accesso all'utente alla lista delle Aziende (percorso che viene normalemente proposto con i Dynamic Data: visualizzazione lista aziende -> dettaglio azienda).

COME FARE?

Per fare ciò è sufficiente copiare la pagina nel nuovo percorso e modificare il Global.asax in modo da aggiungere le regole di routing appropriate:

   1: routes.Add(new DynamicDataRoute("Edit/Company.aspx")
   2: {
   3:     Action = PageAction.Edit,
   4:     Model = model,
   5:     Table = "Companies"
   6: });

All'interno della pagina copiata, si dovranno valorizzare le proprietà EntitySetName e ContextTypeName della EntityDataSource, altrimenti si presenterà il seguente errore:

The control 'DetailsDataSource' does not have a TableName property and a table name could not be inferred from the URL.

Nel caso si utilizzi i Dynamic Data con LINQ to SQL, le proprietà da modificare sono TableName e ContextTypeName della LinqDataSource.

Se la pagina prevede eventuali parametri in querystring, dovranno essere presenti nell'url della pagina, oppure dovrete essere voi a settarli andando ad aggiungere da codice gli appropriati WhereParameters, e cancellando il controllo DynamicQueryStringParameter (contenuto nella datasource).

Technorati Tags: ,

Tags: ,

ASP .NET