mercoledì 17 aprile 2013

POST WebRequest e Content-Type


C# 2.0

Dovevo effettuare una richiesta POST ad un Url passando alcuni parametri e per far questo ho utilizzato le seguenti righe di codice:

string url = "http://pippo.it/api";

WSSEDigest wsseDigest = new WSSEDigest();
string token = wsseDigest.GetPasswordDigestAsBase64(userName, password);

HttpWebRequest webReq = (HttpWebRequestWebRequest.Create(url);
webReq.Method = "POST";
webReq.Headers["X-WSSE"] = token;
webReq.ContentType = "application/x-www-form-urlencoded";

ASCIIEncoding encoding = new ASCIIEncoding();
byte[] data = encoding.GetBytes(uriRequestBurn.Parameters);
Stream requestParametersStream = webReq.GetRequestStream();
requestParametersStream.Write(data, 0, data.Length);
requestParametersStream.Close();

try
{
    HttpWebResponse webResp = (HttpWebResponse) webReq.GetResponse();
    Stream answer = webResp.GetResponseStream();
    StreamReader answerReader = new StreamReader(answer);
    string responseContent = answerReader.ReadToEnd();
}
catch (WebException ex)
{
    Stream answer = ex.Response.GetResponseStream();
    StreamReader answerReader = new StreamReader(answer);
    string message = ex.Message;
    string responseContent = answerReader.ReadToEnd();                       
}

Inizialmente non specificavo il content-type ed avevo la seguente anomalia: per alcune chiamate tutto andava bene per altre invece mi ritornava sempre una Web Eception, anche analizzando il flusso dati con Fiddler tutto mi sembrava corretto, i parametri  sembravano sempre valorizzati allo stesso modo, peccato però che dalla parte del servizio arrivasse, in questo caso, sempre un array vuoto.

Alla fine grazie al Plug-In Poster di Firefox sono riuscito a capire che il problema stava nel Content-Type.

venerdì 14 dicembre 2012

Come recuperare una particolare sezione del web.config

C# 4.0

Ogni volta che devo leggere una particolare sezione del file di configurazione web.config devo sempre effettuare varie ricerche su google, a questo punto per evitarmi ed evitare (eventualmente) a qualcun altro questo tipo di ricerca ecco qualche utile consiglio.
Questa la sezione del web.config interessata ed evidenziato in giallo il valore da recuperare:

<configuration>
  
  <applicationSettings>   
    <Importer.RestService.Properties.Settings>
      <setting name="Importer.RestService_ImporterService_WsImporter" serializeAs="String">
        <value>http://192.168.1.108/Importer.Services/Importer.asmx</value>
      </setting>
    </Importer.RestService.Properties.Settings>
  </applicationSettings>
</configuration>

Questo il codice che ho utilizzato:
Configuration config = WebConfigurationManager.OpenWebConfiguration("~");

ApplicationSettingsGroup applicationSettingsGroup = (ApplicationSettingsGroup) config.GetSectionGroup("applicationSettings");

ClientSettingsSection clientSettingsSection = (ClientSettingsSection)        applicationSettingsGroup.Sections["Importer.RestService.Properties.Settings"];
                   
SettingElement settingElement =                           clientSettingsSection.Settings.Get("Importer.RestService_ImporterService_WsImporter");

string url = settingElement.Value.ValueXml.FirstChild.Value;


mercoledì 19 settembre 2012

Deframmentazione degli indici (SQL Server)

SQL Server 2005

Alcuni problemi di query time-out possono essere riconducibili ad una alta frammentazione degli indici del database: una frammentazione superiore al 50% può causare un sensibile calo delle prestazioni.
Per capire se gli indici sono frammentati e poi ricostruirli, eseguire i passi sotto elencati:

-- Per visualizzare la frammentazione degli indici del db
SELECT OBJECT_NAME(OBJECT_ID), index_id,index_type_desc,index_level,
      avg_fragmentation_in_percent,avg_page_space_used_in_percent,page_count
FROM sys.dm_db_index_physical_stats
(DB_ID(N'OrangeFidelity'), NULL, NULL, NULL , 'SAMPLED')
ORDER BY avg_fragmentation_in_percent DESC

-- Per una query più specifica che comprenda il nome delle tabelle presenti nel db in esame


SELECT OBJECT_NAME(a.OBJECT_ID) Tabella, index_id,index_type_desc,index_level,
      avg_fragmentation_in_percent,avg_page_space_used_in_percent,page_count
FROM sys.dm_db_index_physical_stats
(DB_ID(N'OrangeServer'), NULL, NULL, NULL , 'SAMPLED') a INNER JOIN sys.objects b  on a.object_id = b.object_id
WHERE b.type_desc = 'USER_TABLE'
ORDER BY Tabella, avg_fragmentation_in_percent DESC


-- ESEGUIRE PRIMA UN BACKUP !!! ---

-- Ricostruisce gli indici della tabella DocumentReference in OrangeFidelity
USE OrangeFidelity
ALTER INDEX ALL ON DocumentReference
REBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON,
              STATISTICS_NORECOMPUTE = ON);

-- Ricostruisce gli indici della tabella FidelityHandling in OrangeFidelity
USE OrangeFidelity
ALTER INDEX ALL ON FidelityHandling
REBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON,
              STATISTICS_NORECOMPUTE = ON);

