archive for the '.NET' category

13
Jun
09

ADO.NET Data Services, Entity Framework und SQL/HTTP Timeouts

image Beim Arbeiten mit den ADO.NET Data Services (aka Astoria) kommt man irgendwann an den Punkt, dass die Aufgaben komplizierter werden oder die Last auf die Server steigt. In solchen Situationen ist man mit potentiellen Timeouts in allen Ebenen konfrontiert. In diesem Post zeige ich welche Timeouts es gibt, aber speziell will ich zeigen wie ich das Timeout des Entity Frameworks (SQL) in Kombination mit der MS REST Schicht ADO.NET Data Services anpassen kann.

Es bleibt anzumerken, dass in der aktuellen Version V1 ein Bug existiert. Die Serverkomponente wirft bei einem Timeout eine NullReferenceException anstatt die eigentliche Fehlermeldung, was leider nicht wirklich weiter hilft.

Welche Timeouts gibt es also und was sind die Defaults:

  1. HTTP Client Timeout – Browser
    Leider habe ich hier kaum Informationen gefunden… nichts was ich hier schreiben möchte.
  2. HTTP Client Timeout - ADO.NET Data Services Client Library
    Wo: Code
    Default: 100.000 Millisekunden (100 Sekunden) vererbt von HttpWebRequest.Timeout
    Mehr: MSDN - System.Data.Services.Client.DataServiceContext.Timeout
    Mehr: Microsoft KB 962933: Client Timeout Bug
    Mehr: ADO.NET Data Services Team Blog: Client Timeout Bug
  3. HTTP Server ExecutionTimeout
    Wo: web.config
    Default: 110 Sekunden (wenn Debug=False, dann unendlich)
    Mehr: httpRuntime Element (ASP.NET Settings Schema)
  4. ADO.NET Data Services Server Library
    Hier gibt es kein extra Timeout. Die unterliegende Connection (zum Beispiel SQL) bestimmt die Dauer.
  5. Entity Framework Connection/Command Timeout (SQL)
    Wo: Code
    Default: 30 Sekunden CommandTimeout
    Default: 15 Sekunden SqlConnection

Wenn wir uns nun um ein Timeout kümmern müssen wir also immer checken, ob wir damit gegen ein anderes rennen. Angenommen wir wollen unseren Sql Queries 5 Minuten Zeit geben (nur für das Beispiel!), dann müssen wir folgendes tun:

  1. Entity Framework Timeout = 5*60 = 300 Sekunden
  2. HttpServer Timeout = 5*60 + 10 (Puffer) = 310 Sekunden
  3. ADO.NET Data Services Client Timeout = 5*60*1000 + 20*1000 (Puffer) = 320.000 Millisekunden (320 Sekunden)

Wichtig: Wir brauchen überall ein wenig Puffer, sonst kann es sein, dass uns die Gesamtgeschwindigkeit der Maschine (da kann ja noch mehr Code dazwischen laufen) dazwischenkommt.

Jetzt zum eigentlichen Inhalt des Posts ;-) Wie kann ich überhaupt das Timeout des Entity Frameworks erhöhen. Die ADO.NET Data Service Website nutzt das Entity Framework und stellt so die Tabellen und Views zur Verfügung. Der Default Code in den SVC Dateien erlaubt es nicht die Connection zu beeinflussen:

 using System;
 using System.Web;
 using System.Collections.Generic;
 using System.ServiceModel.Web;
 using System.Linq;
 using System.Data.Services;
 using NorthwindModel;
 namespace SimpleDataService
 {
    public class Northwind : DataService<NorthwindEntities>
    {
        public static void InitializeService(IDataServiceConfiguration config)
        {
            config.SetEntitySetAccessRule("*", EntitySetRights.All);
        }
    }
 }

Die Klasse DataService<T> bietet nun eine Methode CreateDataSource mit der ich von Hand die EntityConnection erzeugen kann und somit auch den Command Timeout setzen kann:

protected override NorthwindEntities CreateDataSource() 
{ 
    var dbcon = new NorthwindEntities(); 
    dbcon.CommandTimeout = Core.Config.Application.TimeoutSql; //Core is my helper library
    return dbcon; 
}

Ich hoffe ich kann dem einen oder anderen weiter helfen :-) Mir weiter geholfen bei der Lösung hat folgender Blogpost:
Timeout in ADO.Net Entity Framework and ADO.Net Data Services

Ciao Marco

06
Jun
09

C# FTP gegen OpenVMS FTP Server

image In einem meiner letzten Projekte bin ich in die “glückliche” Lage gekommen, mit einer VAX über FTP zu kommunizieren. Gegen unser IIS7 FTP hatten alle Tests super funktioniert. Ich verbinde mich gegen den Server und mache dann einen Upload mit der Angabe der vollen URI:

Connect: ftp.servername.com

Upload File: /upd/knr/abc/request.txt

Mein erster Code nutzte die native C# FTP Api und antwortet einfach nur mit einem Fehler ohne Details. Ich habe dann auf eine Komponente von Aspose zurückgegriffen (wir nutzen Aspose.NET Total, was ich nur empfehlen kann). Ich bekam folgende Fehlermeldung:

Aspose.Network.Ftp.FtpException: Failed to upload file :500 %CLI-W-IVQUAL, unrecognized qualifier - check validity, spelling, and placement
at Aspose.Network.Ftp.FtpClient.Upload(Stream localStream, String remoteFilePath)
at Aspose.Network.Ftp.FtpClient.Upload(String localFilePath, String remoteFilePath)
at Ibu.Core.Utility.Ftp.UploadFile(String localFilename, Boolean append) in C:\Users\scheel\Code\ProjectX\Core\Utility\Ftp.cs:line 403
at ConsoleApplication1.Program.Main(String[] args)

Eine kurze Recherche brachte tatsächlich ein Ergebnis:
http://www.physiology.wisc.edu/comp/docs/mg/ftp_users_guide.html

If the remote file specification includes ``/'', it will be necessary to enclose the entire remote file specification in double quotes, because the FTP command interpreter interprets ``/'' as the beginning of a qualifier. Notice the difference in behavior on some systems if the remote file specification is and is not quoted.

Meine Lösung: Ich habe den führenden Slash einfach weg gelassen und schon hat es funktioniert.

Ciao Marco

12
Mai
09

RE: 10 Tools, die jeder .NET Entwickler kennen sollte

image Dirk Primbs stellt die Frage nach den Top Development Tools.
Dirk Primbs: 10 Tools, die jeder .NET Entwickler kennen sollte

Ich stimme zu und hier meine Erweiterungen:

  • LinqPad: Dirk nennt den Snipped Compiler… ich selber stehe auf LinqPad, der mehr als nur Linq kann. Für 19$ gibt es dann auch Autocompletion.
  • Live Mesh: Ich habe eine Hauptentwicklermaschine und zusätzlich noch eine Windows Server 2008 VM. Meine Tools (um die es hier und in Dirks Post geht) und meine Reference Libraries (SharePoint DLL’s, Log4Net, …) halte ich so auf allen Rechnern aktuell und das ohne großen Aufwand.
  • XML Notepad 2007: Da heute “Alles” als XML daher kommt, bringt das Tool einen schnellen Einstieg auch in komplexere Strukturen.
  • TortoiseSVN: Wir nutzen SubVersion und damit ist das Tool absolute Pflicht.

Wie sieht es bei euch aus?

Ciao Marco

20
Apr
09

PowerShell mit C# generieren und scheitern? Unicode anstatt UTF-8!

Ich hatte die Gelegenheit, meinem Kollegen Jan bei einem Projekt zu helfen. Es geht darum, aus einer C# Applikation PowerShell Scripte zu erzeugen. Diese Scripte werden dann später auf einem Server ausgeführt. Klingt erst mal nicht wirklich spannend. Spannend wurde es dann, als der Code für die Erzeugung abgeschlossen wurde und das erste mal die Scripte ausgeführt wurden. Die PowerShell meldete eine kryptische Exception:

image

Unexpected token in expression or statement.

