<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>MISC</title>
        <link>http://blogs.ugidotnet.org/martinobordin/category/MISC.aspx</link>
        <description>Misc stuff that are usefull to know</description>
        <language>it</language>
        <copyright>Martino Bordin</copyright>
        <generator>Subtext Version 2.6.0.0</generator>
        <item>
            <title>Creare servizi Windows con Topshelf</title>
            <link>http://blogs.ugidotnet.org/martinobordin/archive/2015/10/20/creare-servizi-windows-con-topshelf.aspx</link>
            <description>Da un pò di tempo, quando devo creare un Windows Service, utilizzo la libreria Topshelf, che permette di sviluppare una normale applicazione console e, una volta impostate le opportune configurazioni mediante sintassi fluent, installarla facilmente come windows service, senza tool esterni quali installutil.  Un’applicazione console, oltre ad essere più facile da debuggare, è anche eseguibile direttamente (a differenza di un windows service).  Vediamo quindi come creare un servizio.  1) Apriamo Visual Studio e selezionamo il progetto di tipo “Applicazione console”


     2) Creiamo una nuova classe che esponga 2 metodi che verranno chiamati allo start e allo stop del servizio  internal class MyConsoleService 
    { 
        public void Start() 
        { 
            System.IO.File.AppendAllText("MyConsoleService.text", string.Format("MyConsoleService start {0}{1}", DateTime.Now, Environment.NewLine)); 
        }

        public void Stop() 
        { 
            System.IO.File.AppendAllText("MyConsoleService.text", string.Format("MyConsoleService start {0}{1}", DateTime.Now, Environment.NewLine)); 
        } 
    }

 

3) Nel metodo Main della classe Program, andiamo a definire i parametri di configurazione del nostro servizio (vi rimando alla documentazione per la spiegazione dettagliata)

class Program 
    { 
        static void Main(string[] args) 
        { 
            HostFactory.Run(hostConfigurator =&amp;gt; 
            { 
                hostConfigurator.Service&amp;lt;MyConsoleService&amp;gt;(serviceConfigurator =&amp;gt; 
                { 
                    serviceConfigurator.ConstructUsing(() =&amp;gt; new MyConsoleService()); 
                    serviceConfigurator.WhenStarted(service =&amp;gt; service.Start()); 
                    serviceConfigurator.WhenStopped(service =&amp;gt; service.Stop()); 
                });

                hostConfigurator.RunAsNetworkService(); 

                hostConfigurator.StartAutomatically(); // Autostart del Servizio

                hostConfigurator.SetDisplayName("MyConsoleApp Service"); // Nome visualizzato nell'elenco servizi di services.msc 
                hostConfigurator.SetDescription("Servizio creato utilizzando Topshelf"); //  Descrizione visualizzata nell'elenco servizi di services.msc 
                hostConfigurator.SetServiceName("MyConsoleAppService"); // Nome del servizio 
            }); 
        } 
    }

4) Per installare il servizio lanciamo l’exe con il parametro install (digitare il parametro help per vedere l’elenco completo dei comandi)




 

5) Apriamo la console dei servizi di WIndows e verifichiamo la corretta installazione del servizio




 

6) Avviamo il servizio e controlliamo la creazione del file




 

Come potete vedere Topshelf è molto versatile quanto poco invasivo (solo il passo 3 è relativo alla configurazione dell’infastruttura).

Dategli un’occhiata e dimenticherete presto come si crea un windows service, il relativo installer e il tool installutil.&lt;img src="http://blogs.ugidotnet.org/martinobordin/aggbug/102057.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martino Bordin</dc:creator>
            <guid>http://blogs.ugidotnet.org/martinobordin/archive/2015/10/20/creare-servizi-windows-con-topshelf.aspx</guid>
            <pubDate>Tue, 20 Oct 2015 11:53:19 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/martinobordin/archive/2015/10/20/creare-servizi-windows-con-topshelf.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/martinobordin/comments/commentRss/102057.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/martinobordin/services/trackbacks/102057.aspx</trackback:ping>
        </item>
        <item>
            <title>Manipolazione di file zip con il framework 4.5</title>
            <link>http://blogs.ugidotnet.org/martinobordin/archive/2012/08/23/manipolazione-di-file-zip-con-il-framework-4.5.aspx</link>
            <description>Dalla versione 4.5 del .NET framework è finalmente supportata out-of-the-box la manipolazione di file zip senza l'utilizzo di librerie di terze parti.
