Windows Azure & Email! Mai così semplice inviare mail dal cloud

Wed, 25 Jan 2012 15:50:00 GMT Visualizza

ciao a tutti

 

SendGrid è un componente eccezionalmente valido se si realizzano applicativi online (ancor meglio Cloud) che necesitano di inviare Email in quantità

 

per registrarsi (altrimenti è impossibile inviare mails) andate: http://sendgrid.com

 

mentre per scaricare il codice necessario per farlo, andate come sempre su NugGet (http://nuget.codeplex.com/) cercando Sendgrid

image

 

 

un po di codicello:

 

SendGridMail.SendGrid message = SendGridMail.SendGrid.GenerateInstance();
message.AddTo("destinatario@domain.it");
message.From = new System.Net.Mail.MailAddress("mittente@domain.it", "Mario Rossi");
message.Subject = "Test :)";
message.Text = "Ciaooooooooooooooo";

//l'SDK mi genera il client SMTP dal mio account sendgrid
var transport = SendGridMail.Transport.SMTP.GenerateInstance(new System.Net.NetworkCredential("username", "password"), port : SendGridMail.Transport.SMTP.SslPort);


//invia la mail
transport.Deliver(message);

 

e tutto funzionerà Sorriso

Dotnetlombardia @ Intel AppUp Day!

Wed, 25 Jan 2012 12:15:00 GMT Visualizza

Ciao a tutti

 

vi ringrazio per la grande presenza all’Intel AppUp Day, in Intel Italia ad Assago – Milano

 

E’ sempre bello quando un evento community viene seguito da tante persone

Intel poi è un nuovo partner sia della nostra community che del mondo Microsoft grazie anche all’ottimo marketplace che è l’AppUp e questa che era il nostro primo evento insieme non poteva andare meglio di così

 

Oggi Roberto è a Bologna insieme ai nostri amici di DotDot per una seconda tappa dell’AppUp Day! In bocca al lupo!! Sorriso

 

la mia sessione di ieri era sullo sviluppo Windows (Forms e WPF)

Qui trovate i vari esempi (principalmente WPF) per binding, validazione, convertitori, elaborazione asincrona, etc…

 

ci vediamo ai CommunityDays di fine mese Sorriso

a presto

Silverlight SlSvcUtil & StackOverflowException

Mon, 23 Jan 2012 17:27:00 GMT Visualizza

ciao a tutti

 

sfortunatamente slsvcutil (WCF Client-Proxt Generation Utility) per silverlight ha un problema quando la si esegue con una lingua di sistema diversa da EN (come noi italiani che usiamo Windows in inglese con tastiera italiana)

per risolvere, basta creare un file slsvcutil.exe.config da mettere nello stesso path del .exe

in genere: C:\Program Files (x86)\Microsoft SDKs\Silverlight\v4.0\Tools

 

nel file copiare:

<configuration>
  <satelliteassemblies>
    <assembly name="SlSvcUtil, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
  </satelliteassemblies>
</configuration>

ed il gioco è fatto Sorriso

 

a presto

DEV WPF Senior CERCASI–Parma - 40 giorni

Fri, 20 Jan 2012 14:04:00 GMT Visualizza

Ciao

 

mi è stato chiesto di cercare un DEV su WPF con esperienza per un’attività piccola di 40 giorni su Parma

chiunque interessato è pregato di contattarmi ASAP

info@antonioesposito.it

 

grazie Sorriso

Quanto ripaga una certificazione?!?!? Tanto, stando ad un’analisi americana

Wed, 14 Dec 2011 07:47:00 GMT Visualizza

Ciao a tutti

 

ebbene si! le certificazioni ripagano!

Anche se in Italia non tanto come in USA, dove sembra che un DEV certificato si aggiri su cifre da 110.000$ (circa 85.000€) all’anno… comunque non non siamo del tutto da meno a mio modesto parare, l’unica cosa che ci rimane (a noi certificati) è prendere spunto dai confratelli americani, e spingere anche qui da noi affinché l’importanza di una certificazione cresca sempre più!!

 

http://www.networkworld.com/slideshows/2011/112111-survey-it-certifications-lead-to-jobs.html

Nuova UI di Billing per Windows Azure, adesso è davvero semplice tenere sotto controllo i costi

Tue, 13 Dec 2011 18:35:00 GMT Visualizza

Ciao a tutti

le novità su Azure ultimamente sono tantissime, e si susseguono ogni giorno, tra le varie, anche la maschera consuntiva delle spese è stata finalmente aggiornata!

Ricordate quella pagina con una semplice riga azzurra in alto con il vostro abbonamento ed il vostro attuale saldo!!?!?? Scordatevela!!! Sorriso

 

Ecco la nuova:

image

 

per tutti raggiungibile semplicemente con: https://account.windowsazure.com/subscriptions

La semplicità fatta servizio, WCF & Username+Password

Sun, 11 Dec 2011 19:46:00 GMT Visualizza

Ciao a tutti

DEMO

capita ancora di trovare soluzioni di sicurezza custom, dove per custom intendo molto spesso poco sicure, a vantaggio della semplicità

comprendo che chi non ama come me WCF odia il .config Sorriso ma in realtà mettere su un sistema sicuro di messaggistica con username e password gestiti a modo nostro, è tutt’altro che difficile

PASSO 1: creiamo il nostro servizio

a) Creo un nuovo progetto “Empty Web Application” e dentro aggiungo un WCF Service con nome di default Service1

