Donnerstag, 9. Oktober 2008

Online SourceCodeFormatter

Da das SourceCode-Formatieren unter http://formatmysourcecode.blogspot.com/ zwar funktioniert, jedoch leider kein wirklich ansprechendes Ergebnis liefert, habe ich einmal mehr Google bemüht und tatsächlich einen Formatierer gefunden, der sehr schöne Ergebnisse liefert.

Zu finden ist er unter http://www.manoli.net/csharpformat.

Er formatiert C#, VB, HTML/XML/ASPX, T-SQL sowie msh und bietet die Möglichkeiten, Zeilennummern einzublenden und die Hintergründe alternieren zu lassen.

Zur Verwendung des entstehenden HTML-Codes wird ein StyleSheet benötigt, dass von der Seite bezogen werden kann und dann in die Zielseite eingebunden werden muss. Möchte man das vermeiden, besteht aber auch die Möglichkeit, es in den HTML-Code mit einzubetten, so dass der beschriebene Schritt entfällt.

Heraus kommt im Übrigen ein sehr übersichtlicher Quelltext, der - verglichen mit dem, was bisher hier an Code zu sehen war - sehr gut zu lesen ist. Was will man mehr?

Mittwoch, 8. Oktober 2008

BizTalk 2006 Error BEC2004: Validate Instance failed for schema

warning BEC2004: Data at the root level is invalid. Line 1, position 1

Da erstelle ich doch glatt ein XSD Schema mit dem Flatfile Schema Wizard von BizTalk2006/R2 für meinen Kollegen, schick es ihm rüber und es funktioniert nicht...

Noch einmal getestet bei mir, geht immer noch, bei ihm... nicht...

Also hingesetzt bei ihm, Schema nachkreiert -> Funktioniert...

Zu mir rübergeschickt -> geht nicht...

WinDiff -> Kein Unterschied...

Unterschied Kollege hat 64Bit Betriebssystem ich 32Bit, also Files in einer anderen Text Codierung neu abgespeichert auf meinem 32Bitter.... Gleiches Verhalten...!

Copy und Paste vom Inhalt des 64Bit Schemas in eine neue Datei... Gleiches Verhalten...!!!

Nun bin ich etwas ratlos. Deutet vielleicht auf ein Problem mit Escape Zeichen hin... aber der Austausch von Escape Sequencen für Tab und CR/LF brachte auch keine Lösung.

Äußerst kurios, zumal ich schon vorher mehrfach mit anderen Windows 2003 64Bit Systemen das gleiche tat und XSD Schemas aus einer 32Bit Entwicklungsumgebung migrierte in das dortige Projekt.


Irgendjemand eine Idee?

Donnerstag, 2. Oktober 2008

SAP Adapter in Biztalk 64Bit oder "Retrieving the COM class factory for component with CLSID {XXX} failed..."

Versucht man mit dem normalen vorgehen die SAP-Adapter für Biztalk unter einem 64Bit Windowssystem zu installieren, bekommt man so lustige Fehlermeldungen wie diese hier:Natürlich sagt diese treffend aus wo der Fehler liegt (Ha, HA!). Der Fehler liegt einfach darin das der SAP-Adapter seinen Dienst nur auf 32Bit Systemen nachgeht und auf 64Bit Systemen einfach seine DLLs nicht findet. Um das zu beheben muss man nach der Installation (SAP-Connector und SAP-Adapter) dem SAP Adapter expliziet eine 32Bit Umgebung zuweissen. Dazu legt manin der Biztalk Administration Console unter "Platform Settings/Hosts" einen neuen Host an und konfiguriert diesen auf 32Bit.

Danach noch das ganze im SAP Adapter zuweissen (Send und Receive) und siehe da, es läuft.
Jetzt nur nicht vergessen den Host zu restarten ;)

Mittwoch, 1. Oktober 2008

.NET Framework Client Profile

