martedì 9 agosto 2011

Silverlight 4.0 & IIS 7.5

Silverlight 4.0 (C#) & IIS 7.5

Pubblicando una Silverlight Business Application su IIS e richiamando la pagina di default dell’applicazione stessa http://localhost/BusinessApplication.Web/#/Home si ottiene il seguente messaggio d’errore: "Operazione Load non riuscita per la query 'GetUser'. Errore del server remoto: NotFound."



Il suddetto errore è stato risolto disabilitando l’autenticazione Windows su IIS.









martedì 2 agosto 2011

Web Services & SSL

C# 2.0 & IIS 7.5

Si vuole richiamare da un’applicazione client un metodo di un servizio web in modalità SSL (Secure Socket Layer) ed inoltre si vogliono nascondere i parametri del suddetto web method.
Si dà per assunto l’installazione del certificato nel server.

1.       Richiamare un metodo web in modalità SSL da un’applicazione client :

// Viene istanziato l’oggetto che si riferisce al web service
            DocumentHistory d = new DocumentHistory();
 
NetworkCredential networkCredential = new NetworkCredential("ciccio", "pasticcio");
       d.Credentials = networkCredential;

       ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

       // Viene invocato il metodo richiesto
            object[] r = d.DepartmentReport("??", "??”, “!!”);

Da tenere presente quindi che se viene omessa la riga di codice evidenziata in giallo si verifica la seguente web exception:
 
“Connessione sottostante chiusa: Impossibile stabilire una relazione di trust per il canale sicuro SSL/TLS..”


2.  Per nascondere i parametri del metodo web si deve aggiungere il seguente elemento nel web.config del servizio web, all’interno dell’elemento <system.web>:

<system.web>
               <webServices>
              <protocols>
                <remove name="HttpPostLocalhost"/>
              </protocols>
            </webServices>
            </system.web>

venerdì 27 maggio 2011

Telerik - Assegnare un DataSource ad un subReport

C# 4.0

In un report generato con un controllo Telerik (Reporting Q3 2010), oltre alla testata c’è il dettaglio in quale è “binding” ad un oggetto .NET. Si deve quindi passare il valore di tale oggetto a run-time prima del rendering del report.
Il report principale si chiama “Invoice” ed il dettaglio è costituito dal subReport “InvoiceDetail” il quale ha come DataSource l’ObjectDataSource: DocumentDetail.
DocumentDetail è quindi un oggetto le cui proprietà vanno a definire il dettaglio del report per esempio il controllo TextBox con il codice del prodotto ha il seguente Value:  “ =Fields.ItemCode”

Resta quindi da assegnare il DataSource al sub Report:

DocumentViewer documentViewer = new DocumentViewer(); // Visualizzatore del report

Invoice invoice = new Invoice {DataSource = DocHeader}; // Report principale con il suo DataSource

SubReport subReportInvoiceDetail = (SubReport)invoice.Items[0].Items[0]; // Elemento del report principale contenente il sub report con il dettaglio
 
subReportInvoiceDetail.ReportSource.DataSource = DocumentDetails; // Oggetto con i dettagli del documento, assegnato al data source del sub report.

documentViewer.rptInvoice.Report = invoice;
documentViewer.Show();

venerdì 18 febbraio 2011

LINQ to Entities - Sono supportati solo costruttori e inizializzatori senza parametri

C# 4.0
Nella seguente query LINQ l’ordinamento si basa sul campo db di tipo “stringa” quindi un ordinamento errato perché 1.0.0.11 come stringa precede 1.0.0.9:
                    var query = from c in dc.Customer
                         join cp in dc.CustomerPackage
                             on c.Id equals cp.IdCustomer
                         join p in dc.Package
                             on cp.IdPackage equals p.Id
                         where c.Code == customerCode
                               && c.ChainCode == chainCode
                               && c.StoreCode == storeCode
                               && cp.DownloadDate == null
                         orderby p.Version
                         select p;
Così generava l’eccezione “Sono supportati solo costruttori e inizializzatori senza parametri”:
                    var query = from c in dc.Customer
                         join cp in dc.CustomerPackage
                             on c.Id equals cp.IdCustomer
                         join p in dc.Package
                             on cp.IdPackage equals p.Id
                         where c.Code == customerCode
                               && c.ChainCode == chainCode
                               && c.StoreCode == storeCode
                               && cp.DownloadDate == null
                         orderby new Version(p.Version)
                         select p;
Così generava sempre l’eccezione
                    var query = (from c in dc.Customer
                        join cp in dc.CustomerPackage
                            on c.Id equals cp.IdCustomer
                        join p in dc.Package
                            on cp.IdPackage equals p.Id
                        where c.Code == customerCode
                              && c.ChainCode == chainCode
                              && c.StoreCode == storeCode
                              && cp.DownloadDate == null
                         select p).OrderBy(p => new Version(p.Version));
Così invece funziona perché passando per il metodo ToList() credo che l’OrderBy lo faccia attraverso la collezione di oggetti e non più attraverso la query entity
                    var query =
                        (from c in dc.Customer
                         join cp in dc.CustomerPackage
                             on c.Id equals cp.IdCustomer
                         join p in dc.Package
                             on cp.IdPackage equals p.Id
                         where c.Code == customerCode
                               && c.ChainCode == chainCode
                               && c.StoreCode == storeCode
                               && cp.DownloadDate == null
                         select p).ToList().OrderBy(p => new Version(p.Version));

Per questa segnalazione va un particolare ringraziamento a Giovanni Canacci, detto anche Giò.

giovedì 27 gennaio 2011

VS 2010 - SQL Express 2005 (Errore nella visualizzazione degli script SQL)

VS 2010 ITA e SQL Express 2005 ITA su Windows 7 64 bit
Dopo aver installato VS 2010 non si riescono a visualizzare gli script SQL (.sql) dall’IDE di Visual Studio 2010; compare il seguente messaggio d’errore:
Bisogna quindi  rieseguire i seguenti setup, presenti nella cartella del dvd di installazione di VS 2010 ..\WCU\DAC:
DACFramework _ita.msi
DACProjectSystemSteup_ita.msi
TSqlLanguageService_ita.msi

lunedì 10 gennaio 2011

WPF - ListView - GridViewColumn formatting

C# 4.0
In una ListView si deve formattare la colonna contenente un importo, in modo tale che in visualizzazione questi valori siano allineati a destra e con la formattazione in valuta prevista dal sistema operativo.
Si deve quindi creare un data  template specifico in questo modo (siamo nello XAML di una view WPF)
<Window.Resources>
       
        <Style TargetType="ListViewItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
        </Style>
        <DataTemplate x:Key="amount">
            <TextBlock HorizontalAlignment="Right"
Text="{Binding Amount, StringFormat=C2}"/>
        </DataTemplate>
</Window.Resources>

Poi nella list view si deve associare alla colonna interessata il template creato poc’anzi:
<ListView Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="6" Margin="10"
ItemsSource="{Binding SelectedScaleReceipt.NoteScales}" util:GridViewSort.AutoSort="True" 
       VerticalContentAlignment="Center">
<ListView.View>
             <GridView>
             <GridViewColumn CellTemplate="{StaticResource amount}" Width="150" Header=”Importo”/>
              </GridView>
       </ListView.View>
</ListView>

martedì 23 novembre 2010

LINQ to XML - Recupero di un elemento decimal

C# 4.0
Nel leggere un valore di tipo decimal da un file XML mi si presenta un problema con i decimali in fase di casting. Ovvero il dato letto ha come separatore decimale il “.” mentre nella mia cultura è la “,” il risultato finale è quindi abbastanza evidente:
0.1   diventa 1

Questo è causato da un errato casting dell’elemento appena letto che nello specifico è:
XElement xElement = document.Root.Elements().Where(p => p.Name.LocalName.Equals("Value")).First();

decimal value = (decimal)xElement.Value;

invece si deve fare il casting dell’intero elemento XElement

decimal value = (decimal)xElement;