b) sostituisco il DoWork autogenerato con un GetString molto semplice:

IService1:

[OperationContract]
string GetString();

Service1:

public string GetString()
{
    return "Ciao :)";
}

 

a questo punto abbiamo il nostro WCF, dobbiamo aggiungere la sicurezza

PASSO 2: creazione del certificato per instaurare un canale sicuro

a) apro il prompt dei comandi di visual studio, nella sottocartella “Visual Studio Tools” nel menù Start

b) lancio “makecert -r -pe -n "CN=Service1Certificate" -sky exchange -sr LocalMachine –ss My”, dove Service1Certificate è il nome del certificato che gli vogliamo dare

c) per vedere il nostro certificato, posso andare in IIS da pannello di controllo, strumenti di amministrazione, nel centro, sotto il gruppo IIS, troverò il link ServerCertificates, lo apro

image

d) da qui posso fare Export con il click destro per esportare il nostro certificato da poi importare sul server di destinazione sempre da questo pannello di IIS

a questo punto abbiamo il certificato

PASSO 3: Aggiungo il validatore nel progetto.

a) aggiungo il riferimento a System.IdentityModel

b) aggiungo una classe che estende UserNamePasswordValidtor (System.IdentityModel.Selectors) ed implemento la classe astratta aggiungendo il nostro codice al metodo Validate. es stupido:

public override void Validate(string userName, string password)
{
    if (string.IsNullOrEmpty(userName) || string.IsNullOrEmpty(password))
        throw new SecurityTokenException("Username or password not valid!");  //using System.IdentityModel.Tokens
}

a questo punto abbiamo il validatore

 

PASSO 4: Configuro WCF per usare certificato e validatore

Aprendo il web.config, posso configurare entrambe le cose. esempio:

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
          <serviceCredentials>
            <!-- QUI SI SPECIFICA IL CERTIFICATO PER INSTAURARE IL CANALE SICURO-->
            <serviceCertificate findValue="Service1Certificate"
                                storeName="My"
                                storeLocation="LocalMachine"
                                x509FindType="FindBySubjectName"/>
            <!-- QUI SI SPECIFICA CHE VOGLIAMO USARE USERNAME E PASSWORD CON UN NOSTRO VALIDATORE-->
            <userNameAuthentication  userNamePasswordValidationMode="Custom"
                                     customUserNamePasswordValidatorType="UserNamePasswordSimpleService.MyConstomUsernamePasswordValidator, UserNamePasswordSimpleService, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <!-- AGGIUNGO IL NODO SERVICE CON IL NOME DEL NOSTRO SERVIZIO PER CONFIGURARLO-->
      <service name="UserNamePasswordSimpleService.Service1">
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="BindingConfiguration1" contract="UserNamePasswordSimpleService.IService1" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <bindings>
      <wsHttpBinding>
        <!-- CONFIGURO IL BINDING CON L'IMPOSTAZIONE DI SICUREZZA VOLUTA - USERNAME+PASSWORD-->
        <binding name="BindingConfiguration1">
          <security mode="Message">
            <message clientCredentialType="UserName"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