Mit dem Service Pack 1 für das .NET Framework 3.5 und Visual Studio 2008 kam das Client Profile. Dieses ist dafür gedacht, dass bei der Verteilung einer Anwendung auf Basis von WinForms bzw. XAML auf einem System nicht das komplette .NET Framework 3.5 SP1 installiert werden muss. Es wird nur ein Bruchteil vom Framework installiert, der für Standardaufgaben ausreichend ist. Klingt nach einer sehr guten Idee, denn so ist es nicht mehr nötig,  die Installation mitzuliefern oder bei der Installation herunterzuladen. Daumen hoch für die Idee.

Leider sieht die Praxis etwas weniger optimal aus, denn das Client Profile kommt ausschließlich unter Windows XP zum Zug und das auch nur dann, wenn bisher noch keine Version des Frameworks auf dem System installiert ist. Zudem kann es nicht verwendet werden, wenn der Rechner auf der x64- bzw. ia64-Plattform basiert. In all diesen Fällen wird das volle Framework 3.5 SP1 installiert!

Der Prozentsatz von Systemen, die genau die Anforderungen erfüllen, die vom Client Profile gefordert werden, dürfte heutzutage reichlich gering sein, wenn man bedenkt, dass jeder Rechner, auf dem Vista läuft, schon mal außen vor bleibt, weil hier standardmäßig bereits eine Framework-Version installiert ist.

Die an sich sehr gute Idee wird durch die Einschränkungen meiner Ansicht nach ad absurdum geführt. In dieser Art ist das Client Profile, jedenfalls für mich, von keinerlei Nutzen. Schade um den wirklich guten Ansatz. Bleibt zu hoffen, dass Microsoft hier in Zukunft (.NET Framework 4 regt sich ja bereits) nachbessern wird.

Mittwoch, 17. September 2008

BizTalk und SAP Adapter Error

Schon ne ganze Weile habe ich immer wieder neue Probleme mit dem Microsoft SAP Adapter, dieses mal war es (mal wieder) richtig tricky. IDocs aus SAP verschwanden einfach spurlos im wahrsten Sinne des Wortes. Im BizTalk Tool "Health and Activity Tracking" gabs einen spärliche Meldung mit "Loading property information list by namespace failed or property not found in the list. Verify that the Schema is deployed properly." Redeploys brachten aber keine Verbesserung. Nach diversen anderen Versuchen, bin ich schließlich mit dem freien Sysinternal Process Monitor Tool von Microsoft an die Sache. Es ist nicht so einfach sich durch den Datenwust zu kämpfen und das richtige Problem zu identifizieren. Jedenfalls hatte ich danach ein paar Informationen mehr und den Kreis der Verdächtigen stark eingekreist. Die IDOCs kamen im System an und wurden auch erstmal intern verarbeitet, aber als es dann darin ging das IDOC in die Pipeline zu schieben, verschwand einfach alles. Im Registry Monitoring Teil tauchte ein kleiner Warnhinweis auf, das für den SAP Adapter nicht alle Registry Informationen gefunden werden konnten (aus welchen Gründen auch immer die verschwunden waren).

Lange Rede, kurzer Sinn: ein referenzieren der Microsoft.BizTalk.SAPAdapterProperties.dll aus dem (SAP Adapter Installationsverzeichnis) über die BizTalk Ressourcen selbst brachte letztendlich die Lösung. Der Adapter wurde wieder gefunden und das Problem war gefixt, ohne die tatsächliche Ursache zu reparieren. 
Ich vermute eine komplette Neuinstallation des Adapters könnte vielleicht das Problem beheben... bliebe zu testen, doch im Moment bin ich einfach nur froh, dass es nach doch einer recht anstrengenden Fehlerjagd quer durchs ganze System, wieder funktioniert. Bin eben Entwickler und kein SysAdmin ;)

Montag, 15. September 2008

BizTalk error "...has no Transport type specified"