Beim Editieren des PowerShells mit dem neuen Windows 7 PowerShell Editor kommt beim Speichern folgende Meldung:

image

Und schon hatten wir den fehlenden Hinweis. .NET Applikationen arbeiten per Default mit UTF-8. Die PowerShell kommt aber wohl mit einigen Zeichen nur klar, wenn die Datei mit dem Unicode Encoding geschrieben wurde. Der Code wurde also kurz erweitert:

   1: //Alt
   2: //File.WriteAllText(saveTo, fileContent);
   3: //Neu
   4: File.WriteAllText(saveTo, fileContent, System.Text.Encoding.Unicode);

Es kann manchmal so einfach sein ;-) Ein kurzer Test per NotePad2 zeigt das Ergebnis:

Vorher:
image

Nachher:
image 

Sollte irgendjemand den genauen Grund kennen, dann wäre ich für einen echten Grund, warum die PowerShell hier streikt dankbar. Kurze Recherchen haben leider nichts gefunden :-S

Ciao Marco

09
Mär
09

SnailMail aus Internet mit Microsoft Tag und 01

imageHeute habe auch ich Post im Briefkasten. Das .NET Logo (seit der PDC 08) stand gleich neben meinem Name. Der Inhalt war etwas rätselhaft:

 

 

Natürlich hab ich gleich die Microsoft Tag Software für mein Windows Mobile installiert (was bestimmt Ziel der Aktion war):

GetTag.mobi

Microsoft - Tag

Mein Kollege Jan hat es auch schon erwischt:

Jan Geisbauer - Stille Post

Und weitere .NET Devs:

Es gibt aber auch negatives Reaktionen:

Kay Giza - Bin sauer: Virales Marketing, es nervt!

Mich persönlich stört es nicht… aber ich bekomme so etwas nicht so oft :-) Bin mal gespannt, ob da noch was raus kommt.

Ciao Marco

UPDATE 2009-03-10: Nach dem Hinweis von Kay (danke für den Kommentar) habe ich den Titel geändert (alt: Post von Microsoft mit Tag und 01).

03
Mär
09

ADO.NET Data Services V 1.5 sind im CTP1 Status

image Seit letztem Jahr arbeiten wir an einem Projekt, welches die ADO.NET Data Services (aka Astoria) einsetzt, um auf die Daten einer Microsoft SQL 2008 Datenbank zuzugreifen. Der Einsatz der Technologie hat gezeigt, das die Theorie zu REST + SQL Server DB ganz toll klingt, man sich die Features aber teils teuer erkauft. Ich möchte irgendwann man ein eigene Post zum Thema schreiben. Heute möchte ich einfach mal zeigen, über was man sich plötzlich alles freuen kann (aus dem Blog von des Astoria Teams):

Row Count:
One scenario we heard a ton of feedback on after shipping V1 of ADO.NET Data Services in the .NET Framework 3.5SP1 is the ability for the a client of a data service to determine the total number of entities in a set without having to retrieve them all.  To address this need, we have extended the data services addressing scheme to allow a client to obtain this type of information without having to download all the entities in a set.

Enhanced BLOB Support:
This feature enhances the BLOB support provided in V1 to enable data services to stream arbitrarily large BLOBs, store binary content separate from its metadata, easily defer the loading of BLOB content when its metadata is requested, etc.  For CTP1 we'll include server side support for this feature only.  Client library support will likely come in a future CTP.

Mehr Informationen findet man hier:
Project Astoria Team Blog - Announcing ADO.NET Data Services v1.5 CTP1
JohnPapa.net - ADO.NET Data Services v1.5 is on its way

Die Entscheidung in unserem Projekt zu Gunsten von ADO.NET Data Services bleibt noch immer eine richtige, allerdings hätte man als "Dev mit Microsofterfahrung” wissen müssen, das eine V1 nie reibungslos läuft :-)

Ciao Marco

P.S. Was mich am meisten stört, ist die Problematik richtig nach dem Produkt zu suchen, da es bisher wohl keine “offizielle” Abkürzung gibt.