</configuration>

Il gioco è fatto Sorriso

peccato che sul client avremo problemi perchè il certificato è un certificato locale non valido a livello pubblico… quindi, o al posto di generarlo a mano con il “makecert” lo compriamo (anche gratis ad esempio con SmartSSL), oppure dobbiamo disabilitare il check di sicurezza sul client così da poter usare anche io nostro certificato

PASSO 5: Il Client

Basta fare un nuovo progetto Windows o Console, poi click destro sui riferimenti, e click su “Add Service Reference”, li basta selezionare l’url del nostro servizio che vediamo quando andiamo in Debug sul progetto con il servizio, oppure facendo click destro sul servizio (il file .svc) e poi ViewInBrowser.

una volta connesso il client al servizio, la configurazione la farà tutta WCF per noi, a noi servirà solo impostare username e password quando ci connettiamo così:

var c = new ServiceReference1.Service1Client();
c.ClientCredentials.UserName.UserName = "user";
c.ClientCredentials.UserName.Password = "pass";

PASSO 6 [SOLO X CERTIFICATI DI TEST]: disabilito il check di sicurezza sul client per il certificato lato server. Questo l’App.config del client:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="WSHttpBinding_IService1" closeTimeout="00:01:00"
            openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
            bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
            maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
            messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
            allowCookies="false">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
              maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <reliableSession ordered="true" inactivityTimeout="00:10:00"
              enabled="false" />
          <security mode="Message">
            <transport clientCredentialType="Windows" proxyCredentialType="None"
                realm="" />
            <message clientCredentialType="UserName" negotiateServiceCredential="true"
                algorithmSuite="Default" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>

<!-- CONFIGURAZIONE PER DISABILITARE IL CHECK -->

    <behaviors>
      <endpointBehaviors>
        <behavior name="ClientBehavior">
          <clientCredentials>
            <serviceCertificate>
              <authentication revocationMode="NoCheck" certificateValidationMode="None"/>
            </serviceCertificate>
          </clientCredentials>
        </behavior>
      </endpointBehaviors>
    </behaviors>


    <client>
      <!-- CONNETTO LA CONFIGURAZIONE DEL CHECK IMPOSTANDO LA PROPRIETA' behaviorConfiguration-->
      <endpoint address="http://localhost:48844/Service1.svc" binding="wsHttpBinding" behaviorConfiguration="ClientBehavior"
          bindingConfiguration="WSHttpBinding_IService1" contract="ServiceReference1.IService1"
          name="WSHttpBinding_IService1">
        <identity>
          <certificate encodedValue="AwAAAAEAAAAUAAAAU9NakvE/ZBiomn6+liSNuIRH6wYgAAAAAQAAABACAAAwggIMMIIBeaADAgECAhARchX3tGWejUpysWzNI4btMAkGBSsOAwIdBQAwHjEcMBoGA1UEAxMTU2VydmljZTFDZXJ0aWZpY2F0ZTAeFw0xMTEyMTExOTEyMTdaFw0zOTEyMzEyMzU5NTlaMB4xHDAaBgNVBAMTE1NlcnZpY2UxQ2VydGlmaWNhdGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOr3C6g0UBx0YJ+ZoVlZgjun1xjNx1/o5j0dDu/i4arCuT3gcI9R6s6LB8vBDAV6LN6EcenmTM6TcuDDmXqfFZEkRfCDa5KSvfTD5CAiYy6yLbqlSHZte8imzqkuqto433lMUTHmep8EgPVOi5OCv/FFU0xfpP0GIlyqgULGkKM/AgMBAAGjUzBRME8GA1UdAQRIMEaAEJm63aKyQ9abRQoAHtmUEQuhIDAeMRwwGgYDVQQDExNTZXJ2aWNlMUNlcnRpZmljYXRlghARchX3tGWejUpysWzNI4btMAkGBSsOAwIdBQADgYEAPNVgkLYE3XnPlaY/IEfgrnrDx+N/K9uAwT882Ns/LbpPKzEcVh6o74H4efYHnPVeMYbJur435Ga6iElWO+n7Dw7icL1S/YfC3gKvgCzR1upbUUYVilfbuminqOb9ag1s9QFat0OQy/i4psi4aXH86nIAuxDQ8qHESRTNKEcfS60=" />
        </identity>
      </endpoint>
    </client>
  </system.serviceModel>