Sono ora disponibili infatti 2 assembly System.IO.Compression e System.IO.Compression.FileSystem che permettono, ad esempio, di enumerare i file presenti in uno zip, estrarli, creare nuovi file zip, etc.
Ad esempio, ecco come si ottiene l'elenco dei file contenuti in uno zip:
  const string zipFilePath = @"C:\temp\files.zip";

    using (FileStream zipFileToOpen = new FileStream(zipFilePath, FileMode.Open)){
    using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Read)) {

        foreach (var zipArchiveEntry in archive.Entries) {
            Console.WriteLine("File name: {0}", zipArchiveEntry.FullName);}
    }}

E come si estraggono in una directory:
const string zipFilePath = @"C:\temp\files.zip";
    const string dirToExtract = @"C:\temp\";

    using (FileStream zipFileToOpen = new FileStream(zipFilePath, FileMode.Open)) {
    using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Update))
        archive.ExtractToDirectory(dirToExtract);}}

Vi lascio quindi i riferimenti di MSDN:
ZipArchive Class
System.IO.Compression
 
 &lt;img src="http://blogs.ugidotnet.org/martinobordin/aggbug/101170.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martino Bordin</dc:creator>
            <guid>http://blogs.ugidotnet.org/martinobordin/archive/2012/08/23/manipolazione-di-file-zip-con-il-framework-4.5.aspx</guid>
            <pubDate>Thu, 23 Aug 2012 11:38:09 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/martinobordin/archive/2012/08/23/manipolazione-di-file-zip-con-il-framework-4.5.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/martinobordin/comments/commentRss/101170.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/martinobordin/services/trackbacks/101170.aspx</trackback:ping>
        </item>
        <item>
            <title>iCalendar: occhio all&amp;rsquo;encoding del file!</title>
            <link>http://blogs.ugidotnet.org/martinobordin/archive/2011/12/12/icalendar-occhio-allrsquoencoding-del-file.aspx</link>
            <description>Recentemente ho avuto la necessità di produrre file iCalendar in maniera tale da poter condividere gli appuntamenti inseriti da un'applicazione client con dispositivi mobile. 
