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).
Mittwoch, 17. September 2008
BizTalk und SAP Adapter Error
Montag, 15. September 2008
BizTalk error "...has no Transport type specified"
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.
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.
- 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;
}
}
Mittwoch, 3. September 2008
Hashtable und der loadFactor Parameter
Ich bin heute über den "ominösen" float loadFactor Parameter im Hashtable Constructor beim Fremdcode debuggen gestoßen. Wer sich nicht mit theoretischen Verständnis belasten will, nicht das "letzte" bischen Performance braucht und auch noch nie eine "System.InvalidOperationException: Hashtable insert failed. Load factor too high" Exception gesehen hat, dem sei gesagt, laß den loadFactor in Ruhe. Der ist Standardmäßig auf 0.72 eingestellt und völlig ausreichend normalerweise.