</configuration>

 

per disabilitare il check, fare copiaincolla della parte in alto contrassegnata (il tag behaviors) e poi aggiungere la parola behaviorConfiguration come segnalato in basso nel proprio app.config senza alterare le altre configurazioni

 

 

per ogni dubbio, contattatemi pure Sorriso

info@antonioesposito.it

 

DEMO

Windows Azure WebRole: quando NetworkService non è sufficiente

Sat, 10 Dec 2011 11:08:00 GMT Visualizza

Ciao a tutti

capita a volte di fare deploy di una applicazione web su Windows Azure, come nel mio caso di HomeFramework e ci si trova a chiedersi: come faccio ad impostare l’AppPool in automatico senza andare in DesktopRemoto su tutte le istanze del mio cloud, andando di fatto a vanificare ogni aspettativa cloud….

Fortunatamente la risposta è abbastanza semplice, ed è nell’assembly Microsoft.Web.Administration che giace sepolta e nascosta in C:\Windows\System32\inetsrv\Microsoft.Web.Administration.dll

 

Una volta aggiunto il semplice riferimento al nostro WebRole, è sufficiente andare in WebRole.cs/vb che automaticamente l’SDK di Windows Azure aggiunge ai nostri WebRole, e scrivere qualcosa come questo:

 

public override bool OnStart()
{
    // To enable the AzureLocalStorageTraceListner, uncomment relevent section in the web.config 
    DiagnosticMonitorConfiguration diagnosticConfig = DiagnosticMonitor.GetDefaultInitialConfiguration();
    diagnosticConfig.Directories.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);
    diagnosticConfig.Directories.DataSources.Add(AzureLocalStorageTraceListener.GetLogDirectory());

    try
    {
        using (ServerManager serverManager = new ServerManager())
        {
            //leggo il nome del mio AppPool
            string appPoolName = serverManager.Sites[RoleEnvironment.CurrentRoleInstance.Id + "_Web"].Applications.First().ApplicationPoolName;
            Log.Verbose("Found AppPool {0}", appPoolName);
            //prendo l'AppPool per poterci fare modifiche
            var appPool = serverManager.ApplicationPools[appPoolName];
            //cambio le credenziali (ovviamente posso anche dargliene di specifiche, ma poi dovrei gestire un dominio cloud...
            appPool.ProcessModel.IdentityType = ProcessModelIdentityType.LocalSystem;
            //salvo
            serverManager.CommitChanges();
            Log.Information("Set AppPool {0} identity at {1}", appPoolName, appPool.ProcessModel.IdentityType);
        }
    }
    catch (Exception ex)
    {
        Log.Error(ex, "Unable to configure AppPool!");
    }

    return base.OnStart();
}

 

questo codice farà si che ad ogni deploy di Windows Azure, automaticamente sarà eseguita questa configurazione, così, quando l’applicazione sarà tirata su da IIS, automaticamente ci troveremo con le credenziali aumentate a (in questo esempio) LocalSystem

ovviamente se ne sconsiglia l’uso se non obbligatorio come nel mio caso ove avevo da creare endpoint dinamici che senza diritti non avrei potuto tirare su in HTTP…..

 

per via della sicurezza di Windows Azure, questo stessso codice non avrebbe i diritti per salvare le modifiche su IIS a meno di andare nel ServiceDefinition.csdef e aggiungere questa riga nel nodo del nostro WebRole:

<WebRole name="XXX" vmsize="XXX" enableNativeCodeExecution="XXX"> //cercare il vostro nodo

<Runtime executionContext="elevated" /> //aggiungere questa riga

 

 

a presto

WCF Home Framework – Finally Cloud

Wed, 07 Dec 2011 11:28:00 GMT Visualizza

Ciao a tutti

 

chi ha seguito il mio blog da tempo, ricorderà questo nome “Home Framework”… così come anche chi è venuto alle mie scorse conferenze come ad esempio l’ultimo WPC in OverNet a Milano/Assago

WCFHF è un framework che ci aiuta a gestire e rilasciare servizi WCF, adesso completamente cloud su Windows Azure e SQL Azure

La sicurezza, la scalabilità, la configurazione, il rilascio, la gestione delle versioni, sono tutte problematiche che WCFHF gestisce per te.

E’ sicuro, perchè il manager è in HTTP/SSL, è sicuro perchè il tuo servizio è utilizzabile esclusivamente da te tramite username e password identiche a quelle del manager, è sicuro perchè il servizio risponde alle chiamate a sua volta in TLS/SSL + Message Security con autenticazione, appunto, username+password.

E’ scalabile perchè il tuo servizio è sul cloud. Gira sempre su più server dietro un bilanciatore che non devi gestire, semplicemente usare

Niente più configurazioni… non hai bisogno di creare un progetto da visual studio per il tuo WCF, niente più .config da gestire, etc…

Niente più rilasci con copia di files, modifiche delle configurazioni, web deploy, etc…. Semplicemente basterà andare sul manager web di WCFHF e fare l’upload del tuo servizio.

Le versioni le gestisce WCFHF, e non c’è limite al numero di versioni contemporanee del tuo servizio online

 

Esempio d’uso. Andiamo su WCFHF: https://homeframework.tnxconsulting.com/Manager/Default.aspx

image

Se non sei ancora registrato, registrati tanto non si paga niente Sorriso

Qui sono presenti i nostri servizi, catalogati per nome e versione. sulla sinistra abbiamo il flag che ci indica se il servizio è attivo (risponde alle chiamate) o no mandando in automatico eventuali chiamate sulla versione subito successivamente disponibile

infine sulla dx abbiamo il link al wsdl. questo ci permette di creare il nostro client come facciamo abitualmente da visual studio o da svcutil

Guida. Creiamo l’HelloService1

1) Apro Visual Studio 2010 con framework 4.0 e creo un progetto di tipo libreria (DLL) in c# o vb

2) Aggiungo i riferimenti a System.Runtime.Serialization e System.Servicemodel.*

3) Creo il contratto di servizio ed il servizio con un’interfaccia ed una classe

[ServiceContract()]
public interface IHelloService1
{
    [OperationContract]
    string GetString();
}

[ServiceBehavior]
public class HelloService1 : IHelloService1
{
    public string GetString()
    {
        return "Hello v 2.0";
    }
}

4) compilo in Release

5) Vado su WCFHF e clicco sulla DX il link upload, scelgo il mio file compilato in .dll e premo ancora Upload

6) Abilito il servizio cliccando sul link con il suo nome, e poi Enable sulla DX

Tornando alla homepage vedrò che il servizio è funzionante Sorriso volendo possiamo cliccare WSDL sulla sua DX per vederne la configurazione

 

Guida. Creiamo un client per utilizzare l’HelloService1.

1) Clicco sul link WSDL sulla DX del servizio che voglio usare, e mi copio l’URL (oppure clicco dx sul link e faccio copia URL)

2) Apro Visual Studio, creo un nuovo progetto o uso uno esistente, copio l’URL del WSDL in “Add Service Reference” come usualmente faccio per connettermi ad un servizio e do un nome leggibile al namespace in basso (opzionale)

image

3) vado nel mio codice e istanzio un nuovo client passandogli le credenziali del mio utente WCFHF

var c = new CloudHelloService.HelloService1Client();
c.ClientCredentials.UserName.UserName = "[USERNAME]";
c.ClientCredentials.UserName.Password = "[PASSWORD]";