Ovviamente ho cercato se esiste già qualche libreria e mi son imbattuto in DDay.iCal che, nonostante sia ancora in RC, fa il suo sporco lavoro (mal che vada, il codice sorgente è online, assieme alle specifiche RFC 5545). 
Ho quindi creato un servizio WCF per generare il file in memoria e restituirlo al client...fin qua niente di particolare, il file viene creato e posso importarlo correttamente su Outlook. 
Provo quindi a sottoscrivere il calendario con Google Calendar ed iPhone (i dispositivi target per questa funzionalità)..niente..non si vede nessun appuntamento e non ho alcun errore che mi dia qualche info al riguardo.
Confrontando con WinMerge il file esportato da Google Calendar (che veniva correttamente importato) e il "mio" non noto particolari differenze e addirittura "copincollando" il contenuto del file di Google Calendar, il mio file non veniva importato correttamente. A questo punto il problema era chiaro: la codifica del file.
Il file veniva infatti restituito codificato in UTF-8, ma sembra che non venga digerito bene da alcuni client (tra cui appunto Google Calendar e iPhone).
Cambiando la codifica in Windows 1252 funziona tutto correttamente.
Se vi capita, siete avvisati!&lt;img src="http://blogs.ugidotnet.org/martinobordin/aggbug/100598.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martino Bordin</dc:creator>
            <guid>http://blogs.ugidotnet.org/martinobordin/archive/2011/12/12/icalendar-occhio-allrsquoencoding-del-file.aspx</guid>
            <pubDate>Mon, 12 Dec 2011 01:00:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/martinobordin/archive/2011/12/12/icalendar-occhio-allrsquoencoding-del-file.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/martinobordin/comments/commentRss/100598.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/martinobordin/services/trackbacks/100598.aspx</trackback:ping>
        </item>
        <item>
            <title>Eccezioni con messaggi di errore localizzati</title>
            <link>http://blogs.ugidotnet.org/martinobordin/archive/2010/12/30/eccezioni-con-messaggi-di-errore-localizzati.aspx</link>
            <description>Le eccezioni in .NET sono oggetti che espongono diverse informazioni riguardo l’errore verificatosi, quali StackTrace, Source e soprattutto Message.  Vi sarà capitato di cercare, usando il vostro motore di ricerca preferito, maggiori informazioni su di un determinato tipo di errore.   Molto probabilmente le keywords che avete utilizzato sono il tipo dell’eccezione ed il relativo messaggio.  Se quest’ultimo si presenta nella versione localizzata  in italiano, però, difficilmente avrete ottenuto risultati della ricerca soddisfacenti.  Il sito http://finderr.net ci aiuta a risparmiare tempo elencando tutti i messaggi di errore del Framework (ma anche di Windows e SQL Server) in varie lingue (tra cui l’italiano) e il messaggio originale in lingua inglese.  Non so voi, ma avrei preferito che non avessero tradotto i messaggi di errore..uno sforzo in più per Microsoft nel mostrare messaggi sensati e uno sforzo in più per noi nel cercare la soluzione nei forum, blog o su MSDN.&lt;img src="http://blogs.ugidotnet.org/martinobordin/aggbug/99587.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martino Bordin</dc:creator>
            <guid>http://blogs.ugidotnet.org/martinobordin/archive/2010/12/30/eccezioni-con-messaggi-di-errore-localizzati.aspx</guid>
            <pubDate>Thu, 30 Dec 2010 02:15:03 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/martinobordin/archive/2010/12/30/eccezioni-con-messaggi-di-errore-localizzati.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/martinobordin/comments/commentRss/99587.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/martinobordin/services/trackbacks/99587.aspx</trackback:ping>
        </item>
        <item>
            <title>Una segnalazione errori zelante..</title>
            <link>http://blogs.ugidotnet.org/martinobordin/archive/2010/11/19/una-segnalazione-errori-zelante.aspx</link>
            <description>Forse un po' troppo…!!     &lt;img src="http://blogs.ugidotnet.org/martinobordin/aggbug/99497.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martino Bordin</dc:creator>
            <guid>http://blogs.ugidotnet.org/martinobordin/archive/2010/11/19/una-segnalazione-errori-zelante.aspx</guid>
            <pubDate>Fri, 19 Nov 2010 00:27:38 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/martinobordin/archive/2010/11/19/una-segnalazione-errori-zelante.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/martinobordin/comments/commentRss/99497.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/martinobordin/services/trackbacks/99497.aspx</trackback:ping>
        </item>
        <item>
            <title>Aggiungere statistiche Google Analytics al blog SubText</title>
            <link>http://blogs.ugidotnet.org/martinobordin/archive/2010/09/17/aggiungere-statistiche-google-analytics-al-blog-subtext.aspx</link>
            <description>Per aggiungere le statistiche fornite dal servizio Google Analytics sul vosto blog SubText basta autenticarsi come amministratore e nella scheda 'Options' trovate 'Sitewide Tracking code'. 
In questa casella di testo basta inserire lo snippet Javascript fornito dal servizio di Google et-voilà..avrete tutte le statistiche  possibili ed immaginabili riguardo il vostro blog!


&lt;img src="http://blogs.ugidotnet.org/martinobordin/aggbug/99219.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martino Bordin</dc:creator>
            <guid>http://blogs.ugidotnet.org/martinobordin/archive/2010/09/17/aggiungere-statistiche-google-analytics-al-blog-subtext.aspx</guid>
            <pubDate>Fri, 17 Sep 2010 14:07:37 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/martinobordin/archive/2010/09/17/aggiungere-statistiche-google-analytics-al-blog-subtext.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/martinobordin/comments/commentRss/99219.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/martinobordin/services/trackbacks/99219.aspx</trackback:ping>
        </item>
    </channel>
</rss>