Naturalmente queste istruzioni possono essere eseguite per tutte le tabelle dei vari db.

Maggiori informazioni su SQL SERVER – Fragmentation  

Credits: grazie anche al prezioso "intuito informatico" del mitico Giò ;-)

venerdì 3 agosto 2012

Usare Fiddler2 con localhost


Windows 7 64 bit
Ci sono diversi modi per analizzare con Fiddler2 le chiamate fatte su localhost, a questo indirizzo http://stackoverflow.com/questions/826134/how-to-display-localhost-traffic-in-fiddler-while-debugging-an-asp-net-applicati se ne possono trovare alcuni. Stranamente però nessuno di questi metodi funzionava nel mio pc.

Alla fine tra le opzioni di Fiddler2 ho notato questa dialog box

Così nel mio codice c#, utilizzando CodeScales (http://www.codescales.com/) come HTTP client ho aggiunto la seguente riga evidenziata in giallo:
HttpClient client = new HttpClient();
HttpPost postMethod = new HttpPost(new Uri("http://localhost:52056/api/prototype"));
client.Proxy = new Uri("http://127.0.0.1:8888");

ed in questo modo sono riuscito a fare un capture della mia chiamata verso un servizio REST.

venerdì 11 maggio 2012

VMWare Player Setup e Windows 7 64 bit

Dovevo installare VMWare Player nel mio pc con Windows 7 a 64 bit. Ma non appena eseguivo il setup compariva una finestra grigia e dopo un po’ l’applicazione andava in hang up.
Dopo diversi tentativi e cercando in rete (http://communities.vmware.com/thread/291034) ho scoperto che bisognava modificare il registry di windows, eh si … siamo nel 2012 e bisogna ancora metter mano nel registro di windows e questo perché uno degli aggiornamenti di Microsoft modificano le impostazioni di zona di Internet nel Registro di sistema, ed è per questo che Javascript non è più chiamato dalle applicazioni.

Detto questo si deve aprire l'editor del registro

>>> (Start> Esegui> Regedit.exe)

e cercare la voce

>>> HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Internet Settings \ Zones \

Ci dovrebbero essere alcune cartelle 0, 1, 2, 3 e 4. Nel mio caso c’era una cartella denominata "L" prima dello 0.
Se c’è questa cartella "L" si deve eliminarla e riavviare il sistema.

Successivamente il programma di installazione dovrebbe funzionare correttamente.

lunedì 28 novembre 2011

Silverlight - Simulazione navigazione dati (stile Access)

Silverlight 4.0

Nella mia applicazione avevo la necessità di navigare tra i dati di una child window, stile Access tanto per intenderci.

Questa la view in questione, che ha il compito di gestire i Cespiti in carico.



Al loaded della view viene eseguito il binding dell’oggetto Cespite recuperato tramite un servizio WCF RIA Service. Nel mio caso il DocumentContext è il contesto al servizio che gestisce tutto il documento: ritenute d’acconto, ratei/risconti e cespiti compresi.
readonly DocumentoContext _documentoContext;

Cespite cespite = _documento.Cespite.Count > 0 ? _documento.Cespite.FirstOrDefault()
                                                : new Cespite();

if (_documento.Cespite.Count == 0)
   _documento.Cespite.Add(cespite);

LayoutRoot.DataContext = cespite;

A seconda se ne esistono già viene caricato il primo della lista o ne viene creato uno nuovo (in questo modo poi possiamo fare a meno del pulsante Nuovo nella toolbar).
Per passare quindi al cespite successivo o crearne uno di nuovo basta premere il pulsante con la freccia verso destra, al quale è associato il seguente evento:

private void NextCespiteClicked(object sender, MouseButtonEventArgs e)
{
      _index += 1;

      if (_index > _documentoContext.Cespites.Count - 1)
      {
          // Non ci sono cespiti, ne viene aggiunto quindi uno al contesto.
          Cespite cespite = new Cespite();
          _documento.Cespite.Add(cespite);

         // Binding del cespite appena creato alla view
         LayoutRoot.DataContext = cespite;
     }
     Else
         // Viene eseguito il binding del cespite dell'indice corrispondente.
         LayoutRoot.DataContext = _documentoContext.Cespites.ElementAt(_index);
}

Invece per andare all’elemento precedente basta premere il pulsante con la freccia verso sinistra al quale è associate il seguente evento:

private void PreviousCespiteClicked(object sender, MouseButtonEventArgs e)
{        
     if(_index >= 1)
     {
          _index -= 1;
          LayoutRoot.DataContext = _documentoContext.Cespites.ElementAt(_index);
     }
}

Chiaramente è un meccanismo alquanto semplice, abbastanza efficace, che può essere esteso a proprio piacimento.

giovedì 6 ottobre 2011

IIS 7.0 Manager Tool - "The server is not accepting remote connections"


IIS 7.0 Manager Tool

Collegandomi  ad un sito remoto tramite il tool IIS Manager ottengo il seguente messaggio d’errore: “The server is not accepting remote connections”



Ho risolto disabilitando il flag “Utilizza un server proxy per le connessione LAN” tra la opzioni di Internet Explorer – Connessioni – Impostazioni LAN