4) Uso il mio servizio normalmente

Console.WriteLine(c.GetString());
Console.ReadLine();

A questo punto, non bisogna fare altro Sorriso, a tutta la configurazione, inclusa la sicurezza, ha pensato il WDSL

 

Usatelo e mandatemi ogni feedback possibile a info@antonioesposito.it

Vi consiglio per ogni richiesta su WCF di andare sul forum italiano: http://social.msdn.microsoft.com/Forums/it/wcfwfit/threads

 

Seguiranno ulteriori tutorial e nuove funzionalità come supporto REST, supporto a SilverLight, servizi longrunning, etc… spero il più presto possibile e se non ci si vede prima, ci si vedrà con WCFHF al prossimo HackItaly Sorriso

A presto

Puliamo i nostri files da spazi e quant’altro

Thu, 01 Dec 2011 21:54:00 GMT Visualizza

Ciao a tutti

 

prima di andare a dormire, voglio lasciarvi con un interessante e comodo codicino per ripulire vari files dagli spazi di troppo, ritorni a capo, etc…

pensiamo all’HTML, agli XML, e quant’altro che potremmo voler ripulire

es:

var stringaRipulita = Regex.Replace(<stringa-da-ripulire>,@"\s{2,1000}", "");

 

a presto

Un semplicissimo generatore di codici random, semplici e complessi

Mon, 28 Nov 2011 08:42:00 GMT Visualizza

 

Ciao a tutti

 

spesso capita di avere la necessità di generare un codice alfanumerico da utilizzare per vari scopi: attivazione prodotti, password, etc…