Das hat mich ein bischen Nerven gekostet, zum Glück hat Félix Mondelo in seinem Blog eine simple Lösung parat:
Einfach unter C:\Documents and Settings\[user name]\Application Data\Microsoft\BizTalk Server\Deployment\BindingFiles alle Files im BindingFile Verzeichnis löschen. 
...es ist wirklich unglaublich an wievielen verstreuten Stellen man bei BizTalk suchen und rumschrauben muss :( 

Dienstag, 9. September 2008

MS-CRM begrenzt Fetch auf 5000 Datensätze

Bei dem Versuch alle Datensätze einer Entität (z.b. „accounts“) mit einem „Fetch“ aus einem MS-CRM System zu holen, kann man schnell eine herbe Enttäuschung erleben. Zumindest wenn mehr Datensätze als 5000 an der Zahl geholt werden müssen. Microsoft begrenzt die Anzahl der höchstmöglichen Datensätze per Default auf 5000 Stück. Hat man mehr, werden nur die ersten 5000 zurückgegeben. Möchte man diesen Defaultwert ändern, hat man nur den Weg über die Registry des Rechners auf dem MS-CRM installiert ist!

Es muss der Eintrag "TurnOffFetchThrottling" als DWORD in der Registery unter „HKEY_LOCAL_MACHINE\Software\Microsoft\MSCRM“ mit dem Wert ‚1’ eingetragen werden. Danach ist die Limitierung auf 5000 Datensätze aufgehoben.

Biztalkbeschleunigung durch Speicherzuweisung.

Bei einem aktuellem Projekt bei dem ca. 7000 Datensätze aus einem MS-CRM durch Biztalk2006 (inkl. Aufbereitung) gelesen werden sollten und danach in eine MS-SQL Tabelle landen sollte, musste ich eklatante Performanceschwächen feststellen. Wenn man nicht alle paar Minuten die Host-Instace manuell restarted hat, begab sich Biztalk für unbestimmte Zeit in Tiefschlaf. Erst nachdem in der „Administration Console“ unter „Platform Settings“->“Hosts“->“BizTalkServerApplication“->”Advanced“->”Throttling Thresholds”->”Process memory usage:” ein Wert von ‘700’ hinterlegt wurde, lief das ganze wie gewünscht. Der vorhergeige Wert ‚25’ wurde als „%“ interpretiert (wie alle Werte zwischen 1 und 100), wobei damit nicht "von Gesamtspeicher" gemeint ist sondern nur "freier Speicher" benutzt wird. Somit ist es Auslastungs- und Glückssache wie viel Speicher dem Biztalk wirklich zur verfügung stehen.

Montag, 8. September 2008

Microsoft Posters (Bezugsquellen und Links)

Wer kennt sie nicht als Software Entwickler, überall hängen diese schön bunten Poster herum die mal mehr oder weniger sinnvoll Features und Frameworks anschaulich demonstrieren können.

Bei Microsoft kann man einge davon herunterladen. Was ich sehr bedauerlich finde ist, dass ich keine Einstiegsseite auf MSDN kenne, die einem alle Poster zusammenfassend präsentiert. Nun gut, man kann immerhin die Suche bemühen, dennoch bleibt bei mir das Gefühl nicht alle zu erfassen. Natürlich kann man die auch für einen verhältnismäßig günstigen Preis erwerben, z.B. bei Amazon.de wie die das Posterpack für das .NET Framework 2.0, oder auch über Technet (da kann man auch z.B. die Jahresarchiv DVDs des MSDN Magazins ordern).
Empfehlenswert finde ich folgende Poster:
  • Ein Namespace und Type Überblick für das .NET Framework 3.5.
  • Hochinteressant finde ich die PnP (Patterns and Practices) Poster: Smart Client Architektur und der Overview.
  • Für Shortcutfetischisten die C# Keybinding Poster für VS2008 und VS2005 (gibt es auch für Basic und C++. J# und der Rest gehen leider leer aus).
  • Wer mit InfoPath oder Sharepoint entwickelt wird hier fündig, inkl. einer Developer Roadmap für Office 2007.
  • Für BizTalk2006 Entwickler gibts gleich nen ganzen Schwung an Poster, u.a. die Datenbank Struktur inkl. der SQL Jobs und die Runtime Architektur.

Donnerstag, 4. September 2008

Strings verschlüsseln mit C#

Strings mit .NET verschlüsseln ist gar nicht schwer. Durch Zuhilfenahme der TripleDESCryptoServiceProvider-Klasse kann ein String ganz einfach ver- und entschlüsselt werden. Hier ein kleines Beispiel: Das erste was wir brauchen ist ein Initialisierungsvektor und ein Schlüssel.

private readonly byte[] key = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 };
private readonly byte[] iv = new byte[] { 65, 110, 68, 26, 69, 178, 200, 219 };
Der Initialisierungsvektor ist der Eingangsparameter mit dem die Startbedingungen für einen kryptografischen Algorithmus gesetzt werden. Der Schlüssel wird für die Verschlüsselung benötigt.Die beiden Werte werden für das Ver- und Entschlüsseln benötigt. Als nächstes der Code zum Verschlüsseln. Die Kommentare erklären eigentlich den Code.
/// <summary>
/// Verschlüsselt einen Eingabestring.
/// </summary>
/// <param name="input">Der zu verschlüsselnde String.</param>
/// <returns>Byte-Array mit dem verschlüsselten String.</returns>
public byte[] StringVerschluesseln(string input)
{
try
{
// MemoryStream Objekt erzeugen
MemoryStream memoryStream = new MemoryStream();

// CryptoStream Objekt erzeugen und den Initialisierungs-Vektor
// sowie den Schlüssel übergeben.
CryptoStream cryptoStream = new CryptoStream(
memoryStream, new TripleDESCryptoServiceProvider().CreateEncryptor(this.key, this.iv), CryptoStreamMode.Write);

// Eingabestring in ein Byte-Array konvertieren
byte[] toEncrypt = new ASCIIEncoding().GetBytes(input);

// Byte-Array in den Stream schreiben und flushen.
cryptoStream.Write(toEncrypt, 0, toEncrypt.Length);
cryptoStream.FlushFinalBlock();

// Ein Byte-Array aus dem Memory-Stream auslesen
byte[] ret = memoryStream.ToArray();

// Stream schließen.
cryptoStream.Close();
memoryStream.Close();

// Rückgabewert.
return ret;
}
catch (CryptographicException e)
{
Console.WriteLine(String.Format(CultureInfo.CurrentCulture, "Fehler beim Verschlüsseln: {0}", e.Message));
return null;
}
}

