Ciao a tutti,
durante lo sviluppo di un applicazione Web, mi sono imbattuto in un errore generato da un componente esterno, la famosa BusyBoxDotNet, l'errore mi segnalava l'impossibilità di creare l'oggetto definito per la mancanza del file di risorse, errore molto strano, anche perchè non mi era mai capitato, e inoltre avendo seguito alla lettera i passi di configurazione riportati sul sito del componente non riuscivo a capire perchè non dovesse funzionarmi :)
La cosa strana è che con IIS 6 il tutto funzionava....quindi documentandomi sul nuovo IIS 7 qua e la.....ho scoperto l'arcano, infatti IIS 7 non digerisce bene alcuni HttpHandler custom e quindi si è costretti a fare un piccolo trucchetto nel web.config :
<system.webServer>
<handlers>
<add name="MyCustomHanlder" path="/mypage/mypage*.aspx" verb="*" type="MyHanlder.CustomHttpHanlder" resourceType="Unspecified" preCondition="integratedMode" />
</handlers>
<system.webServer>
In questo modo il nostro HttpHandler tornerà a funzionare anche su
IIS 7 !
Ciao a tutti,
ultimamente dai clienti è molto frequente la richiesta di poter esportare i maniera "automatica" i dati visualizzati in pagine ASPX tramite una GridView direttamente in un file Excel.
Come molti sapranno esiste un metodo semplice utilizzando Reporting Service, il quale con alcuni semplici passi ti permette di creare un template Report dove poter esportare i tuoi dati, ovviamente per poter utilizzare questo metodo si è obbligati ad avere un'installazione di Reporting Server.
Bene, leggendomi un pò di documentazione qua e la su internet, sono riuscito a fare una esportazione automatica, dei dati senza utilizzare Reporting Service, di seguito il codice :
-
DataTable dt = myDataTable;//ipotizzate di portare tutta la GridView in un DataTable
- string attachment = "attachment; filename=EsportamyDataTable.xls";
- Response.ClearContent(); //svuoatiamo il buffer della response
- Response.AddHeader("content-disposition", attachment);
- Response.ContentType = "application/vnd.ms-excel";
- string tab = "";
- foreach (DataColumn dc in dt.Columns){
- <Response.Write(tab + dc.ColumnName);
- tab = "\t";}
- Response.Write("\n");
- int i;
- foreach (DataRow dr in dt.Rows){
- tab = "";
- for (i = 0; i < dt.Columns.Count; i++){
- Response.Write(tab + dr[i].ToString()); tab = "\t"; }
- Response.Write("\n"); }
- Response.End();
con queste semplice istruzioni, riuscirete ad esportare i dati in un file Excel, che potrete salvare su disco o aprire direttamente da Browser.
Per un cliente mi è stato richiesto di implementare un “HTTPHandler” custom in C#, che effettui l’intercettamento delle richieste delle pagine web chiamate, e fino a qui nessun problemea :)
La difficoltà, è che questo custom Handler, si dovrebbe integrare con SharePoint 2010 :)
Quindi la classe deve essere compilata e buildata con uno strong name se messa in GAC, oppure copiata nella cartella Bin del nostro SharePoint,
infine da IIS 7 bisogna configurare la parte Handler Mappings, dove deve essere esplicitata la tipologia di pagine da intercettare (es.: *.aspx, *.asp,...), la classe registrata da utilizzare (es.: HttpHandler.dll) e il nome da visualizzare.
E’ possibile inoltre specificare il tipo di verbi da intercettare (GET & POST) e anche il tipo di accesso che dovrà avere il gestore (di default questa impostazione è Scripts).
Sicuramente molti di voi si staranno chiedendo dove sta la difficoltà??? :)
Semplice, come sapete le pagine di SharePoint non sono fisiche, cioè su filesystem, ma bensì virtuali , e quindi come fare per elaborare la pagina virtuale chiamata???
dopo ore di ricerca su santo google è emerso che esiste una funzione dedicata all'elaborazione delle pagine virtuali e non solo :) :
http://msdn.microsoft.com/en-us/library/system.web.compilation.buildmanager.createinstancefromvirtualpath.aspx
Dalla versione 2.0 del framework .Net è possibile utillizare dei delegati anonimi senza bisogno di dichiararli, di seguito è riportato un piccolo esempio di delegate anonmio utilizzato per aggiornare un oggetto label in MultiThread :
lblProgressInfo.Invoke((MethodInvoker)(() => lblProgressInfo.Text=string.Format("Ciao Mondo!")));
In questo modo, più thread possono accedere all'oggetto label contemporaneamente e aggiornarlo senza provocare errori di Cross-Thread durante l'accesso alla label.
Inoltre nell'esempio sopra è stata utilizzato del codice inline (detto lambda expression) ovvero tutto il codice dichiarato su una riga.
Riferimenti :