ho scritto un semplice generatore di codici per .NET (vb e c#) che può fare al caso nostro:

 

‘ESEMPIO VB.NET

Dim r As New Random(Now.Millisecond)
Dim stringLen As Integer = 25

Dim complexCode = String.Join("", Enumerable.Range(1, stringLen).Select(Function(x) Encoding.ASCII.GetString(New Byte() {r.Next(33, 126)})))

'0-9 A-Z
Dim simpleCode = String.Join("", Enumerable.Range(1, stringLen).Select(Function(x) Encoding.ASCII.GetString(New Byte() {IIf(r.Next(1, 100) Mod 2 = 0, r.Next(48, 57), r.Next(65, 90))})))

 

//ESEMPIO C#

var r = new Random(DateTime.Now.Millisecond);
var stringLen = 25;
var complexCode = String.Join("", Enumerable.Range(1, stringLen).Select(x =>  Encoding.ASCII.GetString(new [] {Convert.ToByte(r.Next(33, 126))})));

//0-9 A-Z
var simpleCode = String.Join("", Enumerable.Range(1, stringLen).Select(x => Encoding.ASCII.GetString(new [] { r.Next(1, 100) % 2 == 0 ? Convert.ToByte(r.Next(48, 57)) : Convert.ToByte(r.Next(65, 90))})));

Client-Server con ricerca automatica con Ws-discovery

Tue, 15 Nov 2011 08:49:00 GMT Visualizza

ciao

 

DEMO

 

se abbiamo l’esigenza di usare dei servizi con più di un server a disposizione, e non vogliamo conoscere a priori l’URI del server… possiamo usare una tecnologia standard sui servizi SOAP detta WS-Discovery

il client è minimale, cerco il server, lo trovo, creo un proxy, lo chiamo:

//cerco il server
DynamicEndpoint endpoint = new DynamicEndpoint(ContractDescription.GetContract(typeof(Services.IDateTimeService)),
                                    new WSHttpBinding(SecurityMode.None)); //stessa configurazione di sicurezza del server

//creo una factory per generare client
var channel = new ChannelFactory<Services.IDateTimeService>(endpoint);

//creo un client-proxy per chiamarlo
var risp = channel.CreateChannel();


//chiamo

Console.WriteLine(risp.GetServerTime());
Console.ReadLine();

 

il server è semplice, ma richiede un po di configurazione in più nel .config:

 

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="meta">
          <serviceDebug includeExceptionDetailInFaults="true"/>
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDiscovery>
            <announcementEndpoints>
              <endpoint kind="udpAnnouncementEndpoint" />
            </announcementEndpoints>
          </serviceDiscovery>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service name="Server.DateTimeService" behaviorConfiguration="meta">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost/discoverytest"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="unsecure" contract="Server.IDateTimeService"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <endpoint kind="udpDiscoveryEndpoint" endpointConfiguration="adHoc" />
      </service>
    </services>

    <standardEndpoints>
      <udpDiscoveryEndpoint>
        <standardEndpoint name="adHoc" discoveryMode="Adhoc"/>
        <standardEndpoint name="proxy" discoveryMode="Managed"/>
      </udpDiscoveryEndpoint>
    </standardEndpoints>
    <bindings>
      <wsHttpBinding>
        <binding name="unsecure">
          <security mode="None" />
          <!-- rimetti a Message per riabilitare la sicurezza integrata windows se hai i pc in dominio o i nomiutente collimano-->
        </binding>
      </wsHttpBinding>
    </bindings>
  </system.serviceModel>
</configuration>

DEMO

 

a presto

Ricavare o fare la differenza tra due date con fuso orario italiano

Tue, 15 Nov 2011 08:20:00 GMT Visualizza

Ciao a tutti

 

capita a tutti di dover fare una differenza o una somma tra date…. ma non sempre abbiamo la certezza di essere su di un sistema con la culture corretta, e ancora più importante, con il fuso orario correttamente impostato

fortunatamente .NET ci viene incontro, tanto che il famigerato codice si può scrivere semplicemente così:

 

var yourdate = DateTime.Now.AddDays(-1);

//now del fuso orario italiano - funziona con SO in ogni lingua, con ogni culture impostata
var now = TimeZoneInfo.ConvertTimeFromUtc(DateTime.Now.ToUniversalTime(), TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time"));
var ore = (now - yourdate).TotalHours;

 

il codice del “now” è il più importante, è l’unico che ci torna sempre l’ora al fuso orario desiderato… in questo caso italiano Sorriso

 

a presto

iOS5 + iPhone 4S… Due fregature al prezzo di una (900€)

Tue, 08 Nov 2011 21:28:00 GMT Visualizza

Ciao a tutti

 

io ho un iPhone da quando è uscito in Italia…. questo (4S) è il primo iPhone che ho letteralmente sdegnato…

 

anche 3GS era una minor update…. ma nel suo essere minor, era eccezionalmente più performante, e poi le solite cosine che potevi fare solo con l’ultimo arrivato come sempre Apple ci offre… video… bussola… stupidaggini ovviamente….

secondo me avevano recuperato tanto con iPhone4…. case stupendo (vetro e alluminio), display da paura, CPU da paura, flash, fotocamera finalmente al passo con i tempi… software al passo specialmente con iOS4… insomma 1 gran bel telefono… gaffe dell’antenna a parte…. l’ho comprato in prevendita!

Passano i mesi… anzi, 1 anno e mezzo… e che esce?!?!? vediamo…. 200 nuovi update…. ma dove?!?!? io ho iOS5 da quando è uscito, l’unica novità è quell’inutile barra in alto.. mai usata… e adesso ogni cosa a distanza di dito dalla parte superiore dello schermo non tappa più bene perchè l’os deve decidere se tappi x fare qualcosa o se vuoi quella inutile pagina delle notifiche…. ovviamente scopiazzata da android….

se poi ti chiamano… adesso compare la nuova notifica prima ancora di mettere la password x sbloccare il telefono… bello, così ognuno ke trova il mio telefono può chiamare la mia ragazza e pago io!!

poi ancora… Siri… un software comprato da Apple sul suo stesso store (mah) e rivenduto come funzionalità chiave del nuovo OS…. per fare cosa?!?!? ah, riconoscimento vocale intelligente… certo bella idea…. motorola ha il riconoscimento vocale dallo startac…. certo questo è più figo…. e vedi te… sn passati 15 anni! e poi ovviamente si tengono stretti stretti Siri a funzionare solo sul 4S… spacciando x problemi di performance 1 software che prima funzionava anche su 3gs?!?!

ulteriore novità dell’OS (poi passo al 4S) iCloud…. che sarebbe TimeMachine (per rimanere in linguaggio Apple) in versione a noleggio online… e questo me lo chiami servizio cloud?!?! e in che categoria lo inseriamo?!?! TimeMachine_aaS?!?! certo i primi 5 GB sono free… ma se SkyDrive ti da 25GB free, e BPOS 4TB con 8€ al mese?!?!?

e poi…. basta con questo OS completamente bloccato e impersonalizzabile… non succede mai niente.. non puoi fare mai niente…. anche le cartelle di App sn 1 cagata… fanno più disordine che ordine…. diciamoci la verità: 4 anni fa.. era 1 figata.. gli altri usavano ancora i tasti, e noi no. ma oggi, gli altri si connettono in modo nativo a 20 servizi correttamente, e sincronizzatamente, e noi siamo li ancora a dire “ah quanto è bello il mio scroll col dito”

 

torniamo all’iPhone4S

ma dov’è sta novità?!?! dov’è sto iphone migliore di sempre?!?!?

fotocamera 1 po più potente… che novità, mi avessi dato una ottica seria con dei megapixel seri (12, 16, 21) ti capirei….. 8 li hanno tutti… quindi nessuna novità

antenna che funziona…. non commento oltre… se questa è una novità…

dual-core… in ritardo di mesi.. su ipad c’è da tempo… e poi, mi volevi mica dare la stessa CPU??!?!?!

riassumendo: ammazza che novità! dopo 1 anno e mezzo mi vuoi dare lo stesso telefono a 200€ di più??!?!? (900€ il 64GB)

Apple, cara mia, è vero che il tuo marketing è sul design e sulla qualità, ma se photoshop non facesse fotoritocco ma solo il caffè, dubito ke lo comprerebbero a 1500€ quanto costa… e questo vale prima o poi anche x te…

personalmente non amo l’interfaccia Metro perchè troppo fluttuante (mi perdo, vai a destra, poi a sinistra, poi sei tornato indietro… sembra 1 labirinto) e android non lo considero nemmeno un OS (è il più insicuro http://cellulari.bloglive.it/android-e-il-s-o-meno-sicuro-secondo-mcafee-6326.html), quindi eccomi qui a pensare all’anno prossimo se mai comprerò 1 altro iphone (il vero 5?!?!) o se passerò a WP8… certo che se Microsoft continua sulla buona strada, e Apple su questa nuova cattiva strada, la scelta non sarà difficile

 

a presto

I miei primi 1000 punti sul forum MSDN

Fri, 04 Nov 2011 18:37:00 GMT Visualizza

Ciao a tutti

 

mi fa piacere condividere con voi (il mondo) la felicità (certo non è come avere 1 figlio, ma sono sempre soddisfazioni) di aver raggiunto i miei primi 1000 punti sui forum Microsoft Sorriso

http://social.msdn.microsoft.com/profile/antonio%20esposito/?ws=usercard-mini

 

Fare parte di una community così grande è 1 grande opportunità di praticare il vero spirito community: aiutarsi a vicenda, felici di fare le stesse cose tutti insieme, in questo caso programmare, ma anche sui forum TechNet ho fatto le mie buone conoscenze Sorriso

Inoltre il forum MSDN da anche la possibilità a noi piccoli communityari di DotNetLombardia di aiutare il prossimo con consigli vari visto che per scelta non abbiamo forum interni, e devo dire che più volte ho ricevuto commenti molto positivi quando vuoi per la mia firma che porta il link a DNL, o vuoi per il link diretto ad un mio (o di un collega DNL) blog-post, i vari navigatori del forum MSDN si sono trovati a navigare per la prima volta le acque di DNL, felici di trovare di che leggere o di che farsi 2 risate Sorriso

 

grazie a tutti quelli che ci leggono, scrivono, supportano, seguono, e anche a quei pochi che mi hanno sopportato sul forum MSDN, navigatori, e postatori

a presto