Bei DES handelt es sich um einen symmetrischen Algorithmus, das heißt zur Ver- und Entschlüsselung wird derselbe Schlüssel verwendet. TripleDES verschlüsselt die Daten dreimal. Um den String wieder herzustellen, dient folgende Funktion:
/// <summary>
/// Entschlüsselt einen String aus einem Byte-Array.
/// </summary>
/// <param name="data">Das verscghlüsselte Byte-Array.</param>
/// <returns>Entschlüsselter String.</returns>
public string StringEntschluesseln(byte[] data)
{
try
{
// Ein MemoryStream Objekt erzeugen und das Byte-Array
// mit den verschlüsselten Daten zuweisen.
MemoryStream memoryStream = new MemoryStream(data);

// Ein CryptoStream Objekt erzeugen und den MemoryStream hinzufügen.
// Den Schlüssel und Initialisierungsvektor zum entschlüsseln verwenden.
CryptoStream cryptoStream = new CryptoStream(
memoryStream,
new TripleDESCryptoServiceProvider().CreateDecryptor(this.key, this.iv), CryptoStreamMode.Read);
// Buffer erstellen um die entschlüsselten Daten zuzuweisen.
byte[] fromEncrypt = new byte[data.Length];

// Read the decrypted data out of the crypto stream
// and place it into the temporary buffer.
// Die entschlüsselten Daten aus dem CryptoStream lesen
// und im temporären Puffer ablegen.
cryptoStream.Read(fromEncrypt, 0, fromEncrypt.Length);

// Den Puffer in einen String konvertieren und zurückgeben.
return new ASCIIEncoding().GetString(fromEncrypt);
}
catch (CryptographicException e)
{
Console.WriteLine(String.Format(CultureInfo.CurrentCulture, "Fehler beim Entschlüsseln: {0}", e.Message));
return null;
}
}