﻿<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">
  <channel>
    <title>gehirnwindung.de</title>
    <description>{.net development aid}</description>
    <link>http://gehirnwindung.de/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 1.6.1.6</generator>
    <language>de-DE</language>
    <blogChannel:blogRoll>http://gehirnwindung.de/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://gehirnwindung.de/syndication.axd</blogChannel:blink>
    <dc:creator>Wolfgang Kluge</dc:creator>
    <dc:title>gehirnwindung.de</dc:title>
    <geo:lat>4,930,194.000000</geo:lat>
    <geo:long>9,306,111.000000</geo:long>
    <item>
      <title>ASP.NET: Vertauschte Sessions (OutputCache und Cookieless Sessions)</title>
      <description>&lt;p&gt;Ich wurde vor kurzem mit einem Problem konfrontiert, bei dem ich meinem Kunden nat&amp;uuml;rlich weiterhelfen wollte. Bei einem Web-Projekt wurden sporadisch Sessions "vertauscht" - so sah ein Benutzer A pl&amp;ouml;tzlich die Userdaten eines Benutzers B. Das kam eher selten vor, aber jeder einzelne Fall ist nat&amp;uuml;rlich unsch&amp;ouml;n.&lt;/p&gt;
&lt;p&gt;Meine erste Vermutung war, dass das Session-Objekt (oder eine der darin enthaltenen Variablen) evtl. in statischen Variablen gelandet ist. Das soll wohl &amp;ouml;fter mal vorkommen und sieht z.B. so aus.&lt;/p&gt;
&lt;div class="code"&gt;
&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Session _sess;&lt;br /&gt;
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; DoSomething() {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt; (_sess == &lt;span class="kwrd"&gt;null&lt;/span&gt;) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _sess = HttpContext.Current.Session;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span class="kwrd"&gt;if&lt;/span&gt; (_sess != &lt;span class="kwrd"&gt;null&lt;/span&gt;) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="rem"&gt;// ...&lt;br /&gt;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
}&lt;br /&gt;

&lt;/div&gt;
&lt;p&gt;Zugegeben, sieht recht harmlos aus - ist aber folgenschwer. Ich hab den Ersteller der Webseite kontaktiert und ihn gefragt, ob so etwas &amp;auml;hnliches evtl. enthalten ist. Der machte sich auch direkt auf die Suche nach &amp;auml;hnlichen Konstrukten, blieb aber erfolglos. Danach bekam ich sogar direkt Zugriff auf den Quellcode.&lt;/p&gt;
&lt;p&gt;Ich hab den Code nat&amp;uuml;rlich nochmal durchforstet (und die Fremd-Assemblies analysiert) - aber auch ich blieb ohne Erfolg bei meiner Suche (war ja auch &amp;uuml;berheblich zu denken, dass die anderen nicht richtig suchen w&amp;uuml;rden - ich sch&amp;auml;m mich *g*). Die Cache-Einstellungen schienen in Ordnung. Ich hab daraufhin mehrere Tests mit &lt;a href="http://phantomjs.org/" target="_blank"&gt;PhantomJS&lt;/a&gt; erstellt und durchgehend gepr&amp;uuml;ft, ob die Session irgendwann verloren geht oder die Daten andere werden - aber auch hier ohne jeden Lichtblick. So ging das jetzt mehrere Tage.&lt;/p&gt;
&lt;p&gt;Heute hatte ich was ganz anderes vor. Dabei musste ich Cookies in meinem Browser deaktiviert und kam eher zuf&amp;auml;llig auf die Seite - da hab ich es dann auch endlich mal gesehen: Userdaten eines anderen Benutzers. Und nun war auch endlich klar, wie es zum "vertauschen" der Sessions kam - n&amp;auml;mlich gar nicht ;) Wir haben vielmehr - in einem Teilbereich - alle das Gleiche gesehen.&lt;/p&gt;
&lt;p&gt;Die ASP.NET - Seite verwendet Cookies im "&lt;span style="font-family: monospace;"&gt;AutoDetect&lt;/span&gt;"-Modus (&lt;span style="font-family: monospace;"&gt;&amp;lt;session cookieless="AutoDetect" /&amp;gt;&lt;/span&gt;). Es h&amp;auml;tte aber auch "&lt;span style="font-family: monospace;"&gt;UseUrl&lt;/span&gt;" sein k&amp;ouml;nnen - damit w&amp;auml;re es ebenso falsch gelaufen (allerdings wahrscheinlich leichter entdeckt).&lt;/p&gt;
&lt;p&gt;Zus&amp;auml;tzlich war bei einem ASP.NET Control (ein Footer) angegeben, dass die Ausgabe gecached werden kann. Das ist mir bei der vorherigen Durchforstung zwar aufgefallen, aber nicht wirklich negativ. Die Angabe sah so aus&lt;/p&gt;
&lt;div class="code"&gt;
&amp;lt;%@ OutputCache Duration=&lt;span class="str"&gt;"6000"&lt;/span&gt; VaryByParam=&lt;span class="str"&gt;"none"&lt;/span&gt; %&amp;gt;&lt;br /&gt;
&lt;/div&gt;
&lt;p&gt;Also auch hier an sich nichts schlimmes. Die HTML-Elemente waren allesamt Links zum Impressum und &amp;auml;hnlichen Seiten. Damit die Cookieless-Session beim Aufruf des Impressums nicht verloren geht, m&amp;uuml;ssen nat&amp;uuml;rlich auch diese Links mit &lt;span style="font-family: monospace;"&gt;Response.ApplyAppPathModifier()&lt;/span&gt; angepasst werden. &lt;strong&gt;Argh&lt;/strong&gt;. Selbstverst&amp;auml;ndlich wird die SessionID hier mitgecached - nur gesehen hab ich es nicht.&lt;/p&gt;
&lt;p&gt;Der erste User nach den 6000 Sekunden gibt vor, wie der Footer aussieht.&lt;br /&gt;Sind bei dem User Session-Cookies im Browser erlaubt, klappt es &amp;uuml;berall (die Cookieless-User verlieren Ihre Session, aber das ist weitaus weniger schlimm als fremde Userdaten zu sehen).&lt;br /&gt;Ist der Browser des "f&amp;uuml;hrenden" Users dagegen so eingestellt, dass Session-Cookies abgelehnt werden, bekommen alle dessen Session angezeigt...&lt;/p&gt;
&lt;p&gt;Nun kann man entweder den OutputCache ganz abstellen, oder aber die Angabe etwas erweitern zu&lt;/p&gt;
&lt;div class="code"&gt;
&amp;lt;%@ OutputCache Duration=&lt;span class="str"&gt;"6000"&lt;/span&gt; VaryByParam=&lt;span class="str"&gt;"none"&lt;/span&gt; VaryByCustom=&lt;span class="str"&gt;"session"&lt;/span&gt; %&amp;gt;&lt;br /&gt;
&lt;/div&gt;
&lt;p&gt;Hierf&amp;uuml;r muss aber in der global.asax noch die Funktion &lt;span style="font-family: monospace;"&gt;GetVaryByCustomString&lt;/span&gt; &amp;uuml;berschrieben werden, in etwa so:&lt;/p&gt;
&lt;div class="code"&gt;
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; GetVaryByCustomString( HttpContext context, &lt;span class="kwrd"&gt;string&lt;/span&gt; custom ) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt; (custom == &lt;span class="str"&gt;"session"&lt;/span&gt;) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt;( context.Session != &lt;span class="kwrd"&gt;null&lt;/span&gt; ) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kwrd"&gt;return&lt;/span&gt; context.Session.SessionID;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;base&lt;/span&gt;.GetVaryByCustomString(context, custom);&lt;br /&gt;
}
&lt;/div&gt;
&lt;p&gt;So funktionieren auch OutputCache und Cookieless Sessions problemlos zusammen... Und beim n&amp;auml;chsten Mal seh ich das auch gleich ;)&lt;/p&gt;</description>
      <link>http://gehirnwindung.de/post/2013/03/22/ASPNET-Vertauschte-Sessions.aspx</link>
      <author>wolfgang@gehirnwindung.de (Wolfgang)</author>
      <comments>http://gehirnwindung.de/post/2013/03/22/ASPNET-Vertauschte-Sessions.aspx#comment</comments>
      <guid>http://gehirnwindung.de/post.aspx?id=d24acbb5-ce80-4fb4-a32a-ce79465f26d4</guid>
      <pubDate>Fri, 22 Mar 2013 22:50:00 +0100</pubDate>
      <category>ASP.NET</category>
      <dc:publisher>wolfgang@gehirnwindung.de (Wolfgang)</dc:publisher>
      <pingback:server>http://gehirnwindung.de/pingback.axd</pingback:server>
      <pingback:target>http://gehirnwindung.de/post.aspx?id=d24acbb5-ce80-4fb4-a32a-ce79465f26d4</pingback:target>
      <slash:comments>11</slash:comments>
      <trackback:ping>http://gehirnwindung.de/trackback.axd?id=d24acbb5-ce80-4fb4-a32a-ce79465f26d4</trackback:ping>
      <wfw:comment>http://gehirnwindung.de/post/2013/03/22/ASPNET-Vertauschte-Sessions.aspx#comment</wfw:comment>
      <wfw:commentRss>http://gehirnwindung.de/syndication.axd?post=d24acbb5-ce80-4fb4-a32a-ce79465f26d4</wfw:commentRss>
    </item>
    <item>
      <title>LINQ Extension Methods: Intersect</title>
      <description>&lt;p&gt;Mit der&amp;nbsp;&lt;strong&gt;&lt;a title="MSDN: Intersect extension method" href="http://msdn.microsoft.com/en-us/library/bb460136(v=VS.100).aspx" target="_blank"&gt;Intersect&lt;/a&gt;&lt;/strong&gt;-Erweiterungsmethode vergleicht man zwei Sequenzen des gleichen Typs&amp;nbsp;miteinander&amp;nbsp;und erh&amp;auml;lt als Ergebnis eine neue Sequenz, in der die Elemente der ersten Sequenz vorhanden sind, die &lt;span style="text-decoration: underline;"&gt;auch&lt;/span&gt; in der 2. Sequenz&amp;nbsp;vorkommen (Gegenteilig zur &lt;a title="LINQ Except Extension method" href="http://gehirnwindung.de/post/2010/05/12/LINQ-Extension-Methods-Except.aspx"&gt;Except-Erweiterungsmethode&lt;/a&gt;). Dabei wird jedes Element nur einmal aufgef&amp;uuml;hrt. Verglichen wird - wenn man nichts anderes angibt - mit EqualityComparer&amp;lt;T&amp;gt;.Default.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://gehirnwindung.de/image.axd?picture=2010%2f5%2flinq-extension-methods-intersect.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Ohne Intersect Extension Method kann man das Verhalten in etwa so nachbilden&lt;/p&gt;
&lt;div class="code"&gt;
&lt;span class="kwrd"&gt;private&lt;/span&gt; List&amp;lt;T&amp;gt; Intersect&amp;lt;T&amp;gt;( List&amp;lt;T&amp;gt; list1, List&amp;lt;T&amp;gt; list2, EqualityComparer&amp;lt;T&amp;gt; comparer ) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; var ret = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;T&amp;gt;( );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt;( comparer == &lt;span class="kwrd"&gt;null&lt;/span&gt; ) comparer = EqualityComparer&amp;lt;T&amp;gt;.Default;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;for&lt;/span&gt;( &lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; list1.Count; i++ ) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt;(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !ret.Contains( list1[i], comparer ) &amp;amp;&amp;amp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list2.Contains( list1[i], comparer )&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret.Add( list1[i] );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;return&lt;/span&gt; ret;&lt;br /&gt;
}
&lt;/div&gt;
&lt;p&gt;Der Aufruf mit Erweiterungsmethode kann so erfolgen&lt;/p&gt;
&lt;div class="code"&gt;
list1.Intersect( list2 );&lt;br /&gt;
list1.Intersect( list2, EqualityComparer&amp;lt;T&amp;gt;.Default );
&lt;/div&gt;</description>
      <link>http://gehirnwindung.de/post/2010/05/19/LINQ-Extension-Methods-Intersect.aspx</link>
      <author>wolfgang@gehirnwindung.de (Wolfgang)</author>
      <comments>http://gehirnwindung.de/post/2010/05/19/LINQ-Extension-Methods-Intersect.aspx#comment</comments>
      <guid>http://gehirnwindung.de/post.aspx?id=35d69357-86de-47bd-8bd8-860126a0fb3f</guid>
      <pubDate>Wed, 19 May 2010 20:25:00 +0100</pubDate>
      <category>C#</category>
      <dc:publisher>wolfgang@gehirnwindung.de (Wolfgang)</dc:publisher>
      <pingback:server>http://gehirnwindung.de/pingback.axd</pingback:server>
      <pingback:target>http://gehirnwindung.de/post.aspx?id=35d69357-86de-47bd-8bd8-860126a0fb3f</pingback:target>
      <slash:comments>21</slash:comments>
      <trackback:ping>http://gehirnwindung.de/trackback.axd?id=35d69357-86de-47bd-8bd8-860126a0fb3f</trackback:ping>
      <wfw:comment>http://gehirnwindung.de/post/2010/05/19/LINQ-Extension-Methods-Intersect.aspx#comment</wfw:comment>
      <wfw:commentRss>http://gehirnwindung.de/syndication.axd?post=35d69357-86de-47bd-8bd8-860126a0fb3f</wfw:commentRss>
    </item>
    <item>
      <title>LINQ Extension Methods: Except</title>
      <description>&lt;p&gt;Mittels &lt;strong&gt;&lt;a title="MSDN: Except extension method" href="http://msdn.microsoft.com/en-us/library/bb300779(v=VS.100).aspx" target="_blank"&gt;Except&lt;/a&gt;&lt;/strong&gt;-Erweiterungsmethode vergleicht man zwei Sequenzen des gleichen Typs&amp;nbsp;miteinander&amp;nbsp;und erh&amp;auml;lt als Ergebnis eine neue Sequenz, in der die Elemente der ersten Sequenz vorhanden sind, die in der 2. Sequenz &lt;span style="text-decoration: underline;"&gt;nicht&lt;/span&gt; vorkommen. Dabei wird jedes Element nur einmal aufgef&amp;uuml;hrt. Verglichen wird - wenn man nichts anderes angibt - mit EqualityComparer&amp;lt;T&amp;gt;.Default.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://gehirnwindung.de/image.axd?picture=2010%2f5%2flinq-extension-methods-except.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Ohne Except Extension Method kann man das Verhalten in etwa so nachbilden&lt;/p&gt;
&lt;div class="code"&gt;
&lt;span class="kwrd"&gt;private&lt;/span&gt; List&amp;lt;T&amp;gt; Except&amp;lt;T&amp;gt;( List&amp;lt;T&amp;gt; list1, List&amp;lt;T&amp;gt; list2, EqualityComparer&amp;lt;T&amp;gt; comparer ) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; var ret = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;T&amp;gt;( );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt;( comparer == &lt;span class="kwrd"&gt;null&lt;/span&gt; ) comparer = EqualityComparer&amp;lt;T&amp;gt;.Default;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;for&lt;/span&gt;( &lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; list1.Count; i++ ) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt;(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !ret.Contains( list1[i], comparer ) &amp;amp;&amp;amp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !list2.Contains( list1[i], comparer )&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret.Add( list1[i] );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;return&lt;/span&gt; ret;&lt;br /&gt;
}
&lt;/div&gt;
&lt;p&gt;Doch zum Gl&amp;uuml;ck gibt es die Erweiterungsmethoden, der Aufruf erfolgt in etwa so&lt;/p&gt;
&lt;div class="code"&gt;
list1.Except( list2 );&lt;br /&gt;
list1.Except( list2, EqualityComparer&amp;lt;T&amp;gt;.Default );
&lt;/div&gt;</description>
      <link>http://gehirnwindung.de/post/2010/05/12/LINQ-Extension-Methods-Except.aspx</link>
      <author>wolfgang@gehirnwindung.de (Wolfgang)</author>
      <comments>http://gehirnwindung.de/post/2010/05/12/LINQ-Extension-Methods-Except.aspx#comment</comments>
      <guid>http://gehirnwindung.de/post.aspx?id=b330dcf6-eef5-43a5-bc99-29fa17ae2449</guid>
      <pubDate>Wed, 12 May 2010 21:00:00 +0100</pubDate>
      <category>C#</category>
      <dc:publisher>wolfgang@gehirnwindung.de (Wolfgang)</dc:publisher>
      <pingback:server>http://gehirnwindung.de/pingback.axd</pingback:server>
      <pingback:target>http://gehirnwindung.de/post.aspx?id=b330dcf6-eef5-43a5-bc99-29fa17ae2449</pingback:target>
      <slash:comments>13</slash:comments>
      <trackback:ping>http://gehirnwindung.de/trackback.axd?id=b330dcf6-eef5-43a5-bc99-29fa17ae2449</trackback:ping>
      <wfw:comment>http://gehirnwindung.de/post/2010/05/12/LINQ-Extension-Methods-Except.aspx#comment</wfw:comment>
      <wfw:commentRss>http://gehirnwindung.de/syndication.axd?post=b330dcf6-eef5-43a5-bc99-29fa17ae2449</wfw:commentRss>
    </item>
    <item>
      <title>LINQ Extension Methods: Union</title>
      <description>&lt;p&gt;Die Erweiterungsmethode &lt;strong&gt;&lt;a title="MSDN: Union extension method" href="http://msdn.microsoft.com/en-us/library/bb341731(v=VS.100).aspx"&gt;Union&lt;/a&gt;&lt;/strong&gt; bietet die M&amp;ouml;glichkeit, 2 Sequenzen&amp;nbsp;des gleichen Typs&amp;nbsp;zu einer so zusammenzuf&amp;uuml;hren, dass von jedem Element nur noch eine Entsprechung &amp;uuml;brig bleibt. Damit&amp;nbsp;verh&amp;auml;lt sich Union&amp;nbsp;wie der Aufruf von &lt;strong&gt;Concat().Distinct()&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://gehirnwindung.de/image.axd?picture=2010%2f5%2flinq-extension-methods-union.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Die Reihenfolge der Elemente in der&amp;nbsp;Ergebnissequenz ergibt sich aus der Reihenfolge innerhalb der einzelnen Listen, die nacheinander abgearbeitet werden.&lt;/p&gt;
&lt;p&gt;Ohne Union - Extension Method sieht das in etwa so aus&lt;/p&gt;
&lt;div class="code"&gt;
&lt;span class="kwrd"&gt;private&lt;/span&gt; List&amp;lt;T&amp;gt; Union&amp;lt;T&amp;gt;( List&amp;lt;T&amp;gt; list1, List&amp;lt;T&amp;gt; list2, EqualityComparer&amp;lt;T&amp;gt; comparer&amp;nbsp;) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; var result = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;T&amp;gt;( );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt;( comparer == &lt;span class="kwrd"&gt;null&lt;/span&gt; ) comparer = EqualityComparer&amp;lt;T&amp;gt;.Default;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;for&lt;/span&gt;( &lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; list1.Count; i++ ) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt;( !result.Contains( list1[1], comparer ) ) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result.Add( list1[i] );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;for&lt;/span&gt;( &lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; list2.Count; i++ ) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt;( !result.Contains( list2[1], comparer ) ) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result.Add( list2[i] );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;return&lt;/span&gt; result;&lt;br /&gt;
}
&lt;/div&gt;
&lt;p&gt;Der Vergleich wird - wenn nicht anders angegeben - mit dem Default - EqualityComparer&amp;lt;T&amp;gt;&amp;nbsp;vollzogen.&lt;/p&gt;
&lt;p&gt;Genauso verh&amp;auml;lt sich auch die Union-Erweiterungsmethode, die wie folgt aufgerufen wird&lt;/p&gt;
&lt;div class="code"&gt;
list1.Union(&amp;nbsp;list2 );&lt;br /&gt;
list1.Union(&amp;nbsp;list2, EqualityComparer&amp;lt;T&amp;gt;.Default&amp;nbsp;);
&lt;/div&gt;</description>
      <link>http://gehirnwindung.de/post/2010/05/12/LINQ-Extension-Methods-Union.aspx</link>
      <author>wolfgang@gehirnwindung.de (Wolfgang)</author>
      <comments>http://gehirnwindung.de/post/2010/05/12/LINQ-Extension-Methods-Union.aspx#comment</comments>
      <guid>http://gehirnwindung.de/post.aspx?id=e65ec22c-c373-4468-b83d-7c130382a7d8</guid>
      <pubDate>Wed, 12 May 2010 01:00:00 +0100</pubDate>
      <category>C#</category>
      <dc:publisher>wolfgang@gehirnwindung.de (Wolfgang)</dc:publisher>
      <pingback:server>http://gehirnwindung.de/pingback.axd</pingback:server>
      <pingback:target>http://gehirnwindung.de/post.aspx?id=e65ec22c-c373-4468-b83d-7c130382a7d8</pingback:target>
      <slash:comments>9</slash:comments>
      <trackback:ping>http://gehirnwindung.de/trackback.axd?id=e65ec22c-c373-4468-b83d-7c130382a7d8</trackback:ping>
      <wfw:comment>http://gehirnwindung.de/post/2010/05/12/LINQ-Extension-Methods-Union.aspx#comment</wfw:comment>
      <wfw:commentRss>http://gehirnwindung.de/syndication.axd?post=e65ec22c-c373-4468-b83d-7c130382a7d8</wfw:commentRss>
    </item>
    <item>
      <title>LINQ Extension Methods: Zip</title>
      <description>&lt;p&gt;Mit der &lt;strong&gt;&lt;a title="MSDN: Zip extension method" href="http://msdn.microsoft.com/en-us/library/dd267698.aspx" target="_blank"&gt;Zip&lt;/a&gt;&lt;/strong&gt;-Erweiterungsmethode k&amp;ouml;nnen die Elemente zweier Sequenzen 1:1 zusammengef&amp;uuml;hrt werden. Das Ergebnis ist eine neue Sequenz.&lt;br /&gt;Zip ist somit eine spezialisierte Form von &lt;strong&gt;Join&lt;/strong&gt;, wobei der Index als Key verwendet wird. Daher ist es auch egal, wie viele Elemente die jeweiligen Listen haben - zur&amp;uuml;ckgegeben werden nur diejenigen Elemente, die in beiden Listen vorkommen.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://gehirnwindung.de/image.axd?picture=2010%2f5%2flinq-extension-methods-zip.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Angenommen, man hat die 2&amp;nbsp;Listen&amp;nbsp;&lt;span style="font-family: courier new,courier;"&gt;firstNames &lt;/span&gt;und&amp;nbsp;&lt;span style="font-family: courier new,courier;"&gt;lastNamens &lt;/span&gt;mit den Vor- bzw. Nachnamen&amp;nbsp;und m&amp;ouml;chte diese miteinander so kombinieren, dass eine&amp;nbsp;string-Sequenz herauskommt, in der diese Namen durch Komma getrennt zusammengesetzt stehen. Die beiden Listen sind entsprechend sortiert.&lt;/p&gt;
&lt;p&gt;Ohne Zip-Methode w&amp;uuml;rde das in etwa so aussehen&lt;/p&gt;
&lt;div class="code"&gt;
var&amp;nbsp;fullNames = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;();&lt;br /&gt;
&lt;span class="kwrd"&gt;int&lt;/span&gt; count = Math.Min( firstNames.Count, lastNames.Count );&lt;br /&gt;
&lt;span class="kwrd"&gt;for&lt;/span&gt;( &lt;span class="kwrd"&gt;int&lt;/span&gt; i=0; i&amp;lt;count; i++ ){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; fullNames.Add( &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format( &lt;span class="str"&gt;"{1},&amp;nbsp;{0}"&lt;/span&gt;, firstNames[i], lastNames[i] )&amp;nbsp;);&lt;br /&gt;
}
&lt;/div&gt;
&lt;p&gt;wobei die 2. Zeile vereinfacht werden kann, wenn sichergestellt ist, dass die beiden Listen gleich viele Elemente enthalten.&lt;/p&gt;
&lt;p&gt;Mit der Zip-Methode geht das wesentlich k&amp;uuml;rzer (und ist meiner Meinung nach auch etwas leichter lesbar).&lt;br /&gt;Wer noch Probleme mit den Lambda-Ausdr&amp;uuml;cken hat,&amp;nbsp;der kann&amp;nbsp;sich&amp;nbsp;mit dem Artikel &lt;a class="taggedlink" href="http://gehirnwindung.de/post/2009/05/07/Tanz-den-Lambda-mit-mir.aspx"&gt;&lt;span style="color: #3264b1;"&gt;Tanz den =&amp;gt; Lambda mit mir...&lt;/span&gt;&lt;/a&gt;&amp;nbsp;ein wenig einlesen.&lt;/p&gt;
&lt;div class="code"&gt;
var fullNames = firstNames.Zip(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lastNames,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;( firstName,&amp;nbsp;lastName ) =&amp;gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format( &lt;span class="str"&gt;"{1}, {0}"&lt;/span&gt;, firstName,&amp;nbsp;lastName )&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);
&lt;/div&gt;
&lt;p&gt;Der R&amp;uuml;ckgabewert ist nicht auf string-Sequenzen beschr&amp;auml;nkt. Es kann eine beliebige Klasse (z.B. eine anonymen Klasse) angegeben werden.&lt;/p&gt;
&lt;p&gt;Z.B. ist &lt;span style="font-family: courier new,courier;"&gt;fullNames &lt;/span&gt;hier&lt;/p&gt;
&lt;div class="code"&gt;
var fullNames = firstNames.Zip(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lastNames,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;( firstName,&amp;nbsp;lastName ) =&amp;gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FirstName = firstName,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LastName = lastName&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);
&lt;/div&gt;
&lt;p&gt;eine Sequenz von Klassen, in denen die Eigenschaften &lt;span style="font-family: courier new,courier;"&gt;FirstName &lt;/span&gt;und&amp;nbsp;&lt;span style="font-family: courier new,courier;"&gt;LastName &lt;/span&gt;gesetzt sind.&lt;/p&gt;</description>
      <link>http://gehirnwindung.de/post/2010/05/11/LINQ-Extension-Methods-Zip.aspx</link>
      <author>wolfgang@gehirnwindung.de (Wolfgang)</author>
      <comments>http://gehirnwindung.de/post/2010/05/11/LINQ-Extension-Methods-Zip.aspx#comment</comments>
      <guid>http://gehirnwindung.de/post.aspx?id=bef46162-39d7-4798-b541-f20bed82f84c</guid>
      <pubDate>Tue, 11 May 2010 18:51:00 +0100</pubDate>
      <category>C#</category>
      <dc:publisher>wolfgang@gehirnwindung.de (Wolfgang)</dc:publisher>
      <pingback:server>http://gehirnwindung.de/pingback.axd</pingback:server>
      <pingback:target>http://gehirnwindung.de/post.aspx?id=bef46162-39d7-4798-b541-f20bed82f84c</pingback:target>
      <slash:comments>6</slash:comments>
      <trackback:ping>http://gehirnwindung.de/trackback.axd?id=bef46162-39d7-4798-b541-f20bed82f84c</trackback:ping>
      <wfw:comment>http://gehirnwindung.de/post/2010/05/11/LINQ-Extension-Methods-Zip.aspx#comment</wfw:comment>
      <wfw:commentRss>http://gehirnwindung.de/syndication.axd?post=bef46162-39d7-4798-b541-f20bed82f84c</wfw:commentRss>
    </item>
    <item>
      <title>SQL Server: Von wiederhergestellten Datenbanken und verwaisten Benutzern</title>
      <description>&lt;p&gt;Immer wieder - jedoch&amp;nbsp;insgesamt selten und aus dem Grund auch leider immer wieder mit einer Suche verbunden - brauch ich nach der Wiederherstellung einer Datenbank eine Stored Procedure, um die Benutzer aus der wiederhergestellten Datenbank und die Logins des Servers wieder in "Einklang" zu bringen.&lt;/p&gt;
&lt;p&gt;Das Problem tritt z.B. auf, wenn die DB in einem anderem Server wiederhergestellt wird. Die Ursache ist, dass zwar evtl. der&amp;nbsp;Login- und der Username&amp;nbsp;gleich, die im Hintergrund wirkenden ID's aber unterschiedlich&amp;nbsp;sind.&lt;/p&gt;
&lt;p&gt;Nun. Hierf&amp;uuml;r gibt es die SP sp_change_users_login. Mit einem Administratorkonto (sysadmin oder db_owner) an der Datenbank anmelden und folgendes Ausf&amp;uuml;hren:&lt;/p&gt;
&lt;p&gt;Um eine &amp;Uuml;bersicht &amp;uuml;ber die Benutzer zu bekommen, die verwaist sind&lt;/p&gt;
&lt;div class="code"&gt;
&lt;span class="kwrd"&gt;EXEC&lt;/span&gt;&amp;nbsp;sp_change_users_login&amp;nbsp;@&lt;span class="kwrd"&gt;action&lt;/span&gt;=&lt;span class="str"&gt;'Report'&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;Wenn der Login inkl. Passwort bereits eingerichtet ist, der Benutzer aber noch zugeordnet werden muss.&lt;/p&gt;
&lt;div class="code"&gt;
&lt;span class="kwrd"&gt;EXEC&lt;/span&gt;&amp;nbsp;sp_change_users_login @&lt;span class="kwrd"&gt;action&lt;/span&gt;=&lt;span class="str"&gt;'Auto_Fix'&lt;/span&gt;, @userNamePattern=&lt;span class="str"&gt;'user'&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;Wenn der Benutzer zugeordnet und ein Login mit Passwort&amp;nbsp;erstellt werden&amp;nbsp;muss (ist der Login bereits vorhanden, wird @password ignoriert)&lt;/p&gt;
&lt;div class="code"&gt;
&lt;span class="kwrd"&gt;EXEC&lt;/span&gt;&amp;nbsp;sp_change_users_login&amp;nbsp;@&lt;span class="kwrd"&gt;action&lt;/span&gt;=&lt;span class="str"&gt;'Auto_Fix'&lt;/span&gt;,&amp;nbsp;@userNamePattern=&lt;span class="str"&gt;'user'&lt;/span&gt;,&amp;nbsp;@password=&lt;span class="str"&gt;'password'&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;Man kann auch einen Benutzer mit einem Login verbinden, wenn die beiden nicht den gleiche Namen haben. Dann sieht es so aus (auch hier kann noch optional ein Passwort angegeben werden)&lt;div class="code"&gt;
&lt;span class="kwrd"&gt;EXEC&lt;/span&gt;&amp;nbsp;sp_change_users_login&amp;nbsp;@&lt;span class="kwrd"&gt;action&lt;/span&gt;=&lt;span class="str"&gt;'Update_One'&lt;/span&gt;,&amp;nbsp;@userNamePattern=&lt;span class="str"&gt;'user'&lt;/span&gt;, @loginName=&lt;span class="str"&gt;'login'&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;So, und beim n&amp;auml;chsten Mal wei&amp;szlig; ich, wo ich suchen muss ;)&lt;/p&gt;</description>
      <link>http://gehirnwindung.de/post/2010/05/10/SQL-Server-Von-wiederhergestellten-Datenbanken-und-verwaisten-Benutzern.aspx</link>
      <author>wolfgang@gehirnwindung.de (Wolfgang)</author>
      <comments>http://gehirnwindung.de/post/2010/05/10/SQL-Server-Von-wiederhergestellten-Datenbanken-und-verwaisten-Benutzern.aspx#comment</comments>
      <guid>http://gehirnwindung.de/post.aspx?id=c6283fd0-8182-4ee6-8e73-e744783bc45b</guid>
      <pubDate>Mon, 10 May 2010 23:04:00 +0100</pubDate>
      <category>Microsoft SQL Server</category>
      <dc:publisher>wolfgang@gehirnwindung.de (Wolfgang)</dc:publisher>
      <pingback:server>http://gehirnwindung.de/pingback.axd</pingback:server>
      <pingback:target>http://gehirnwindung.de/post.aspx?id=c6283fd0-8182-4ee6-8e73-e744783bc45b</pingback:target>
      <slash:comments>7</slash:comments>
      <trackback:ping>http://gehirnwindung.de/trackback.axd?id=c6283fd0-8182-4ee6-8e73-e744783bc45b</trackback:ping>
      <wfw:comment>http://gehirnwindung.de/post/2010/05/10/SQL-Server-Von-wiederhergestellten-Datenbanken-und-verwaisten-Benutzern.aspx#comment</wfw:comment>
      <wfw:commentRss>http://gehirnwindung.de/syndication.axd?post=c6283fd0-8182-4ee6-8e73-e744783bc45b</wfw:commentRss>
    </item>
    <item>
      <title>BizTalk: Maps mit Referenzen zu externen Assemblies debuggen</title>
      <description>&lt;p&gt;Um BizTalk-Maps zu debuggen, die eine exterene Assembly aufrufen, reichen die Standard-M&amp;ouml;glichkeiten nicht mehr aus. Es erscheint die Fehlermeldung&lt;/p&gt;
&lt;p class="att"&gt;Cannot find the script or external object that implements prefix 'http://schemas.microsoft.com/BizTalk/2003/ScriptNS0'&lt;/p&gt;
&lt;p&gt;Um das zu umgehen, m&amp;uuml;ssen die externen Assemblies dem Debugger bekannt gemacht werden. Um allgemein XSLT zu debuggen kann, neben der M&amp;ouml;glichkeit dies &amp;uuml;ber das Men&amp;uuml; "XML" -&amp;gt; "Debug XSLT" zu erledigen, auch das Objekt &lt;a title="System.Xml.Xsl.XslCompiledTransform in der MSDN" href="http://msdn.microsoft.com/de-de/library/system.xml.xsl.xslcompiledtransform.aspx" target="_blank"&gt;XslCompiledTransform&lt;/a&gt; verwendet werden. Hierdurch ist man wesentlich flexibler und kann z.B. StartParameter angeben und/oder eben Extension Objects". Und da&amp;nbsp;eine&amp;nbsp;BizTalk-Map letztendlich auch nur ein XSLT-Dokument darstellt, gilt das auch daf&amp;uuml;r.&lt;/p&gt;
&lt;p&gt;Als erstes sollte man ein C#-Projekt zur BizTalk-Solution hinzuf&amp;uuml;gen. Darin wird lediglich unten stehende Methode eingef&amp;uuml;gt und die "Main"-Methode so angepasst, dass ein Aufruf der Methode "DebugXslt" mit den jeweiligen Parametern&amp;nbsp;erfolgt.&lt;/p&gt;
&lt;div class="code"&gt;
&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;&lt;/span&gt;
&lt;span class="rem"&gt;/// Helper Method to debug Maps with Extension Objects&lt;br /&gt;&lt;/span&gt;
&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;&lt;/span&gt;
&lt;span class="rem"&gt;/// &amp;lt;param name="mapXslt"&amp;gt;Path to xslt-file generated by the MapperCompiler (Validate Map)&amp;lt;/param&amp;gt;&lt;br /&gt;&lt;/span&gt;
&lt;span class="rem"&gt;/// &amp;lt;param name="inputXml"&amp;gt;Path to input-file (Test Map)&amp;lt;/param&amp;gt;&lt;br /&gt;&lt;/span&gt;
&lt;span class="rem"&gt;/// &amp;lt;param name="extensionObjectsXml"&amp;gt;Path to Extension Object XML (Validate Map)&amp;lt;/param&amp;gt;&lt;br /&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; DebugXslt( &lt;span class="kwrd"&gt;string&lt;/span&gt; mapXslt, &lt;span class="kwrd"&gt;string&lt;/span&gt; inputXml, &lt;span class="kwrd"&gt;string&lt;/span&gt; extensionObjectsXml ) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="kwrd"&gt;if&lt;/span&gt;( !&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty( mapXslt ) &amp;amp;&amp;amp; !&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty( inputXml ) &amp;amp;&amp;amp; File.Exists( mapXslt ) &amp;amp;&amp;amp; File.Exists( inputXml ) ) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XslCompiledTransform xslt = &lt;span class="kwrd"&gt;new&lt;/span&gt; XslCompiledTransform( &lt;span class="kwrd"&gt;true&lt;/span&gt; );&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//&amp;nbsp;allow embedded scripts and document()-function&lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XsltSettings xsltSettings = &lt;span class="kwrd"&gt;new&lt;/span&gt; XsltSettings( &lt;span class="kwrd"&gt;true&lt;/span&gt;, &lt;span class="kwrd"&gt;true&lt;/span&gt; );&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;// Load the style sheet.&lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xslt.Load( mapXslt, xsltSettings, &lt;span class="kwrd"&gt;null&lt;/span&gt; );&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="rem"&gt;// resolve extension objects&lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;XsltArgumentList xsltArgs = &lt;span class="kwrd"&gt;new&lt;/span&gt; XsltArgumentList( );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="kwrd"&gt;if&lt;/span&gt;( !&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(extensionObjectsXml) &amp;amp;&amp;amp; File.Exists( extensionObjectsXml ) ) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlReaderSettings rsettings = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlReaderSettings( );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rsettings.IgnoreComments = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rsettings.IgnoreProcessingInstructions = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rsettings.IgnoreWhitespace = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;using&lt;/span&gt;( XmlReader reader = XmlReader.Create( extensionObjectsXml, rsettings ) ) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; reader.ReadStartElement( &lt;span class="str"&gt;"ExtensionObjects"&lt;/span&gt; );&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;do&lt;/span&gt; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;string&lt;/span&gt; ns = &lt;span class="str"&gt;""&lt;/span&gt;, an = &lt;span class="str"&gt;""&lt;/span&gt;, cn = &lt;span class="str"&gt;""&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;while&lt;/span&gt;( reader.MoveToNextAttribute( ) ) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="kwrd"&gt;switch&lt;/span&gt;( reader.LocalName ) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;"Namespace"&lt;/span&gt;:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; reader.ReadAttributeValue( );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ns = reader.Value;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;"AssemblyName"&lt;/span&gt;:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; reader.ReadAttributeValue( );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;an = reader.Value;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;"ClassName"&lt;/span&gt;:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; reader.ReadAttributeValue( );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cn = reader.Value;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="rem"&gt;// load type and add instance&amp;nbsp;to xslt-Arguments&lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="kwrd"&gt;if&lt;/span&gt;( !&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty( ns ) &amp;amp;&amp;amp; !&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty( an ) &amp;amp;&amp;amp; !&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty( cn ) ) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Type t = Type.GetType( Assembly.CreateQualifiedName( an, cn ) );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xsltArgs.AddExtensionObject( ns, System.Activator.CreateInstance( t, &lt;span class="kwrd"&gt;false&lt;/span&gt; ) );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;span class="kwrd"&gt;while&lt;/span&gt;( reader.ReadToNextSibling( &lt;span class="str"&gt;"ExtensionObject"&lt;/span&gt; ) );&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; reader.Close( );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="rem"&gt;// Execute the transformation.&lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="kwrd"&gt;using&lt;/span&gt;( XmlWriter writer = XmlWriter.Create( TextWriter.Null ) ) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xslt.Transform( inputXml, xsltArgs, writer );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writer.Close( );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xsltArgs.Clear( );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
}
&lt;/div&gt;
&lt;p&gt;
&lt;table border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Parameter&lt;/td&gt;
&lt;td&gt;Beschreibung&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mapXslt&lt;/td&gt;
&lt;td&gt;Pfad zur XSLT-Datei&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;inputXml&lt;/td&gt;
&lt;td&gt;Pfad zur der Datei, die die Testdaten enth&amp;auml;lt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;extensionObjectsXml&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Pfad zur Datei, in der die Erweiterungsobjekte stehen (darf leer sein)&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;Nun m&amp;uuml;ssen noch die einzelnen Pfade ermittelt werden. Mittels "Validate Map" (rot im Bild)&amp;nbsp;werden die XSLT-Datei und die extensionObjects-Datei erstellt. Im Output-Window erscheinen die jeweiligen Pfade und m&amp;uuml;ssen nur noch &amp;uuml;bernommen werden.&lt;br /&gt;Hat man kein XML-Dokument, mit dem man Testen kann, sondern ein natives Format, so hilft "Test Map".&amp;nbsp;Auch hier erscheint im Output-Window der Pfad mit dem Hinweis "Test Map used the following file".&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img src="http://gehirnwindung.de/image.axd?picture=2010%2f5%2fDebug-Biztalk-Map-Validate-Map.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Sind nun alle 3 Pfade ermittelt und eingetragen, kann es auch&amp;nbsp;endlich losgehen. Damit der Debugger nicht einfach durchl&amp;auml;uft, sollte die XSLT-Datei ge&amp;ouml;ffnet und eine Haltepunkt eingef&amp;uuml;gt werden.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img src="http://gehirnwindung.de/image.axd?picture=2010%2f5%2fDebug-Biztalk-Map-XSLT-Breakpoint.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Nun muss das Projekt gestartet werden. Dazu mit der rechten Maustaste auf das Projekt zeigen und "Debug" -&amp;gt; "Start new instance" ausf&amp;uuml;hren.&lt;br /&gt;Alternativ das Projekt als StartUp-Project einrichten und F5 dr&amp;uuml;cken...&lt;/p&gt;
&lt;p&gt;&lt;img src="http://gehirnwindung.de/image.axd?picture=2010%2f5%2fDebug-Biztalk-Map-XSLT-Active.png" alt="" /&gt;&lt;/p&gt;</description>
      <link>http://gehirnwindung.de/post/2010/05/05/BizTalk-Maps-mit-Referenzen-zu-externen-Assemblies-debuggen.aspx</link>
      <author>wolfgang@gehirnwindung.de (Wolfgang)</author>
      <comments>http://gehirnwindung.de/post/2010/05/05/BizTalk-Maps-mit-Referenzen-zu-externen-Assemblies-debuggen.aspx#comment</comments>
      <guid>http://gehirnwindung.de/post.aspx?id=aad74bec-2639-4180-b719-2d6a3d78fac5</guid>
      <pubDate>Wed, 05 May 2010 14:25:00 +0100</pubDate>
      <category>Microsoft BizTalk Server</category>
      <dc:publisher>wolfgang@gehirnwindung.de (Wolfgang)</dc:publisher>
      <pingback:server>http://gehirnwindung.de/pingback.axd</pingback:server>
      <pingback:target>http://gehirnwindung.de/post.aspx?id=aad74bec-2639-4180-b719-2d6a3d78fac5</pingback:target>
      <slash:comments>13</slash:comments>
      <trackback:ping>http://gehirnwindung.de/trackback.axd?id=aad74bec-2639-4180-b719-2d6a3d78fac5</trackback:ping>
      <wfw:comment>http://gehirnwindung.de/post/2010/05/05/BizTalk-Maps-mit-Referenzen-zu-externen-Assemblies-debuggen.aspx#comment</wfw:comment>
      <wfw:commentRss>http://gehirnwindung.de/syndication.axd?post=aad74bec-2639-4180-b719-2d6a3d78fac5</wfw:commentRss>
    </item>
    <item>
      <title>The Type initializer for '{0}' threw an exception - oder warum die Reihenfolge statischer Felder nicht egal ist...</title>
      <description>&lt;p&gt;Heute hab ich&amp;nbsp;in einem Projekt&amp;nbsp;meine Klassen etwas aufger&amp;auml;umt und dabei auch die Reihenfolge der Methoden, Eigenschaften&amp;nbsp;und Variablen angepasst. Der Build des Projekts war erfolgreich - die Tests danach aber&amp;nbsp;nicht. Es erschien der Fehler:&lt;/p&gt;
&lt;p class="att"&gt;The Type initializer for '{0}' threw an exception.&lt;/p&gt;
&lt;p&gt;Da ich mir aber sicher war, dass ich wirklich nur Elemente auf Klassenebene verschoben hab, hat mich das wirklich sehr verwundert...&amp;nbsp;Aus dem StackTrace konnte man entnehmen, dass es sich um den statische Konstruktor (.cctor()) handelt. Nun, ich schreibe oft statische Konstruktoren, aber in aller Regel &lt;a title="C# and beforefieldinit" href="http://www.yoda.arachsys.com/csharp/beforefieldinit.html"&gt;ohne jeglichen Inhalt&lt;/a&gt;, weswegen der Grad&amp;nbsp;der Verwunderung dementsprechend stieg.&lt;/p&gt;
&lt;p&gt;Kurzum, der Fehler liegt wirklich an der Reihenfolge, allerdings geht es hierbei ausschlie&amp;szlig;lich um statische Felder, die in der richtigen Reihenfolge definiert sein m&amp;uuml;ssen. Bei genauerer Betrachtung ist das auch nur logisch. Ich h&amp;auml;tte mir an der Stelle eine sch&amp;ouml;ne Kompiler-Fehlermeldung gew&amp;uuml;nscht.&lt;/p&gt;
&lt;p&gt;Ein einfaches Beispiel zeigt, worum es genau geht.&lt;/p&gt;
&lt;div class="code"&gt;
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Test {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; &lt;span class="kwrd"&gt;decimal&lt;/span&gt; x =&amp;nbsp;1 / y;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt;&amp;nbsp;&lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;nbsp;y = 8;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;static&lt;/span&gt; Test() { }&lt;br /&gt;
}
&lt;/div&gt;
&lt;p&gt;Sobald eine Instanz der Klasse erstellt wird, kommt es zu einer Division durch 0 (bzw. zum Versuch desselben) und damit zu besagter Ausnahme.&lt;br /&gt;Zur Veranschaulichung hier noch das &amp;Auml;quivalent. y ist bei der ersten Verwendung noch mit dem default-Wert belegt - und der ist nunmal 0.&lt;/p&gt;
&lt;div class="code"&gt;
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Test {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; &lt;span class="kwrd"&gt;decimal&lt;/span&gt; x;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt;&amp;nbsp;&lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;nbsp;y;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;static&lt;/span&gt; Test() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x =&amp;nbsp;1 / y;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;y =&amp;nbsp;8;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
}
&lt;/div&gt;
&lt;p&gt;Damit ist aber auch klar, dass man die Initialisierung statischer Variablen innerhalb des statischen Konstruktors&amp;nbsp;selbst vornehmen sollte - zumindest wenn diese von anderen Variablen abh&amp;auml;ngen.&lt;/p&gt;</description>
      <link>http://gehirnwindung.de/post/2010/04/29/The-Type-initializer-threw-an-exception-die-Reihenfolge-statischer-Felder.aspx</link>
      <author>wolfgang@gehirnwindung.de (Wolfgang)</author>
      <comments>http://gehirnwindung.de/post/2010/04/29/The-Type-initializer-threw-an-exception-die-Reihenfolge-statischer-Felder.aspx#comment</comments>
      <guid>http://gehirnwindung.de/post.aspx?id=8e6d999d-80be-4380-b696-f2b190c18674</guid>
      <pubDate>Thu, 29 Apr 2010 18:06:00 +0100</pubDate>
      <category>C#</category>
      <dc:publisher>wolfgang@gehirnwindung.de (Wolfgang)</dc:publisher>
      <pingback:server>http://gehirnwindung.de/pingback.axd</pingback:server>
      <pingback:target>http://gehirnwindung.de/post.aspx?id=8e6d999d-80be-4380-b696-f2b190c18674</pingback:target>
      <slash:comments>10</slash:comments>
      <trackback:ping>http://gehirnwindung.de/trackback.axd?id=8e6d999d-80be-4380-b696-f2b190c18674</trackback:ping>
      <wfw:comment>http://gehirnwindung.de/post/2010/04/29/The-Type-initializer-threw-an-exception-die-Reihenfolge-statischer-Felder.aspx#comment</wfw:comment>
      <wfw:commentRss>http://gehirnwindung.de/syndication.axd?post=8e6d999d-80be-4380-b696-f2b190c18674</wfw:commentRss>
    </item>
    <item>
      <title>BizTalk: Zugriff auf UNB-Segment und AS2-Eigenschaften innerhalb Orchestration</title>
      <description>&lt;p&gt;In einer Orchestration bekommt man es normalerweise nur noch mit den eigentlichen Daten einer Nachricht zu tun. So sind bei EDIFACT-Nachrichten z.B. die UNA- und&amp;nbsp;UNB-Segmente nicht Teil des Schemas. Weiterhin fehlen auch die AS2-Header&amp;nbsp;und eben alles, was nicht unbedingt ben&amp;ouml;tigt wird. Das hat&amp;nbsp;seine Vorteile&amp;nbsp;(ist aufger&amp;auml;umt), manchmal&amp;nbsp;wird aber auch&amp;nbsp;der Zugriff auf diese&amp;nbsp;Daten ben&amp;ouml;tigt.&lt;/p&gt;
&lt;p&gt;L&amp;auml;uft&amp;nbsp;eine Nachricht mal auf einen Fehler, so kann man in den "Message Details" erkennen, dass verschiedene "Context-Properties" aus eben diesen sonst nicht sichtbaren Segmenten (oder&amp;nbsp;aus dem Protokoll)&amp;nbsp;zu den einzelnen Nachrichten zugewiesen sind.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://gehirnwindung.de/image.axd?picture=2010%2f2%2fedifact-context-properties.gif" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Auf diese Kontexteigenschaften kann man mittels Message(ContextProperty) innerhalb einer &lt;img style="vertical-align: middle;" src="http://gehirnwindung.de/image.axd?picture=2010%2f2%2fbiztalk-expression-shape.gif" alt="BizTalk Server Expression Shape in Orchestration" /&gt;&amp;nbsp;Expression Shape&amp;nbsp;zugreifen. Im Falle von EDIFACT-Eigenschaften muss aber - damit man die Auswahl der Context Properties &amp;uuml;berhaupt zu sehen bekommt - noch eine Referenz auf die DLL &lt;strong&gt;Microsoft.BizTalk.Edi.BaseArtifacts&lt;/strong&gt; (oft zu finden unter C:\Program Files\Microsoft BizTalk Server 2006\Microsoft.BizTalk.Edi.BaseArtifacts.dll) zum Projekt hinzugef&amp;uuml;gt werden.&lt;/p&gt;
&lt;p&gt;Mit dieser Referenz sind dann Kontexteigenschaften in den Namespaces &lt;strong&gt;EDI &lt;/strong&gt;(f&amp;uuml;r EDIFACT und X12 - Eigenschaften) und &lt;strong&gt;EdiIntAs &lt;/strong&gt;(f&amp;uuml;r AS2 - Eigenschaften) vorhanden.&lt;/p&gt;</description>
      <link>http://gehirnwindung.de/post/2010/02/15/BizTalk-Zugriff-auf-UNB-Segment-und-AS2-Eigenschaften-in-Orchestration.aspx</link>
      <author>wolfgang@gehirnwindung.de (Wolfgang)</author>
      <comments>http://gehirnwindung.de/post/2010/02/15/BizTalk-Zugriff-auf-UNB-Segment-und-AS2-Eigenschaften-in-Orchestration.aspx#comment</comments>
      <guid>http://gehirnwindung.de/post.aspx?id=387db9c9-d95a-4ad0-a552-a08186b23198</guid>
      <pubDate>Mon, 15 Feb 2010 21:30:00 +0100</pubDate>
      <category>Microsoft BizTalk Server</category>
      <dc:publisher>wolfgang@gehirnwindung.de (Wolfgang)</dc:publisher>
      <pingback:server>http://gehirnwindung.de/pingback.axd</pingback:server>
      <pingback:target>http://gehirnwindung.de/post.aspx?id=387db9c9-d95a-4ad0-a552-a08186b23198</pingback:target>
      <slash:comments>4</slash:comments>
      <trackback:ping>http://gehirnwindung.de/trackback.axd?id=387db9c9-d95a-4ad0-a552-a08186b23198</trackback:ping>
      <wfw:comment>http://gehirnwindung.de/post/2010/02/15/BizTalk-Zugriff-auf-UNB-Segment-und-AS2-Eigenschaften-in-Orchestration.aspx#comment</wfw:comment>
      <wfw:commentRss>http://gehirnwindung.de/syndication.axd?post=387db9c9-d95a-4ad0-a552-a08186b23198</wfw:commentRss>
    </item>
    <item>
      <title>BizTalk: Checkliste für das Senden von AS2-Nachrichten</title>
      <description>&lt;p&gt;Nach der Checkliste f&amp;uuml;r das&amp;nbsp;&lt;a title="Receive BizTalk AS2-Messages" href="http://gehirnwindung.de/post/2010/01/15/BizTalk-Checkliste-fur-AS2-Empfang.aspx"&gt;Empfangen von Nachrichten &amp;uuml;ber AS2&lt;/a&gt;, muss quasi ja auch eine Checkliste f&amp;uuml;r das Senden bereitgestellt werden ;)&amp;nbsp;Diese Liste&amp;nbsp;ist&amp;nbsp;wesentlich&amp;nbsp;k&amp;uuml;rzer, wenn es auch mehr&amp;nbsp;M&amp;ouml;glichkeiten gibt,&amp;nbsp;als&amp;nbsp;hier&amp;nbsp;dargestellt...&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Send Port&lt;br /&gt;- f&amp;uuml;r asynchrone MDN: &lt;strong&gt;One-way&lt;br /&gt;&lt;/strong&gt;- f&amp;uuml;r synchrone MDN: &lt;strong&gt;Solicit-Response&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Type: HTTP
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Destionation URL&lt;/strong&gt;: Die URL, die beim Partner eingerichtet&amp;nbsp;wird (auf beiden Seiten sollte die URL exakt gleich angegeben werden - inkl. Gro&amp;szlig;-/Kleinschreibung)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enabled chunked encoding&lt;/strong&gt; deaktivieren&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Send pipeline&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;AS2Send (f&amp;uuml;r alle m&amp;ouml;glichen Daten),&lt;/li&gt;
&lt;li&gt;AS2EDISend (f&amp;uuml;r&amp;nbsp;EDI-Daten)&amp;nbsp;oder&lt;/li&gt;
&lt;li&gt;eine eigene Send Pipeline, in der&amp;nbsp;die &lt;strong&gt;AS2 Encoder&lt;/strong&gt;-Component verwendet wird&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Sender Party
&lt;ul&gt;
&lt;li&gt;General
&lt;ul&gt;
&lt;li&gt;Send Ports (den oben erstellen Port ausw&amp;auml;hlen, alternativ geht die Zuweisung auch &amp;uuml;ber einen &lt;strong&gt;Role Link&lt;/strong&gt; oder wie unten beschrieben &amp;uuml;ber den &lt;strong&gt;Alias&lt;/strong&gt;-Namen)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AS2 Properties -&amp;gt; &lt;strong&gt;Party as AS2 Message Receiver&lt;/strong&gt; (nicht verwirren lassen)
&lt;ul&gt;
&lt;li&gt;Einstellungen ab "&lt;strong&gt;Outbound AS2 Message&lt;/strong&gt;" entsprechend der Vereinbarung mit dem Partner einstellen&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AS2-From&lt;/strong&gt; und &lt;strong&gt;AS2-To&lt;/strong&gt; erscheinen wie hier angegeben im Head-Bereich der Nachricht und damit beim Partner&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Asynchrone MDNs m&amp;uuml;ssen - wie eine beliebig andere AS2-Nachricht - empfangen werden k&amp;ouml;nnen. An welche Adresse die MDN geschickt wird,&amp;nbsp;kann in den Party-Einstellungen angegeben (&lt;strong&gt;Receipt-Delivery-Option&lt;/strong&gt;) werden. Um die Verarbeitung dieser Nachrichten k&amp;uuml;mmert sich allerdings der BizTalk-Server selbst.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Die&amp;nbsp;Party Resolution f&amp;uuml;r ausgehende Nachrichten (also das Finden der Party, die die Nachricht empf&amp;auml;ngt und bei der die entsprechenden Einstellungen vorgenommen wurden) kann auch anders erfolgen. Das&amp;nbsp;zuweisen des Send-Ports zu einer Party&amp;nbsp;wird aber (meiner Erfahrung nach) sehr h&amp;auml;ufig verwendet. Es sollte&amp;nbsp;allerdings&amp;nbsp;auch ausreichen, einer Party einen &lt;strong&gt;EDIINT-AS2-To&lt;/strong&gt;&amp;nbsp;-&amp;nbsp;Alias und der ausgehenden Nachricht den &lt;strong&gt;AS2-To&lt;/strong&gt; - Header zuzuweisen - getestet hab ich das noch nicht.&lt;/p&gt;
&lt;p&gt;F&amp;uuml;r die Signierung und Verschl&amp;uuml;sselung der Nachricht und der Signierung der MDN m&amp;uuml;ssen zus&amp;auml;tzlich Zertifikate installiert und an bestimmten Stellen ausgew&amp;auml;hlt werden, die in dieser&amp;nbsp;&lt;a title="Richtigen Zertifikatsspeicher f&amp;uuml;r AS2-Signierung und Verschl&amp;uuml;sselung w&amp;auml;hlen" href="http://gehirnwindung.de/post/2010/01/14/BizTalk-Wohin-mit-den-AS2-Zertifikaten.aspx"&gt;kleinen &amp;Uuml;bersicht&lt;/a&gt;&amp;nbsp;beschrieben werden.&lt;/p&gt;</description>
      <link>http://gehirnwindung.de/post/2010/01/20/BizTalk-Checkliste-fur-das-Senden-von-AS2-Nachrichten.aspx</link>
      <author>wolfgang@gehirnwindung.de (Wolfgang)</author>
      <comments>http://gehirnwindung.de/post/2010/01/20/BizTalk-Checkliste-fur-das-Senden-von-AS2-Nachrichten.aspx#comment</comments>
      <guid>http://gehirnwindung.de/post.aspx?id=28b4ea1f-1010-42e5-816a-4343b1d4c5ff</guid>
      <pubDate>Wed, 20 Jan 2010 21:29:00 +0100</pubDate>
      <category>Microsoft BizTalk Server</category>
      <dc:publisher>wolfgang@gehirnwindung.de (Wolfgang)</dc:publisher>
      <pingback:server>http://gehirnwindung.de/pingback.axd</pingback:server>
      <pingback:target>http://gehirnwindung.de/post.aspx?id=28b4ea1f-1010-42e5-816a-4343b1d4c5ff</pingback:target>
      <slash:comments>8</slash:comments>
      <trackback:ping>http://gehirnwindung.de/trackback.axd?id=28b4ea1f-1010-42e5-816a-4343b1d4c5ff</trackback:ping>
      <wfw:comment>http://gehirnwindung.de/post/2010/01/20/BizTalk-Checkliste-fur-das-Senden-von-AS2-Nachrichten.aspx#comment</wfw:comment>
      <wfw:commentRss>http://gehirnwindung.de/syndication.axd?post=28b4ea1f-1010-42e5-816a-4343b1d4c5ff</wfw:commentRss>
    </item>
    <item>
      <title>ASP.NET: Precompilation und die Fehlermeldung Directory '{0}' does not exist. Failed to start monitoring file changes</title>
      <description>&lt;p&gt;Unter etwas besonderen Umst&amp;auml;nden kommt es beim Aufruf einer ASP.NET Seite zu&amp;nbsp;dieser Fehlermeldung.&lt;/p&gt;
&lt;p&gt;&lt;span class="att"&gt;System.Web.HttpException (0x80070002): Directory '{0}' does not exist. Failed to start monitoring file changes.&lt;/span&gt;&lt;/p&gt;
&lt;ul style="list-style-type:none; text-indent: -20px;"&gt;
&lt;li&gt;System.Web.FileChangesMonitor.FindDirectoryMonitor(String dir, Boolean addIfNotFound, Boolean throwOnError) +334&lt;/li&gt;
&lt;li&gt;System.Web.FileChangesMonitor.StartMonitoringPath(String alias, FileChangeEventHandler callback, FileAttributesData&amp;amp; fad) +805&lt;/li&gt;
&lt;li&gt;System.Web.Caching.CacheDependency.Init(Boolean isPublic, String[] filenamesArg, String[] cachekeysArg, CacheDependency dependency, DateTime utcStart) +2558&lt;/li&gt;
&lt;li&gt;System.Web.Hosting.MapPathBasedVirtualPathProvider.GetCacheDependency(String virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart) +334&lt;/li&gt;
&lt;li&gt;System.Web.ResponseDependencyList.CreateCacheDependency(CacheDependencyType dependencyType, CacheDependency dependency) +539&lt;/li&gt;
&lt;li&gt;System.Web.HttpResponse.CreateCacheDependencyForResponse(CacheDependency dependencyVary) +62&lt;/li&gt;
&lt;li&gt;System.Web.Caching.OutputCacheModule.InsertResponse(HttpResponse response, HttpContext context, String keyRawResponse, HttpCachePolicySettings settings, CachedVary cachedVary, CachedRawResponse memoryRawResponse) +758&lt;/li&gt;
&lt;li&gt;System.Web.Caching.OutputCacheModule.OnLeave(Object source, EventArgs eventArgs) +8782064&lt;/li&gt;
&lt;li&gt;System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +68&lt;/li&gt;
&lt;li&gt;System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean&amp;amp; completedSynchronously) +75&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Ursache&lt;/h2&gt;
&lt;p&gt;Damit es &amp;uuml;berhaupt&amp;nbsp;dazu kommen kann, m&amp;uuml;ssen folgende Bedingungen gegeben sein:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vorkompilierung / Precompilation&lt;/li&gt;
&lt;li&gt;Webseite nicht aktualisierbar / Website not updatable&lt;/li&gt;
&lt;li&gt;WebUserControl und/oder MasterPage in eigenem Verzeichnis&lt;/li&gt;
&lt;li&gt;Verwendung von OutputCache&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Das Problem ist, dass f&amp;uuml;r MasterPages und WebUserControls keine Dummy-Datei vorgehalten werden m&amp;uuml;ssen, da diese über den IIS nicht direkt aufgerufen werden. Dadurch werden aber auch Verzeichnisse, in denen sonst keine anderen Dateien liegen, nicht erstellt. Bei der Verwendung von OutputCache werden nun alle abh&amp;auml;ngigen Dateien &amp;uuml;berpr&amp;uuml;ft. Dabei ist es kein Problem, wenn eine Datei fehlt - das Verzeichnis muss allerdings vorhanden sein.&lt;/p&gt;
&lt;h2&gt;L&amp;ouml;sung&lt;/h2&gt;
&lt;p&gt;Die L&amp;ouml;sung ist denkbar einfach. Die Verzeichnisse m&amp;uuml;ssen angelegt werden...&lt;/p&gt;
&lt;p&gt;Innerhalb eines &lt;strong&gt;Web Deployment Projekts&lt;/strong&gt; (*.wdproj) kann man dazu&amp;nbsp;folgendes Target verwenden. In leicht abgewandelter Form (die Pfade und Eigenschaften&amp;nbsp;m&amp;uuml;sste man anpassen) geht es so nat&amp;uuml;rlich auch innerhalb eines beliebig anderen MSBuild-Projekts.&lt;/p&gt;
&lt;div class="code"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Target&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;="CreateEmptyDirectoriesForOutputCache"&lt;/span&gt;&lt;br /&gt;       &lt;span class="attr"&gt;Condition&lt;/span&gt;&lt;span class="kwrd"&gt;="'@(EnableUpdateable)' != 'true'"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="rem"&gt;&amp;lt;!--&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;   use this target to create empty directories as a workaround for a bug in&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;   precompilation in conjunction with @OutputCache and updatable=false&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;   see http://gehirnwindung.de/post/2010/01/18/ASPNET-Precompilation-und-die-Fehlermeldung-Directory-does-not-exist-Failed-to-start-monitoring-file-changes.aspx for more details&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;   --&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;CreateItem&lt;/span&gt; &lt;span class="attr"&gt;Condition&lt;/span&gt;&lt;span class="kwrd"&gt;="'$(EnableCopyBeforeBuild)' != 'true' and '@(ExcludeFromBuild)' == ''"&lt;/span&gt;&lt;br /&gt;          &lt;span class="attr"&gt;Include&lt;/span&gt;&lt;span class="kwrd"&gt;="$(SourceWebPhysicalPath)\**\*.master;$(SourceWebPhysicalPath)\**\*.ascx"&lt;/span&gt;&lt;br /&gt;          &lt;span class="attr"&gt;Exclude&lt;/span&gt;&lt;span class="kwrd"&gt;="$(SourceWebPhysicalPath)\**\.svn\**\*.*"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Output&lt;/span&gt; &lt;span class="attr"&gt;ItemName&lt;/span&gt;&lt;span class="kwrd"&gt;="EmptyFilePaths"&lt;/span&gt; &lt;span class="attr"&gt;TaskParameter&lt;/span&gt;&lt;span class="kwrd"&gt;="Include"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;CreateItem&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;CreateItem&lt;/span&gt; &lt;span class="attr"&gt;Condition&lt;/span&gt;&lt;span class="kwrd"&gt;="'$(EnableCopyBeforeBuild)' == 'true' or '@(ExcludeFromBuild)' != ''"&lt;/span&gt;&lt;br /&gt;          &lt;span class="attr"&gt;Include&lt;/span&gt;&lt;span class="kwrd"&gt;="$(CopyBeforeBuildTargetPath)\**\*.master;$(CopyBeforeBuildTargetPath)\**\*.ascx"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Output&lt;/span&gt; &lt;span class="attr"&gt;ItemName&lt;/span&gt;&lt;span class="kwrd"&gt;="EmptyFilePaths"&lt;/span&gt; &lt;span class="attr"&gt;TaskParameter&lt;/span&gt;&lt;span class="kwrd"&gt;="Include"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;CreateItem&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;MakeDir&lt;/span&gt; &lt;span class="attr"&gt;Directories&lt;/span&gt;&lt;span class="kwrd"&gt;="$(WDTargetDir)%(EmptyFilePaths.RecursiveDir)"&lt;/span&gt; &lt;span class="attr"&gt;ContinueOnError&lt;/span&gt;&lt;span class="kwrd"&gt;="true"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Target&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Damit die Verzeichnisse angelegt werden, muss das Target auch aufgerufen werden. Z.B. mittels&lt;/p&gt;
&lt;div class="code"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Target&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;="AfterBuild"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;CallTarget&lt;/span&gt; &lt;span class="attr"&gt;Targets&lt;/span&gt;&lt;span class="kwrd"&gt;="CreateEmptyDirectoriesForOutputCache"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Target&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Falls &amp;lt;ExcludeFromBuild&amp;gt;-Tags enthalten sind (oder EnableCopyBeforeBuild=true ist), werden die *.ascx und *.master-Dateien innerhalb der Kopie (Eigenschaft CopyBeforeBuildTargetPath)&amp;nbsp;gesucht. In dem Fall sollte man - falls vorhanden - mit Hilfe von &amp;lt;ExcludeFromBuild&amp;gt; z.B. Subversion-Dateien ausschlie&amp;szlig;en, ansonsten werden diese Pfade auch angelegt.&lt;/p&gt;
&lt;p&gt;Sind dagegen keine &amp;lt;ExcludeFromBuild&amp;gt;-Tags vorhanden (und die Eigenschaft EnableCopyBeforeBuild=false), dann wird das physikalische Web-Verzeichnis nach den Dateien durchsucht. Hier muss gegebenenfalls das Exclude-Attribut des ersten &amp;lt;CreateItem&amp;gt;-Tags angepasst werden. Momentan werden damit die Dateien innerhalb der .svn-Ordner ausgeblendet.&lt;/p&gt;
&lt;p&gt;Mit Hilfe &lt;a title="MSBuild-Target: Create empty directory for outputcache" href="http://gehirnwindung.de/file.axd?file=2010%2f1%2fKlugeSoftware.WebDeployment.CreateEmptyDirectoriesForOutputCache.zip"&gt;dieser Targets-Datei&lt;/a&gt; kann der Code einfach wiederverwendet werden. Per &amp;lt;Import&amp;gt;&amp;nbsp;wird das Target innerhalb des Web Deployment Projekts&amp;nbsp;geladen.&amp;nbsp;Will man es f&amp;uuml;r alle zuk&amp;uuml;nftigen Projekte anpassen, sollte man die entsprechende Vorlage&amp;nbsp;&amp;auml;ndern (zu finden unter C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Packages\WebDeploy.wdproj).&lt;br /&gt;Alternativ dazu kann man diesen Import auch innerhalb der Datei C:\Program Files (x86)\MSBuild\Microsoft\WebDeployment\v9.0\Microsoft.WebDeployment.targets einf&amp;uuml;gen, dann gilt es f&amp;uuml;r alle Projekte.&lt;/p&gt;
&lt;p&gt;Egal wo es zum Schlu&amp;szlig; nun steht, es&amp;nbsp;sieht dann ungef&amp;auml;hr so aus (lediglich der Pfad muss angepasst werden).&lt;/p&gt;
&lt;div class="code"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Import&lt;/span&gt; &lt;span class="attr"&gt;Project&lt;/span&gt;&lt;span class="kwrd"&gt;="./KlugeSoftware.WebDeployment.CreateEmptyDirectoriesForOutputCache.targets"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Ein expliziter Aufruf des Targets&amp;nbsp;ist hierbei nicht n&amp;ouml;tig.&lt;/p&gt;
&lt;p&gt;&lt;a title="MSBuild-Target: Create empty directory for outputcache" href="http://gehirnwindung.de/file.axd?file=2010%2f1%2fKlugeSoftware.WebDeployment.CreateEmptyDirectoriesForOutputCache.zip"&gt;Download (1,16 kb)&lt;/a&gt;&lt;/p&gt;</description>
      <link>http://gehirnwindung.de/post/2010/01/18/ASPNET-Precompilation-und-die-Fehlermeldung-Directory-does-not-exist-Failed-to-start-monitoring-file-changes.aspx</link>
      <author>wolfgang@gehirnwindung.de (Wolfgang)</author>
      <comments>http://gehirnwindung.de/post/2010/01/18/ASPNET-Precompilation-und-die-Fehlermeldung-Directory-does-not-exist-Failed-to-start-monitoring-file-changes.aspx#comment</comments>
      <guid>http://gehirnwindung.de/post.aspx?id=8e53cc64-c85c-4ef6-b85c-b5adc74a7f78</guid>
      <pubDate>Mon, 18 Jan 2010 00:26:00 +0100</pubDate>
      <category>ASP.NET</category>
      <dc:publisher>wolfgang@gehirnwindung.de (Wolfgang)</dc:publisher>
      <pingback:server>http://gehirnwindung.de/pingback.axd</pingback:server>
      <pingback:target>http://gehirnwindung.de/post.aspx?id=8e53cc64-c85c-4ef6-b85c-b5adc74a7f78</pingback:target>
      <slash:comments>22</slash:comments>
      <trackback:ping>http://gehirnwindung.de/trackback.axd?id=8e53cc64-c85c-4ef6-b85c-b5adc74a7f78</trackback:ping>
      <wfw:comment>http://gehirnwindung.de/post/2010/01/18/ASPNET-Precompilation-und-die-Fehlermeldung-Directory-does-not-exist-Failed-to-start-monitoring-file-changes.aspx#comment</wfw:comment>
      <wfw:commentRss>http://gehirnwindung.de/syndication.axd?post=8e53cc64-c85c-4ef6-b85c-b5adc74a7f78</wfw:commentRss>
    </item>
    <item>
      <title>BizTalk: Checkliste für Empfang von AS2-Nachrichten</title>
      <description>&lt;p&gt;Um &amp;uuml;ber BizTalk-HTTP-Adapter &lt;a title="AS2-&amp;Uuml;bertragungsstandard" href="http://de.wikipedia.org/wiki/AS2" target="_blank"&gt;AS2&lt;/a&gt; Daten empfangen zu k&amp;ouml;nnen, m&amp;uuml;ssen gleich ein paar Einstellungen passen. Ein kleiner &amp;Uuml;berblick &amp;uuml;ber die wichtigsten Einstellungen soll hiermit geschaffen werden:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Virtuelles Verzeichnis f&amp;uuml;r den Empfang der Nachrichten &amp;uuml;ber HTTP 
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Local Path&lt;/strong&gt;:&amp;nbsp;Verzeichnis, in dem&amp;nbsp;die Datei&amp;nbsp;&lt;strong&gt;BTSHttpReceive.dll&lt;/strong&gt; liegt, z.B. C:\Program Files\Microsoft BizTalk Server 2006\HttpReceive\ bzw. C:\Program Files\Microsoft BizTalk Server 20009\HttpReceive\&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Execute permissions&lt;/strong&gt;: Scripts and Executables&lt;/li&gt;
&lt;li&gt;Identit&amp;auml;t des zugewiesenen Application Pools muss ein Benutzer sein, der Zugriff auf die BizTalk-Datenbank hat, in der Regel wird hier &lt;strong&gt;BTSIsolatedHostUser&lt;/strong&gt; verwendet&lt;/li&gt;
&lt;li&gt;In welcher Web Site das virtuelle Verzeichnis liegt (es kann nat&amp;uuml;rlich auch die Web Site direkt verwendet&amp;nbsp;werden) ist dabei egal. Allerdings sollte man bei mehreren Web&amp;nbsp;Sites darauf achten, dass der virtuelle Pfad &amp;uuml;ber alle Web Sites hinweg eindeutig ist, da man innerhalb der Receive Location die betroffene Web Site nicht mit angeben kann.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Receive Port anlegen 
&lt;ul&gt;
&lt;li&gt;Keine oder asynchrone MDN: &lt;strong&gt;One-Way&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;MDN synchron:&amp;nbsp;&lt;strong&gt;Request-Response&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Receive Location anlegen 
&lt;ul&gt;
&lt;li&gt;Type: &lt;strong&gt;HTTP-Adapter&lt;/strong&gt; 
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Virtual directory plus ISAPI extension&lt;/strong&gt;: z.B. /virtualDirectory/BTSHttpReceive.dll.&lt;br /&gt;Wie oben erw&amp;auml;hnt,&amp;nbsp;k&amp;ouml;nnen die Web Sites des IIS&amp;nbsp;hier nicht angegeben werden. Nur der virtuelle Pfad (ausgehend vom root-Verzeichnis)&lt;/li&gt;
&lt;li&gt;Es&amp;nbsp;kann ein&amp;nbsp;beliebiger QueryString an die DLL angeh&amp;auml;ngt werden. Damit k&amp;ouml;nnen - mit nur einem virtuellen Verzeichnis -&amp;nbsp;f&amp;uuml;r verschiedene Kunden und/oder Dokument verschiedene Receie Locations definiert werden (an sich braucht man damit nur&amp;nbsp;ein virtuelles Verzeichnis&amp;nbsp;im IIS einrichten).&lt;br /&gt;Dieser Querystring muss exakt genauso auch im sendenden Programm angegeben werden (mit exakt ist Reihenfolge, Gro&amp;szlig;-Kleinschreibung und Umfang gemeint...).&lt;/li&gt;
&lt;li&gt;Die Einstellung &lt;strong&gt;Suspend failed requests&lt;/strong&gt; aktivieren&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Receive Pipeline&lt;/strong&gt; 
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AS2Receive&lt;/strong&gt;: Wenn beliebige Daten per AS2 empfangen werden sollen&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AS2EdiReceive&lt;/strong&gt;: Wenn EDIFACT-Nachrichten per AS2 empfangen werden sollen&lt;/li&gt;
&lt;li&gt;oder eine selbst-erstellte Pipeline, die die AS2 decoder-Component verwendet&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Sender-Party 
&lt;ul&gt;
&lt;li&gt;Party Properties 
&lt;ul&gt;
&lt;li&gt;Damit der Firmeneintrag beim&amp;nbsp;Empfang der Datei gefunden werden kann, muss als &lt;strong&gt;EDIINT-AS2 From Value (AS2-From)&lt;/strong&gt;&amp;nbsp;der, zwischen den Partnern ausgemachte&amp;nbsp;Name angegeben werden. Der Name sollte nur aus ASCII-Zeichen bestehen&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AS2 Properties, &lt;strong&gt;Party as AS2 Message Sender&lt;/strong&gt; 
&lt;ul&gt;
&lt;li&gt;Hier kann man eigentlich alles auf Standard lassen (keine Checkbox aktiv). Damit gibt der Sender vor, wie die Datei zu behandeln ist.&lt;/li&gt;
&lt;li&gt;Man kann den Sender auch zu bestimmten Einstellungen zwingen. Dazu die Checkbox &lt;strong&gt;Override inbound message properties&lt;/strong&gt; aktivieren und die Einstellungen in der Gruppe &lt;strong&gt;Incoming AS2 message&lt;/strong&gt; anpassen&lt;/li&gt;
&lt;li&gt;Wenn die MDN signiert werden soll, dann&amp;nbsp;kann das erreicht werden, indem&amp;nbsp;die Checkbox &lt;strong&gt;Sign requested MDN if Disposition-Notification-Option header is not present or if Signed-Receipt-Protocol header is set to optional&lt;/strong&gt; aktiviert werden. Der Sender darf das allerdings&amp;nbsp;nicht ausschlie&amp;szlig;en...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Empf&amp;auml;nger-Party (aktueller Rechner)&lt;br /&gt;Beim Empf&amp;auml;nger in diesem Fall nicht viel Einstellbar. Hier geht es prim&amp;auml;r um die MDN, die versendet wird 
&lt;ul&gt;
&lt;li&gt;Party Properties 
&lt;ul&gt;
&lt;li&gt;Damit die Einstellungen der Firma verwendet werden k&amp;ouml;nnen, muss als &lt;strong&gt;EDIINT-AS2 To Value (AS2-To)&lt;/strong&gt;-Wert der zwischen den Partnern ausgemachte Name f&amp;uuml;r den Empf&amp;auml;nger&amp;nbsp;angegeben werden&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Send Port oder Orchestration zum Verarbeiten der ankommenden Daten 
&lt;ul&gt;
&lt;li&gt;Damit keine Fehlermeldung angezeigt wird, muss die Datei auch verabeitet werden&amp;nbsp;- und das kann man nur erreichen, indem man entweder 
&lt;ul&gt;
&lt;li&gt;den oben erstellen Receive Port einer Orchestration zuweist (Bindings -&amp;gt; Inbound Logical Port), oder&lt;/li&gt;
&lt;li&gt;einen Send Port erstellt und den Filter so anpasst, dass die ankommenden Nachrichten &amp;uuml;ber diesen Port verarbeitet werden (z.B. &amp;uuml;ber die Eigenshaft BTS.ReceivePortName)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Zugegeben, wirklich kurz ist die Liste nicht ;)&amp;nbsp;Dennoch sind nur die notwendigsten Einstellungen beschrieben.&lt;/p&gt;
&lt;p&gt;Falls die Nachrichten und MDNs&amp;nbsp;signiert und/oder verschl&amp;uuml;sselt werden sollen, hab ich im Artikel &lt;a title="Richtigen Zertifikatsspeicher f&amp;uuml;r AS2-Signierung und Verschl&amp;uuml;sselung w&amp;auml;hlen" href="http://gehirnwindung.de/post/2010/01/14/BizTalk-Wohin-mit-den-AS2-Zertifikaten.aspx"&gt;BizTalk: Wohin mit den AS2-Zertifikaten&lt;/a&gt; entsprechende Einstellungen beschrieben.&lt;/p&gt;
&lt;p&gt;&lt;span class="att"&gt;Update:&lt;/span&gt; Punkt 6 hat zwar an sich nichts mehr mit dem Empfang der Daten zu tun, kam&amp;nbsp;aber dennoch&amp;nbsp;dazu, da der Punkt offenbar oft vergessen / &amp;uuml;bersehen&amp;nbsp;wird (hat man mir berichtet).&lt;/p&gt;</description>
      <link>http://gehirnwindung.de/post/2010/01/15/BizTalk-Checkliste-fur-AS2-Empfang.aspx</link>
      <author>wolfgang@gehirnwindung.de (Wolfgang)</author>
      <comments>http://gehirnwindung.de/post/2010/01/15/BizTalk-Checkliste-fur-AS2-Empfang.aspx#comment</comments>
      <guid>http://gehirnwindung.de/post.aspx?id=e281d0eb-dfd9-45ad-a14e-8955635c1911</guid>
      <pubDate>Fri, 15 Jan 2010 00:06:00 +0100</pubDate>
      <category>Microsoft BizTalk Server</category>
      <dc:publisher>wolfgang@gehirnwindung.de (Wolfgang)</dc:publisher>
      <pingback:server>http://gehirnwindung.de/pingback.axd</pingback:server>
      <pingback:target>http://gehirnwindung.de/post.aspx?id=e281d0eb-dfd9-45ad-a14e-8955635c1911</pingback:target>
      <slash:comments>6</slash:comments>
      <trackback:ping>http://gehirnwindung.de/trackback.axd?id=e281d0eb-dfd9-45ad-a14e-8955635c1911</trackback:ping>
      <wfw:comment>http://gehirnwindung.de/post/2010/01/15/BizTalk-Checkliste-fur-AS2-Empfang.aspx#comment</wfw:comment>
      <wfw:commentRss>http://gehirnwindung.de/syndication.axd?post=e281d0eb-dfd9-45ad-a14e-8955635c1911</wfw:commentRss>
    </item>
    <item>
      <title>BizTalk: Wohin mit den AS2-Zertifikaten (Signieren und Verschlüsseln)</title>
      <description>&lt;p&gt;Will man Nachrichten mittels &lt;a title="AS2-&amp;Uuml;bertragungsstandard" href="http://de.wikipedia.org/wiki/AS2" target="_blank"&gt;AS2&lt;/a&gt; verschl&amp;uuml;sselt oder signiert&amp;nbsp;versenden oder eine verschl&amp;uuml;sselte oder signierte Nachricht&amp;nbsp;empfangen, so muss man sich zwangsl&amp;auml;ufig mit Zertifikaten auseinandersetzen und diese an bestimmte Stellen (Zertifikatsspeicher)&amp;nbsp;ablegen und an ebenso genau definierten Stellen in der BizTalk Administration Console ausw&amp;auml;hlen.&lt;/p&gt;
&lt;p&gt;Am Einfachsten macht man sich die Arbeit, wenn man das SDK-Tool "&lt;a title="Certification Wizard Utility - CertWizard.exe" href="http://msdn.microsoft.com/en-us/library/bb727929(BTS.20).aspx" target="_blank"&gt;Certificate Wizard&lt;/a&gt;" (unter C:\Program Files\Microsoft BizTalk Server 2006\SDK\Utilities\Certificate Wizard\CertWizard.exe bzw. im Verzeichnis BizTalk Server 2009 zu finden) verwendet. Dieses Tool kopiert je nach Einstellung die Zertifikatsdateien in die entsprechenden Zertifikatsspeicher. Wer es manuell machen oder einfach nur &amp;uuml;berpr&amp;uuml;fen&amp;nbsp;will, der kann sich an folgender Liste orientieren.&lt;/p&gt;
&lt;p&gt;Das Ausw&amp;auml;hlen des Zertifikats innerhalb der BizTalk Server Administration Console&amp;nbsp;muss zudem auch noch an&amp;nbsp;entsprechenden Stellen&amp;nbsp;erfolgen. Auch hier hilft die Liste weiter.&lt;/p&gt;
&lt;h2&gt;Nachrichten&lt;/h2&gt;
&lt;p&gt;
&lt;table border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td colspan="2"&gt;&lt;strong&gt;Signierung&lt;/strong&gt;&lt;/td&gt;
&lt;td colspan="2"&gt;&lt;strong&gt;Ver-/&lt;strong&gt;Entschl&amp;uuml;sselung&lt;/strong&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr valign="top"&gt;
&lt;td valign="top"&gt;&lt;strong&gt;Eingehend&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Speicher:&lt;br /&gt;Typ:&lt;br /&gt;BizTalk:&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Other People&amp;nbsp;(Local computer)&lt;br /&gt;Public key (Partner)&lt;br /&gt;Party (Partner)&amp;nbsp;/ Certificates&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Speicher:&lt;br /&gt;Typ:&lt;br /&gt;BizTalk:&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Personal store (InProc User)&lt;br /&gt;Private key (Home)&lt;br /&gt;Isolated Host&amp;nbsp;/ Certificates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr valign="top"&gt;
&lt;td&gt;&lt;strong&gt;Ausgehend&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Speicher:&lt;br /&gt;Typ:&lt;br /&gt;BizTalk:&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Personal store (InProc user)&lt;br /&gt;Private key (Home)&lt;br /&gt;Group / Certificates&lt;sup&gt;*&lt;/sup&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Speicher:&lt;br /&gt;Typ:&lt;br /&gt;BizTalk:&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Other People (Local computer)&lt;br /&gt;Public key (Partner)&lt;br /&gt;Send Port / Certificates&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;h2&gt;MDN&lt;/h2&gt;
&lt;p&gt;
&lt;table border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td colspan="2"&gt;&lt;strong&gt;Signierung&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr valign="top"&gt;
&lt;td&gt;&lt;strong&gt;Eingehend&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Speicher:&lt;br /&gt;Typ:&lt;br /&gt;BizTalk:&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Other People&amp;nbsp;(Local computer)&lt;br /&gt;Public key (Partner)&lt;br /&gt;Party (Partner)&amp;nbsp;/ Certificates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr valign="top"&gt;
&lt;td&gt;&lt;strong&gt;Ausgehend&lt;br /&gt;&lt;/strong&gt;synchron&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Speicher:&lt;br /&gt;Typ:&lt;br /&gt;BizTalk:&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Personal store (Isolated host&amp;nbsp;user)&lt;br /&gt;Private key (Home)&lt;br /&gt;Group&amp;nbsp;/ Certificates&lt;sup&gt;*&lt;/sup&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr valign="top"&gt;
&lt;td&gt;&lt;strong&gt;Ausgehend&lt;br /&gt;&lt;/strong&gt;asynchron&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Speicher:&lt;br /&gt;Typ:&lt;br /&gt;BizTalk:&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Personal store (InProc user)&lt;br /&gt;Private key (Home)&lt;br /&gt;Group&amp;nbsp;/ Certificates&lt;sup&gt;*&lt;/sup&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;&lt;sup&gt;*&lt;/sup&gt; F&amp;uuml;r die ausgehende Signierung kann seit &lt;a title="BizTalk Server 2006 R2 Service Pack 1" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=1768f7a3-d843-4f5b-aba7-b3d72892c16f" target="_blank"&gt;BizTalk Server 2006 R2 SP1&lt;/a&gt; das Zertifikat anstatt bei der BizTalk Group auch bei der Party direkt angegeben werden.&lt;/p&gt;
&lt;h2&gt;Zertifikatsspeicher&lt;/h2&gt;
&lt;p&gt;Die Zertifikatsspeicher sind nicht ganz einfach zu finden. Man kann aber wie folgt vorgehen. Bestenfalls legt man sich eine eigene Administrationskonsole an.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;mmc.exe&lt;/strong&gt; starten&lt;/li&gt;
&lt;li&gt;Men&amp;uuml; "File" -&amp;gt; "Add/Remove Snap-In..."&lt;/li&gt;
&lt;li&gt;Button "Add..."&lt;/li&gt;
&lt;li&gt;"Certificates" ausw&amp;auml;hlen und mit "Add" best&amp;auml;tigen&lt;/li&gt;
&lt;li&gt;"Computer Account" ausw&amp;auml;hlen&lt;/li&gt;
&lt;li&gt;weiter bis Finish&lt;/li&gt;
&lt;li&gt;"Certificates" ausw&amp;auml;hlen und mit "Add" best&amp;auml;tigen&lt;/li&gt;
&lt;li&gt;"My User Account" ausw&amp;auml;hlen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Leider kann man keinen speziellen Benutzer ausw&amp;auml;hlen. Die Datei kann aber als *.msc-Datei gespeichert werden und danach mit der rechten Maustaste&amp;nbsp;mittels "Run as..." mit einem anderen Benutzer gestartet werden. Hier kann dann der &lt;strong&gt;BTSHostUser&lt;/strong&gt; und der &lt;strong&gt;BTSIsolatedHostUser&lt;/strong&gt;&amp;nbsp;eingetragen werden. Nicht sch&amp;ouml;n, aber hilfreich ;)&lt;/p&gt;</description>
      <link>http://gehirnwindung.de/post/2010/01/14/BizTalk-Wohin-mit-den-AS2-Zertifikaten.aspx</link>
      <author>post@example.com (Admin)</author>
      <comments>http://gehirnwindung.de/post/2010/01/14/BizTalk-Wohin-mit-den-AS2-Zertifikaten.aspx#comment</comments>
      <guid>http://gehirnwindung.de/post.aspx?id=aee4ddbb-ee57-4dae-abac-00c83fc986d8</guid>
      <pubDate>Thu, 14 Jan 2010 00:27:00 +0100</pubDate>
      <category>Microsoft BizTalk Server</category>
      <dc:publisher>post@example.com (Admin)</dc:publisher>
      <pingback:server>http://gehirnwindung.de/pingback.axd</pingback:server>
      <pingback:target>http://gehirnwindung.de/post.aspx?id=aee4ddbb-ee57-4dae-abac-00c83fc986d8</pingback:target>
      <slash:comments>7</slash:comments>
      <trackback:ping>http://gehirnwindung.de/trackback.axd?id=aee4ddbb-ee57-4dae-abac-00c83fc986d8</trackback:ping>
      <wfw:comment>http://gehirnwindung.de/post/2010/01/14/BizTalk-Wohin-mit-den-AS2-Zertifikaten.aspx#comment</wfw:comment>
      <wfw:commentRss>http://gehirnwindung.de/syndication.axd?post=aee4ddbb-ee57-4dae-abac-00c83fc986d8</wfw:commentRss>
    </item>
    <item>
      <title>BizTalk: unexpected token ';'</title>
      <description>&lt;p&gt;Ein Kunde kam heute mit einer Orchestration zu mir, die folgende Fehlermeldung beim kompilieren erzeugte:&lt;/p&gt;
&lt;p class="att"&gt;Error X2016: unexpected token ';'&lt;/p&gt;
&lt;p&gt;Wie so oft f&amp;uuml;hrt auch hier eine eigentlich extrem kleine Ursache zu dieser Auswirkung. Die Fehlermeldung sagt leider nicht viel aus. Nach kurzer Suche im .odx-Quelltext findet man dann aber zum Gl&amp;uuml;ck schnell ein Konstrukt wie&lt;/p&gt;
&lt;div class="code"&gt;
variableName = &amp;nbsp;;
&lt;/div&gt;
&lt;p&gt;Das sieht nicht nur seltsam aus, sondern ist nat&amp;uuml;rlich auch falsch... Grund war in diesem Fall ein einzelnes Leerzeichen als "Initial Value" der System.String-Variable. Das ist fast schon "fies", da man den Fehler nicht einmal auf den ersten Blick auf die Eigenschaften der Variable erkennen kann (wie im Screenshot zu sehen).&lt;/p&gt;
&lt;img src="http://gehirnwindung.de/image.axd?picture=2009%2f11%2fbiztalk-server-unexpected-token.png" alt="BizTalk Server Orchestration-Fehlermeldung unexpected token" /&gt;
&lt;p&gt;F&amp;uuml;r string-Variablen muss jeder Initialwert also stets in doppelten Anf&amp;uuml;hrungsstrichen stehen.&lt;/p&gt;</description>
      <link>http://gehirnwindung.de/post/2009/11/30/Fehlermeldung-unexpected-token-3b.aspx</link>
      <author>wolfgang@gehirnwindung.de (Wolfgang)</author>
      <comments>http://gehirnwindung.de/post/2009/11/30/Fehlermeldung-unexpected-token-3b.aspx#comment</comments>
      <guid>http://gehirnwindung.de/post.aspx?id=fc6a8bc7-e258-446a-a69c-fbe7d5ad2fb0</guid>
      <pubDate>Mon, 30 Nov 2009 22:03:00 +0100</pubDate>
      <category>Microsoft BizTalk Server</category>
      <dc:publisher>wolfgang@gehirnwindung.de (Wolfgang)</dc:publisher>
      <pingback:server>http://gehirnwindung.de/pingback.axd</pingback:server>
      <pingback:target>http://gehirnwindung.de/post.aspx?id=fc6a8bc7-e258-446a-a69c-fbe7d5ad2fb0</pingback:target>
      <slash:comments>6</slash:comments>
      <trackback:ping>http://gehirnwindung.de/trackback.axd?id=fc6a8bc7-e258-446a-a69c-fbe7d5ad2fb0</trackback:ping>
      <wfw:comment>http://gehirnwindung.de/post/2009/11/30/Fehlermeldung-unexpected-token-3b.aspx#comment</wfw:comment>
      <wfw:commentRss>http://gehirnwindung.de/syndication.axd?post=fc6a8bc7-e258-446a-a69c-fbe7d5ad2fb0</wfw:commentRss>
    </item>
    <item>
      <title>Blog-Parade: Die 3 beliebtesten Fachbücher aus dem .NET-Umfeld (Ergebnis)</title>
      <description>&lt;p&gt;Nachdem diese Blog-Parade nicht ganz so erfolgreich verlief, wie ich mir das vorgestellt hatte, wird es recht schwer mit Statistiken - weshalb ich an dieser Stelle auch darauf verzichte. Das beliebteste Fachbuch konnte also leider nicht wirklich gefunden werden. Die Liste der vorgestellten B&amp;uuml;cher entspricht dennoch der bewerteten Reihenfolge, wobei die Sprache f&amp;uuml;r die Reihenfolge&amp;nbsp;au&amp;szlig;er acht gelassen&amp;nbsp;wurde.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;C# 3.0 Entwurfsmuster / C# 3.0 Design Pattern&lt;br /&gt;&lt;a href="http://www.amazon.de/gp/product/3897218674?ie=UTF8&amp;amp;tag=gehirnwindung-21&amp;amp;linkCode=as2&amp;amp;camp=1638&amp;amp;creative=6742&amp;amp;creativeASIN=3897218674"&gt;&lt;img src="http://gehirnwindung.de/image.axd?picture=2009/10/5199j8oTKNL._SL160_.jpg" border="0" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://www.amazon.de/gp/product/059652773X?ie=UTF8&amp;amp;tag=gehirnwindung-21&amp;amp;linkCode=as2&amp;amp;camp=1638&amp;amp;creative=6742&amp;amp;creativeASIN=059652773X"&gt;&lt;img src="http://gehirnwindung.de/image.axd?picture=2009/10/515yX2pUnjL._SL160_.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;von Judith Bishop.&lt;br /&gt;ISBN: 978-3-89721-867-3(de) bzw. 978-0-59652-773-0 (en)&lt;/li&gt;
&lt;li&gt;Clean Code: A Handbook of Agile Software Craftsmanship&lt;br /&gt;&lt;a href="http://www.amazon.de/gp/product/0132350882?ie=UTF8&amp;amp;tag=gehirnwindung-21&amp;amp;linkCode=as2&amp;amp;camp=1638&amp;amp;creative=6742&amp;amp;creativeASIN=0132350882"&gt;&lt;img src="http://gehirnwindung.de/image.axd?picture=2009/10/419EFaGEGvL._SL160_.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;von Robert C. Martin&lt;br /&gt;ISBN: 978-0-13235-088-4 (en)&lt;/li&gt;
&lt;li&gt;Agile Principles, Patterns and Practices in C#&lt;br /&gt;&lt;a href="http://www.amazon.de/gp/product/0131857258?ie=UTF8&amp;amp;tag=gehirnwindung-21&amp;amp;linkCode=as2&amp;amp;camp=1638&amp;amp;creative=6742&amp;amp;creativeASIN=0131857258"&gt;&lt;img src="http://gehirnwindung.de/image.axd?picture=2009/10/51Y57BH27TL._SL160_.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;von Robert C. Martin und&amp;nbsp;Micah Martin&lt;br /&gt;ISBN: 978-0-13185-725-4 (en)&lt;/li&gt;
&lt;li&gt;ASP.NET MVC 1.0&lt;br /&gt;&lt;a href="http://www.amazon.de/gp/product/0470384611?ie=UTF8&amp;amp;tag=gehirnwindung-21&amp;amp;linkCode=as2&amp;amp;camp=1638&amp;amp;creative=6742&amp;amp;creativeASIN=0470384611"&gt;&lt;img src="http://gehirnwindung.de/image.axd?picture=2009/10/41vsFoLZq9L._SL160_.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;von Rob Conery, Scott Hanselman, Phil Haack und Scott Guthrie&lt;br /&gt;ISBN: 978-0-47038-461-9 (en)&lt;/li&gt;
&lt;li&gt;Richtlinien f&amp;uuml;r das Framework-Design&lt;br /&gt;&lt;a href="http://www.amazon.de/gp/product/3827326265?ie=UTF8&amp;amp;tag=gehirnwindung-21&amp;amp;linkCode=as2&amp;amp;camp=1638&amp;amp;creative=6742&amp;amp;creativeASIN=3827326265"&gt;&lt;img src="http://gehirnwindung.de/image.axd?picture=2009/10/41mrt-Ry4VL._SL160_.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;von Krzysztof Cwalina und Brad Abrams&lt;br /&gt;ISBN: 978-3-82732-626-3 (de)&lt;/li&gt;
&lt;li&gt;The Art of Unit Testing&lt;br /&gt;&lt;a href="http://www.amazon.de/gp/product/1933988274?ie=UTF8&amp;amp;tag=gehirnwindung-21&amp;amp;linkCode=as2&amp;amp;camp=1638&amp;amp;creative=6742&amp;amp;creativeASIN=1933988274"&gt;&lt;img src="http://gehirnwindung.de/image.axd?picture=2009/10/51Uk0A%2B9OBL._SL160_.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;von Roy Osherove&lt;br /&gt;ISBN: 978-1-93398-827-6 (en)&lt;/li&gt;
&lt;li&gt;Visual C# 2008&lt;br /&gt;&lt;a href="http://www.amazon.de/gp/product/3827326419?ie=UTF8&amp;amp;tag=gehirnwindung-21&amp;amp;linkCode=as2&amp;amp;camp=1638&amp;amp;creative=6742&amp;amp;creativeASIN=3827326419"&gt;&lt;img src="http://gehirnwindung.de/image.axd?picture=2009/10/41A4gaWDw0L._SL160_.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;von Frank Eller&lt;br /&gt;ISBN: 978-3-82732-641-6 (de)&lt;/li&gt;
&lt;li&gt;Grundlagen der Anwendungsentwicklung mit dem .NET Framework 2.0&lt;br /&gt;&lt;a href="http://www.amazon.de/gp/product/3866459076?ie=UTF8&amp;amp;tag=gehirnwindung-21&amp;amp;linkCode=as2&amp;amp;camp=1638&amp;amp;creative=6742&amp;amp;creativeASIN=3866459076"&gt;&lt;img src="http://gehirnwindung.de/image.axd?picture=2009/10/51JZFT5FQXL._SL160_.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;von Tony Northrup, Shawn Wildermuth und&amp;nbsp;Bill Ryan&lt;br /&gt;ISBN: 978-3-86645-907-6 (de)&lt;/li&gt;
&lt;li&gt;jQuery in Action&lt;br /&gt;&lt;a href="http://www.amazon.de/gp/product/1933988355?ie=UTF8&amp;amp;tag=gehirnwindung-21&amp;amp;linkCode=as2&amp;amp;camp=1638&amp;amp;creative=6742&amp;amp;creativeASIN=1933988355"&gt;&lt;img src="http://gehirnwindung.de/image.axd?picture=2009/10/51REisyoeoL._SL160_.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;von Bear Bibeault und&amp;nbsp;Yehuda Katz&lt;br /&gt;ISBN: 978-1-93398-835-1 (en)&lt;/li&gt;
&lt;li&gt;Refactoring&lt;br /&gt;&lt;a href="http://www.amazon.de/gp/product/3827316308?ie=UTF8&amp;amp;tag=gehirnwindung-21&amp;amp;linkCode=as2&amp;amp;camp=1638&amp;amp;creative=6742&amp;amp;creativeASIN=3827316308"&gt;&lt;img src="http://gehirnwindung.de/image.axd?picture=2009/10/21SKVJNNTEL._SL160_.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;von Martin Fowler&lt;br /&gt;ISBN: 978-3-82731-630-1&amp;nbsp;(de)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Gewonnen haben alle Teilnehmer. Da es nur 4 waren hab ich mich kurzerhand entschlossen, noch einen weiteren Gutschein mit in die Liste der Gewinne mit aufzunehmen. Ich hab eine kleine Applikation geschrieben, die die Gewinner zieht - und nach diesem Losverfahren kamen folgende Pl&amp;auml;tze zustande:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Gordon Breuer / &lt;a title="The private web log from Gordon Breuer about the .NET-Framework, C#, media design and his everyday madness" href="http://gordon-breuer.de/" target="_blank"&gt;anheledir.NET&lt;/a&gt;&amp;nbsp;hat den Gutschein &amp;uuml;ber &amp;euro; 40 gewonnen&lt;/li&gt;
&lt;li&gt;Stefan Macke / &lt;a href="http://blog.stefan-macke.com/" target="_blank"&gt;Stefans Blog&lt;/a&gt;&amp;nbsp;hat den Gutschein &amp;uuml;ber &amp;euro; 20 gewonnen&lt;/li&gt;
&lt;li&gt;Sven Eiter / &lt;a href="http://schanetti.de" target="_blank"&gt;Svens Blog&lt;/a&gt;&amp;nbsp;hat einen Gutschein &amp;uuml;ber &amp;euro; 10 gewonnen&lt;/li&gt;
&lt;li&gt;Mario Noack / &lt;a title=".NET Softwareentwicklung &amp;amp; alles rund um WordToPDF" href="http://blog.topdf.de/" target="_blank"&gt;.NET und PDF Software&lt;/a&gt;&amp;nbsp;hat das Buch gewonnen&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Gl&amp;uuml;ckwunsch nochmal...&lt;/p&gt;</description>
      <link>http://gehirnwindung.de/post/2009/11/17/Blog-Parade-Die-3-beliebtesten-Fachbucher-aus-dem-NET-Umfeld-(Ergebnis).aspx</link>
      <author>wolfgang@gehirnwindung.de (Wolfgang)</author>
      <comments>http://gehirnwindung.de/post/2009/11/17/Blog-Parade-Die-3-beliebtesten-Fachbucher-aus-dem-NET-Umfeld-(Ergebnis).aspx#comment</comments>
      <guid>http://gehirnwindung.de/post.aspx?id=fae7ed1c-be9b-4275-896a-5f4931b7b30c</guid>
      <pubDate>Tue, 17 Nov 2009 15:54:00 +0100</pubDate>
      <category>Blog-Parade</category>
      <dc:publisher>wolfgang@gehirnwindung.de (Wolfgang)</dc:publisher>
      <pingback:server>http://gehirnwindung.de/pingback.axd</pingback:server>
      <pingback:target>http://gehirnwindung.de/post.aspx?id=fae7ed1c-be9b-4275-896a-5f4931b7b30c</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://gehirnwindung.de/trackback.axd?id=fae7ed1c-be9b-4275-896a-5f4931b7b30c</trackback:ping>
      <wfw:comment>http://gehirnwindung.de/post/2009/11/17/Blog-Parade-Die-3-beliebtesten-Fachbucher-aus-dem-NET-Umfeld-(Ergebnis).aspx#comment</wfw:comment>
      <wfw:commentRss>http://gehirnwindung.de/syndication.axd?post=fae7ed1c-be9b-4275-896a-5f4931b7b30c</wfw:commentRss>
    </item>
    <item>
      <title>BizTalk Server Scripting-Functoid wider Erwarten...</title>
      <description>&lt;p&gt;Mit dem &lt;strong&gt;Scripting Functoid&lt;/strong&gt; des BizTalk-Mappers kann man bekanntlich&amp;nbsp;eigene Scripts in verschiedenen Sprachen (z.b. C#)&amp;nbsp;w&amp;auml;hrend des Mappings ausf&amp;uuml;hren lassen. Man definiert damit eine Funktion deren Parameter mit Hilfer der Eingangselemente gef&amp;uuml;llt werden k&amp;ouml;nnen. Der R&amp;uuml;ckgabewert der Funktion ist das, was das Functoid als Ausgangsparameter weitergibt. Bis hierhin ist alles noch selbsterkl&amp;auml;rend.&lt;/p&gt;
&lt;p&gt;Falls nun mehrere Scripting Functoide existieren, die alle das Gleiche tun, so ist man gut beraten, auch immer den gleichen Methodennamen zu verwenden. Diese werden beim Kompilieren in XSLT&amp;nbsp;zusammengef&amp;uuml;hrt (aus dem *.btm-Dateien wird immer xslt generiert). Innerhalb dieser XSLT-Datei, wird dann auch immer&amp;nbsp;nur eine Funktion aufgerufen.&lt;/p&gt;
&lt;p&gt;Allerdings scheint den Entwicklern ein kleiner Fehler unterlaufen zu sein. Denn nicht der Methodenname und&amp;nbsp;der dazugeh&amp;ouml;rige Inhalt (MethodBody), sondern lediglich der Methodenname und&amp;nbsp;die Anzahl der Parameter&amp;nbsp;wird verwendet, um die "Gleichheit" zweier Funktionen festzustellen.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Aus den Scripting-Functoiden in den Bildern&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img style="margin: 2px 0px;" src="http://gehirnwindung.de/image.axd?picture=2009%2f9%2fMultiple-BizTalk-Scripting-Functoids-With-Same-MethodName1.png" alt="Mehrere BizTalk-Server Scripting Functoids mit unterschiedlichen Funktionen aber gleichen Funktionsnamen" /&gt;&lt;img style="margin: 2px 4px;" src="http://gehirnwindung.de/image.axd?picture=2009%2f9%2fMultiple-BizTalk-Scripting-Functoids-With-Same-MethodName2.png" alt="Mehrere BizTalk-Server Scripting Functoids mit unterschiedlichen Funktionen aber gleichen Funktionsnamen" /&gt;&lt;/p&gt;
&lt;p&gt;wird folgender XSLT-Code&lt;/p&gt;
&lt;div class="code"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;msxsl:script&lt;/span&gt; &lt;span class="attr"&gt;language&lt;/span&gt;&lt;span class="kwrd"&gt;="C#"&lt;/span&gt; &lt;span class="attr"&gt;implements-prefix&lt;/span&gt;&lt;span class="kwrd"&gt;="userCSharp"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;!&lt;/span&gt;[CDATA[&lt;br /&gt;public string MyConcat(string param1)&lt;br /&gt;{&lt;br /&gt;    return param1;&lt;br /&gt;}&lt;br /&gt;]]&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;msxsl:script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Zwei an sich&amp;nbsp;komplett verschiedene Funktionen mit gleichem Namen und gleicher Anzahl an Parametern werden also als gleich angesehen und infolgedessen wird eine dieser Funktionen entfernt (in der Regel bleibt die erste erhalten). In C# ist es M&amp;ouml;glich, mehrere gleich genannte Methoden zu definieren, so lange die Signatur (d.h. die Parameter und deren Typen)&amp;nbsp;eine andere ist. Ist die Signatur gleich, wird ein entsprechender Fehler ausgegeben.&lt;/p&gt;
&lt;p&gt;Da in jedem Scripting-Functoid eine neue Funktion definiert werden kann (und muss, wenn immer die gleiche Funktion aufgerufen werden soll), hofft man nun wenigstens auf eine Fehlermeldung bei einer Unterscheidung der Funktionen. Es&amp;nbsp;wird aber lediglich eine Funktion &amp;uuml;brig gelassen - und nein, es gibt beim kompilieren nicht einmal eine Warnung, geschweige denn einen Fehler.&lt;/p&gt;
&lt;p&gt;Falls es also mal zu seltsam erscheinenden Fehlern innerhalb eines Mappings&amp;nbsp;kommt und man sich ganz sicher ist, dass eine Funktion eigentlich korrekt zu funktionieren hat, dann muss man wohl oder &amp;uuml;bel auch alle anderen Scripting Functoide&amp;nbsp;innerhalb der .btm-Datei&amp;nbsp;in Betracht ziehen und&amp;nbsp;die Methodennamen vergleichen.&lt;/p&gt;
&lt;p&gt;Besser w&amp;auml;re eine Dateiweite Funktionsliste gewesen. Innerhalb des Scripting-Functoid h&amp;auml;tte man dann eine dieser Funktionen ausgew&amp;auml;hlt, fertig... Man kann nur auf neue Versionen hoffen ;)&lt;/p&gt;</description>
      <link>http://gehirnwindung.de/post/2009/09/23/BizTalk-Server-Scripting-Functoid-wider-Erwarten.aspx</link>
      <author>wolfgang@gehirnwindung.de (Wolfgang)</author>
      <comments>http://gehirnwindung.de/post/2009/09/23/BizTalk-Server-Scripting-Functoid-wider-Erwarten.aspx#comment</comments>
      <guid>http://gehirnwindung.de/post.aspx?id=e4703564-6aea-4a3e-bb88-55d9ebdc3b72</guid>
      <pubDate>Wed, 23 Sep 2009 20:00:00 +0100</pubDate>
      <category>Microsoft BizTalk Server</category>
      <dc:publisher>wolfgang@gehirnwindung.de (Wolfgang)</dc:publisher>
      <pingback:server>http://gehirnwindung.de/pingback.axd</pingback:server>
      <pingback:target>http://gehirnwindung.de/post.aspx?id=e4703564-6aea-4a3e-bb88-55d9ebdc3b72</pingback:target>
      <slash:comments>3</slash:comments>
      <trackback:ping>http://gehirnwindung.de/trackback.axd?id=e4703564-6aea-4a3e-bb88-55d9ebdc3b72</trackback:ping>
      <wfw:comment>http://gehirnwindung.de/post/2009/09/23/BizTalk-Server-Scripting-Functoid-wider-Erwarten.aspx#comment</wfw:comment>
      <wfw:commentRss>http://gehirnwindung.de/syndication.axd?post=e4703564-6aea-4a3e-bb88-55d9ebdc3b72</wfw:commentRss>
    </item>
    <item>
      <title>Blog-Parade: Die 3 beliebtesten Fachbücher aus dem .NET-Umfeld</title>
      <description>&lt;p&gt;Hallo zusammen,&lt;/p&gt;
&lt;p&gt;mir hat die Idee der &lt;a title="Wikipedia: Blog-Parade (auch Blog-Karneval)" href="http://de.wikipedia.org/wiki/Blog-Parade" target="_blank"&gt;Blog-Parade&lt;/a&gt;&amp;nbsp;sehr gut gefallen. Und nach kurzer &amp;Uuml;berlegung ist mir sogar eine sinnvolle&amp;nbsp;Verwendung eingefallen... Ich suche die&amp;nbsp;beliebtesten Fachb&amp;uuml;cher, die irgendwas mit Programmierung im .NET-Umfeld&amp;nbsp;zu tun haben.&lt;/p&gt;
&lt;p&gt;Wer teilnehmen m&amp;ouml;chte, schreibt&amp;nbsp;einen Beitrag mit seinen&amp;nbsp;3&amp;nbsp;beliebtesten B&amp;uuml;chern (inklusiver kurzer Begr&amp;uuml;ndung) und&amp;nbsp;mit Trackback auf&amp;nbsp;diesen Artikel in&amp;nbsp;seinem Blog. Sollte die Trackback-Funktion mal nicht funktionieren, so schreibt bitte einen kleinen Kommentar mit entsprechender URL zu eurem Artikel. Am Ende der Blog-Parade werden die Teilnehmer aus den Kommentaren ermittelt. Bitte pr&amp;uuml;ft also, ob der Trackback funktioniert hat. Es d&amp;uuml;rfen gerne auch mehr als 3 B&amp;uuml;cher beschrieben werden.&lt;/p&gt;
&lt;p&gt;Alle&amp;nbsp;Artikelautoren nehmen&amp;nbsp;einmal (ungeachtet der Anzahl der Beitr&amp;auml;ge oder der genannten B&amp;uuml;cher)&amp;nbsp;an der Verlosung folgender Preise teil:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Ein Amazon, buecher.de&amp;nbsp;oder BOL - Gutschein in H&amp;ouml;he von &amp;euro; 40&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Ein Amazon, buecher.de,&amp;nbsp;oder BOL - Gutschein in H&amp;ouml;he von &amp;euro; 20&lt;/li&gt;
&lt;li&gt;Das Buch&amp;nbsp;&lt;a title="Dino Esposito: Microsoft ASP.NET AJAX-Programmierung - Eine Einf&amp;uuml;hrung in die Programmierung interaktiver Webanwendungen" href="http://www.microsoft-press.de/product.asp?cnt=product&amp;amp;id=ms-5424" target="_blank"&gt;Microsoft ASP.NET AJAX Programmierung&lt;/a&gt;&amp;nbsp;von Dino Esposito aus dem &lt;a title="Microsoft Press" href="http://microsoft.com/germany/mspress" target="_blank"&gt;Microsoft Press&lt;/a&gt; Verlag (wie unten beschrieben)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Und bevor es zu irgendwelchen Fragen kommt (Teilnahmebedingungen)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Teilnahmeberechtigt ist jeder, der einen Artikel in einem Blog ver&amp;ouml;ffentlichen kann.&lt;br /&gt;Es d&amp;uuml;rfen gerne mehrere Artikel eingereicht werden, dies erh&amp;ouml;ht die Gewinnchancen f&amp;uuml;r den Teilnehmer jedoch nicht.&lt;/li&gt;
&lt;li&gt;Die 3 Gewinner werden nach Abschlu&amp;szlig; der Blog-Parade per Los ermittelt und daraufhin&amp;nbsp;per Email benachrichtig.&lt;br /&gt;Im jeweiligen Blog muss daher ein Kontaktformular oder eine Email-Adresse zu finden sein!&lt;/li&gt;
&lt;li&gt;Die Gewinner werden nach R&amp;uuml;cksprache in diesem Blog bekannt gegeben (mit Vor- und Nachname sowie Link auf das jeweilige Blog)&lt;/li&gt;
&lt;li&gt;Die Zustellung des Gewinns erfolgt per Email oder im Falle des Buches per Post ohne Versandversicherung. Eine Ausbezahlung in Bar ist nicht m&amp;ouml;glich.&lt;/li&gt;
&lt;li&gt;Der Rechtsweg ist ausgeschlossen.&lt;/li&gt;
&lt;li&gt;Stichtag ist der 30.09.2009 (Teilnahmeschluss). Autoren der Beitr&amp;auml;ge, die sp&amp;auml;ter&amp;nbsp;(also genau um oder nach dem 01.10.2009 00:00 Uhr)&amp;nbsp;in der Liste der Kommentare bekannt gegeben wurden, nehmen nicht an der Verlosung teil.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Am Ende der Blog-Parade wird die Liste&amp;nbsp;aller B&amp;uuml;cher&amp;nbsp;mit (exemplarischen) Links zu den jeweiligen Beitr&amp;auml;gen ver&amp;ouml;ffentlicht. Bin gespannt, welche Buch-Perlen diese Blog-Parade zum Vorschein bringt...&lt;/p&gt;
&lt;h2&gt;Was ist das f&amp;uuml;r ein Buch auf dem 3. Platz&lt;/h2&gt;
&lt;p&gt;&lt;a title="ASP.NET AJAX Programmierung" href="http://www.amazon.de/gp/product/3866454244?ie=UTF8&amp;amp;tag=gehirnwindung-21&amp;amp;linkCode=as2&amp;amp;camp=1638&amp;amp;creative=6742&amp;amp;creativeASIN=3866454244" target="_blank"&gt;&lt;img style="margin-right: 2px; margin-bottom: 2px; float: left;" src="http://gehirnwindung.de/image.axd?picture=2009%2f9%2fMicrosoft-ASP.NET-AJAX-Programmierung-Dino-Esposito.jpg" alt="Dino Esposito: Microsoft ASP.NET AJAX-Programmierung - Eine Einf&amp;uuml;hrung in die Programmierung interaktiver Webanwendungen" /&gt;&lt;/a&gt;&lt;img style="border:none !important; margin:0px !important;" src="http://www.assoc-amazon.de/e/ir?t=gehirnwindung-21&amp;amp;l=as2&amp;amp;o=3&amp;amp;a=3866454244" border="0" alt="" width="1" height="1" /&gt;&lt;/p&gt;
&lt;p&gt;Verlost wird neben den Gutscheinen das&amp;nbsp;f&amp;uuml;r Grundlagen durchaus immer noch sehr gut geeignete&amp;nbsp;Buch "&lt;a title="Dino Esposito: Microsoft ASP.NET AJAX-Programmierung - Eine Einf&amp;uuml;hrung in die Programmierung interaktiver Webanwendungen" href="http://www.microsoft-press.de/product.asp?cnt=product&amp;amp;id=ms-5424" target="_blank"&gt;Microsoft ASP.NET AJAX Programmierung&lt;/a&gt; - Eine Einf&amp;uuml;hrung in die Programmierung schneller und interaktiver Webanwendungen" von Dino Esposito aus dem &lt;a title="Microsoft Press" href="http://microsoft.com/germany/mspress" target="_blank"&gt;Microsoft Press&lt;/a&gt; Verlag. Ich hab heute beim entstauben entdeckt, dass ich dieses Buch gleich 2x besitze.&lt;/p&gt;
&lt;p&gt;Es&amp;nbsp;wei&amp;szlig;t leichte Gebrauchsspuren auf (wobei dieses Exemplar nicht gelesen wurde) und hat mir sehr gute Dienste geleistet.&lt;/p&gt;
&lt;p style="clear: left;"&gt;&amp;nbsp;&lt;/p&gt;</description>
      <link>http://gehirnwindung.de/post/2009/09/01/Blog-Parade-Die-3-beliebtesten-Fachbucher-aus-dem-NET-Umfeld.aspx</link>
      <author>wolfgang@gehirnwindung.de (Wolfgang)</author>
      <comments>http://gehirnwindung.de/post/2009/09/01/Blog-Parade-Die-3-beliebtesten-Fachbucher-aus-dem-NET-Umfeld.aspx#comment</comments>
      <guid>http://gehirnwindung.de/post.aspx?id=3668d556-08cf-4071-9b80-23e002d8464e</guid>
      <pubDate>Tue, 01 Sep 2009 20:32:00 +0100</pubDate>
      <category>Blog-Parade</category>
      <dc:publisher>wolfgang@gehirnwindung.de (Wolfgang)</dc:publisher>
      <pingback:server>http://gehirnwindung.de/pingback.axd</pingback:server>
      <pingback:target>http://gehirnwindung.de/post.aspx?id=3668d556-08cf-4071-9b80-23e002d8464e</pingback:target>
      <slash:comments>10</slash:comments>
      <trackback:ping>http://gehirnwindung.de/trackback.axd?id=3668d556-08cf-4071-9b80-23e002d8464e</trackback:ping>
      <wfw:comment>http://gehirnwindung.de/post/2009/09/01/Blog-Parade-Die-3-beliebtesten-Fachbucher-aus-dem-NET-Umfeld.aspx#comment</wfw:comment>
      <wfw:commentRss>http://gehirnwindung.de/syndication.axd?post=3668d556-08cf-4071-9b80-23e002d8464e</wfw:commentRss>
    </item>
    <item>
      <title>XQuery-Singleton oder warum ein einzelnes Element nicht unbedingt als solches erkannt wird</title>
      <description>&lt;p&gt;Bei der Arbeit mit dem XML-Datentyp ab SQL Server 2005 kann es zu einer Fehlermeldung kommen, die - zumindest auf den ersten Blick - ein wenig unverst&amp;auml;ndlich erscheint.&lt;/p&gt;
&lt;p class="att"&gt;Msg 2389, Level 16, State 1, Line #&lt;br /&gt;XQuery [value()]: 'value()' erfordert ein Singleton (oder eine leere Sequenz). Ein Operand vom 'xdt:untypedAtomic *'-Typ wurde gefunden.&lt;/p&gt;
&lt;p&gt;bzw.&lt;/p&gt;
&lt;p class="att"&gt;Msg 2389,&amp;nbsp;Level 16, Status 1,&amp;nbsp;Line #&lt;br /&gt;XQuery [value()]: 'value()' requires a singleton (or empty sequence), found operand of type 'xdt:untypedAtomic *'&lt;/p&gt;
&lt;p&gt;Dabei ist nicht die Aussage der Fehlermeldung verwirrend, sondern vielmehr die Tatsache, dass alles korrekt zu sein scheint. Dazu folgendes Beispiel:&lt;/p&gt;
&lt;div class="code"&gt;
&lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @test xml&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kwrd"&gt;SET&lt;/span&gt; @test = &lt;span class="str"&gt;'&lt;br /&gt;
&amp;lt;test&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;name&amp;gt;Wolfgang Kluge&amp;lt;/name&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;links&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;link&amp;gt;http://gehirnwindung.de/&amp;lt;/link&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;link&amp;gt;http://klugesoftware.de/&amp;lt;/link&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;link&amp;gt;http://vbwelt.de/&amp;lt;/link&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/links&amp;gt;&lt;br /&gt;
&amp;lt;/test&amp;gt;'&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; @test.&lt;span class="kwrd"&gt;value&lt;/span&gt;(&lt;span class="str"&gt;'/test/links/link[2]/text()'&lt;/span&gt;, &lt;span class="str"&gt;'varchar(200)'&lt;/span&gt;)
&lt;/div&gt;
&lt;p&gt;Die Meldung wei&amp;szlig;t ja bereits darauf hin. Die value()-Funktion erfordert einen einzelnen Wert oder eine leere Sequenz - also eine Abfrage, die keinen oder genau einen Wert zur&amp;uuml;ckgibt. Eben&amp;nbsp;das macht die Abfrage aber eigentlich bereits&amp;nbsp;- sie gibt einen einzelnen Wert zur&amp;uuml;ck. Deswegen scheint die Fehlermeldung nicht wirklich viel Sinn machen.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Nun, m&amp;ouml;glicherweise ist ja die text()-Funktion der Ausl&amp;ouml;ser. Kurz entfernt und getestet,&lt;/p&gt;
&lt;div class="code"&gt;
&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; @test.&lt;span class="kwrd"&gt;value&lt;/span&gt;(&lt;span class="str"&gt;'/test/links/link[2]'&lt;/span&gt;, &lt;span class="str"&gt;'varchar(200)'&lt;/span&gt;)
&lt;/div&gt;
&lt;p&gt;wird&amp;nbsp;aber immer noch der gleiche Fehler ausgegeben... Erfolgreich ist man erst, wenn man die gesamte Abfrage in Klammern setzt und von dieser Menge wiederum&amp;nbsp;ein einziges&amp;nbsp;Element ausw&amp;auml;hlt. Folgende Abfragen funktionieren korrekt:&lt;/p&gt;
&lt;div class="code"&gt;
&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; @test.&lt;span class="kwrd"&gt;value&lt;/span&gt;(&lt;span class="str"&gt;'(/test/links/link)[2]'&lt;/span&gt;, &lt;span class="str"&gt;'varchar(200)'&lt;/span&gt;)&lt;br /&gt;
&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; @test.&lt;span class="kwrd"&gt;value&lt;/span&gt;(&lt;span class="str"&gt;'(/test/links/link[2])[1]'&lt;/span&gt;, &lt;span class="str"&gt;'varchar(200)'&lt;/span&gt;)
&lt;/div&gt;
&lt;p&gt;Sch&amp;ouml;ner (weil meiner Meinung nach auch einfacher lesbar)&amp;nbsp;ist hierbei die erste Zeile. Innerhalb der Klammer werden 3 &amp;lt;link&amp;gt;-Nodes selektiert und au&amp;szlig;erhalb die zweite aus dieser Menge ausgew&amp;auml;hlt.&amp;nbsp;In der zweite Zeile&amp;nbsp;bleibt bereits innerhalb der Klammer nur noch eine &amp;lt;link&amp;gt;-Node &amp;uuml;brig, wovon dann aber trotzdem noch die erste ausgew&amp;auml;hlt werden muss...&lt;/p&gt;
&lt;p&gt;Das Gleiche kann man auch mit Text-Nodes betreiben, solange kein XML Schema angegeben wird, in dem die &amp;lt;link&amp;gt;-Node als reines Textelement definiert ist (ansonsten kommt es zu einem anderen Fehler, weil es schlicht unn&amp;ouml;tig w&amp;auml;re).&lt;/p&gt;
&lt;div class="code"&gt;
&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; @test.&lt;span class="kwrd"&gt;value&lt;/span&gt;(&lt;span class="str"&gt;'(/test/links/link/text())[2]'&lt;/span&gt;, &lt;span class="str"&gt;'varchar(200)'&lt;/span&gt;)&lt;br /&gt;
&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; @test.&lt;span class="kwrd"&gt;value&lt;/span&gt;(&lt;span class="str"&gt;'(/test/links/link[2]/text())[1]'&lt;/span&gt;, &lt;span class="str"&gt;'varchar(200)'&lt;/span&gt;)
&lt;/div&gt;
&lt;p&gt;Die runden Klammern definieren hier noch Mengen von Text-Nodes, von denen (wie oben) eine einzige ausgew&amp;auml;hlt werden muss.&lt;/p&gt;
&lt;h2&gt;Wozu aber die Klammern in XPath&lt;/h2&gt;
&lt;p&gt;Es gibt nat&amp;uuml;rlich auch einen Grund daf&amp;uuml;r. Angenommen, es existieren in diesem Beispiel mehrere &amp;lt;links&amp;gt;-Nodes, so kann es auch mehrere zweite &amp;lt;link&amp;gt;-Elemente im Dokument&amp;nbsp;geben - und somit ist nicht sichergestellt, dass die Abfrage "/test/links/link[2]"&amp;nbsp;einen einzelnen Wert zur&amp;uuml;ckgibt. &lt;strong&gt;Leider&amp;nbsp;ist das sogar auch dann noch so, wenn man per &lt;a title="CREATE XML SCHEMA COLLECTION (Transact-SQL) in der MSDN" href="http://msdn.microsoft.com/en-us/library/ms176009.aspx" target="_blank"&gt;XML SCHEMA COLLECTION&lt;/a&gt; definiert, dass es nur eine einzige &amp;lt;links&amp;gt;-Node geben darf.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Auch schade ist, dass die "Erkennung", ob nun eine Node eindeutig ausgew&amp;auml;hlt wurde, nicht alle M&amp;ouml;glichkeiten von XPath abdeckt. Das Predikat&amp;nbsp;innerhalb des letzten Knotentests muss ein Zahlwert sein (und nicht ein Vergleich, der true zur&amp;uuml;ckgibt). Daher funktioniert zwar &lt;strong&gt;[last()]&lt;/strong&gt;, das ebenso eindeutige &lt;strong&gt;[position()=2]&lt;/strong&gt; wird dagegen aber nicht als eindeutig erkannt.&lt;/p&gt;
&lt;p&gt;Da damit jedoch sichergestellt werden kann, dass nur ein Element ausgew&amp;auml;hlt ist, funktioniert es auch, in jeder Elementhierarchie&amp;nbsp;ein (mit Zahl-Predikaten) genau spezifiziertes Element&amp;nbsp;auszuw&amp;auml;hlen. Das gilt allerdings auch f&amp;uuml;r die text()-Funktion, weswegen man auch dort noch einen Knotentest braucht. Die Zeilen&lt;/p&gt;
&lt;div class="code"&gt;
&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; @test.&lt;span class="kwrd"&gt;value&lt;/span&gt;(&lt;span class="str"&gt;'/test[1]/links[1]/link[2]'&lt;/span&gt;, &lt;span class="str"&gt;'varchar(200)'&lt;/span&gt;)&lt;br /&gt;
&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; @test.&lt;span class="kwrd"&gt;value&lt;/span&gt;(&lt;span class="str"&gt;'/test[1]/links[1]/link[2]/text()[1]'&lt;/span&gt;, &lt;span class="str"&gt;'varchar(200)'&lt;/span&gt;)
&lt;/div&gt;
&lt;p&gt;sind&amp;nbsp;somit auch g&amp;uuml;ltig (ich finde es nur nicht besonders sch&amp;ouml;n). Bei meinen Tests (mit erheblich mehr &amp;lt;link&amp;gt;-Nodes)&amp;nbsp;war die Performancereihenfolge zudem mehr als eindeutig:&lt;/p&gt;
&lt;p&gt;
&lt;table border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Nr.&lt;/td&gt;
&lt;td&gt;Abfrage&lt;/td&gt;
&lt;td style="text-align: right;"&gt;Aufwand&lt;/td&gt;
&lt;td&gt;Faktor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;(/test/links/link/text())[2]&lt;/td&gt;
&lt;td style="text-align: right;"&gt;7,49%&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1,00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;(/test/links/link)[2]&lt;/td&gt;
&lt;td style="text-align: right;"&gt;8,82%&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1,18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;/test[1]/links[1]/link[2]&lt;/td&gt;
&lt;td style="text-align: right;"&gt;14,02%&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1,87&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;/test[1]/links[1]/link[2]/text()[1]&lt;/td&gt;
&lt;td style="text-align: right;"&gt;14,74%&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1,97&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;(/test/links/link[2])[1]&lt;/td&gt;
&lt;td style="text-align: right;"&gt;17,96%&lt;/td&gt;
&lt;td style="text-align: right;"&gt;2,40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;(/test/links/link[2]/text())[1]&lt;/td&gt;
&lt;td style="text-align: right;"&gt;36,98%&lt;/td&gt;
&lt;td style="text-align: right;"&gt;4,94&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;Anhand der dazugeh&amp;ouml;rigen Grafik lassen sich die Unterschiede noch leichter erkennen&lt;img src="http://gehirnwindung.de/image.axd?picture=2009%2f8%2fsql-server-xml-query-performance.png" alt="Performanceunterschiede zwischen den einzelnen XPath-Abfragen" width="450" height="158" /&gt;&lt;/p&gt;
&lt;p&gt;Dass die letzten beiden&amp;nbsp;M&amp;ouml;glichkeiten&amp;nbsp;nicht so schnell&amp;nbsp;sind&amp;nbsp;wie die ersten beiden, kann man noch mit den doppelten Knotentests erkl&amp;auml;ren.&amp;nbsp;F&amp;uuml;r mich ist (und bleibt vorerst)&amp;nbsp;verwunderllich, warum die letzte Abfrage so unglaublich schlecht abschneidet. Grob scheint es aber so zu sein, dass die Abfrage l&amp;auml;nger zur Ausf&amp;uuml;hrung braucht, je mehr Knotentests in der Abfrage enthalten sind.&lt;/p&gt;
&lt;h2&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Um ein echtes XQuery-Singleton zu bekommen, muss die eigentliche&amp;nbsp;Abfrage in runde Klammern gesetzt und mit eckigen Klammern ein einzelner Datensatz aus dieser Menge gew&amp;auml;hlt werden: &lt;strong&gt;(xpath)[1]&lt;/strong&gt;.&lt;br /&gt;Dabei sollte man der Performance zu Liebe versuchen, so viel Knotentests []&amp;nbsp;als irgend m&amp;ouml;glich aus der Abfrage zu entfernen.&lt;/p&gt;</description>
      <link>http://gehirnwindung.de/post/2009/08/23/Singleton-in-XQuery.aspx</link>
      <author>wolfgang@gehirnwindung.de (Wolfgang)</author>
      <comments>http://gehirnwindung.de/post/2009/08/23/Singleton-in-XQuery.aspx#comment</comments>
      <guid>http://gehirnwindung.de/post.aspx?id=1b7911a3-bc7d-4d5e-8f43-89e93b7554b3</guid>
      <pubDate>Sun, 23 Aug 2009 16:52:00 +0100</pubDate>
      <category>Microsoft SQL Server</category>
      <dc:publisher>wolfgang@gehirnwindung.de (Wolfgang)</dc:publisher>
      <pingback:server>http://gehirnwindung.de/pingback.axd</pingback:server>
      <pingback:target>http://gehirnwindung.de/post.aspx?id=1b7911a3-bc7d-4d5e-8f43-89e93b7554b3</pingback:target>
      <slash:comments>4</slash:comments>
      <trackback:ping>http://gehirnwindung.de/trackback.axd?id=1b7911a3-bc7d-4d5e-8f43-89e93b7554b3</trackback:ping>
      <wfw:comment>http://gehirnwindung.de/post/2009/08/23/Singleton-in-XQuery.aspx#comment</wfw:comment>
      <wfw:commentRss>http://gehirnwindung.de/syndication.axd?post=1b7911a3-bc7d-4d5e-8f43-89e93b7554b3</wfw:commentRss>
    </item>
    <item>
      <title>BizTalk Eloquent: You must specify at least one already-initialized correlation set...</title>
      <description>&lt;p&gt;Die L&amp;ouml;sung ist unglaublich einfach - die Frage danach klingt aber alles andere als das *g*. Folgende Fehlermeldung kann beim kompilieren eines BizTalk-Projekts erscheinen.&lt;/p&gt;
&lt;p class="att"&gt;Error&amp;nbsp;3: you must specify at least one already-initialized correlation set for a non-activation receive that is on a non-selfcorrelating port.&lt;/p&gt;
&lt;p&gt;Die Macher dieser wortgewaltigen Fehlermeldung haben durchaus recht. Damit eine Nicht-aktivierende Receive-Shape (wie &amp;uuml;bersetzte man das *g*?) auf einem nicht-Selbst-Korrelierenden Port (Anschluss) funktioniert, muss mindestens ein initialisierter Korrelationssatz vorgegeben werden... Das klingt kompliziert - und das ist es auch.&lt;/p&gt;
&lt;p&gt;Die andere Seite h&amp;auml;tte man - meiner Meinung nach - aber auch dazuschreiben k&amp;ouml;nnen. Will man keine Korrelationss&amp;auml;tze definieren oder braucht man diese erst gar nicht, reicht es auch aus, von einem Nicht-aktivierenden auf einen aktivierenden&amp;nbsp;Port umzustellen. D.h. dass man die Eigenschaft "&lt;strong&gt;Activate&lt;/strong&gt;" des ersten Receive Ports auf "&lt;strong&gt;True&lt;/strong&gt;" stellen muss. Dies d&amp;uuml;rfte in vielen F&amp;auml;llen auch das gew&amp;uuml;nschte Verhalten sein...&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img src="http://gehirnwindung.de/image.axd?picture=2009%2f8%2fbiztalk-orchestration-activate-receive-port.gif" alt="Einstellung Activate einer Receive-Shape in Biztalk-Orchestation" /&gt;&lt;/p&gt;
&lt;p&gt;Was das ist? Ein aktivierender Receive Port initialisiert die Orchestration, sobald eine Nachricht diesem Anschluss zugeordnet wird. D.h. die Orchestration wird nach dem Empfang auf diesem Port ausgef&amp;uuml;hrt. Daher darf es nur einen solchen Receive Port geben (Ausnahmen gibt's mittels Listen- und Parallel-Shape auch hier) und dieser aktivierende Receive Port muss ganz am Anfang stehen (sonst w&amp;uuml;rde man die Orchestration ja zu einem Zeitpunkt aktivieren wollen, zu dem sie bereits l&amp;auml;uft).&lt;/p&gt;</description>
      <link>http://gehirnwindung.de/post/2009/08/08/BizTalk-Eloquent-You-must-specify-at-least-one-already-initialized-correlation-set.aspx</link>
      <author>wolfgang@gehirnwindung.de (Wolfgang)</author>
      <comments>http://gehirnwindung.de/post/2009/08/08/BizTalk-Eloquent-You-must-specify-at-least-one-already-initialized-correlation-set.aspx#comment</comments>
      <guid>http://gehirnwindung.de/post.aspx?id=20351b1a-1a50-4766-be9f-e3d7f319d008</guid>
      <pubDate>Sat, 08 Aug 2009 10:24:00 +0100</pubDate>
      <category>Microsoft BizTalk Server</category>
      <dc:publisher>wolfgang@gehirnwindung.de (Wolfgang)</dc:publisher>
      <pingback:server>http://gehirnwindung.de/pingback.axd</pingback:server>
      <pingback:target>http://gehirnwindung.de/post.aspx?id=20351b1a-1a50-4766-be9f-e3d7f319d008</pingback:target>
      <slash:comments>3</slash:comments>
      <trackback:ping>http://gehirnwindung.de/trackback.axd?id=20351b1a-1a50-4766-be9f-e3d7f319d008</trackback:ping>
      <wfw:comment>http://gehirnwindung.de/post/2009/08/08/BizTalk-Eloquent-You-must-specify-at-least-one-already-initialized-correlation-set.aspx#comment</wfw:comment>
      <wfw:commentRss>http://gehirnwindung.de/syndication.axd?post=20351b1a-1a50-4766-be9f-e3d7f319d008</wfw:commentRss>
    </item>
    <item>
      <title>Der geography-Datentyp und warum die Länge einer Linie nicht unbedingt auch die Distanz zwischen deren Endpunkten ist</title>
      <description>&lt;p&gt;Seltsamer Titel? Stimmt. Das war aber heute&amp;nbsp;eine Frage in einem Microsoft-Forum. Warum ist die L&amp;auml;nge nicht gleich der Distanz zwischen 2 Punkten?&lt;/p&gt;
&lt;p&gt;Nun, das stimmt nat&amp;uuml;rlich nicht - zum Gl&amp;uuml;ck. Bei der Fehlersuche ist allerdings eine Besonderheit des SQL Servers aufgefallen. Zuerst aber mal ein Beispiel&lt;/p&gt;
&lt;div class="code"&gt;
&lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @line &lt;span class="kwrd"&gt;geography&lt;/span&gt;, @pointStart &lt;span class="kwrd"&gt;geography&lt;/span&gt;, @pointEnd &lt;span class="kwrd"&gt;geography&lt;/span&gt;&lt;br /&gt;
&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; @line = &lt;span class="kwrd"&gt;geography&lt;/span&gt;::STGeomFromText(&lt;span class="str"&gt;'LINESTRING(1 2, 3 4)'&lt;/span&gt;, 4326),&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@pointStart = &lt;span class="kwrd"&gt;geography&lt;/span&gt;::Point(1, 2, 4326),&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@pointEnd = &lt;span class="kwrd"&gt;geography&lt;/span&gt;::Point(3, 4, 4326)&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; @line.STLength() &lt;span class="kwrd"&gt;AS&lt;/span&gt; Length,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @pointEnd.STDistance(@pointStart) &lt;span class="kwrd"&gt;AS&lt;/span&gt; Distance&lt;br /&gt;
&lt;br /&gt;

&lt;/div&gt;
&lt;p&gt;Heraus kommen die Werte&lt;/p&gt;
&lt;p&gt;
&lt;table border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Length&lt;/td&gt;
&lt;td&gt;Distance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;313588,386985478&lt;/td&gt;
&lt;td&gt;313705,435222058&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;Doch warum sollte hier ein Unterschied bestehen... STLength() gibt die L&amp;auml;nge des LINESTRINGs zur&amp;uuml;ck und STDistance() berechnet die Distanz zwischen 2 Punkten. Wie bereits vorweggenommen ist das Ergebnis so an sich also&amp;nbsp;falsch -&amp;nbsp;trotzdem ist es so, dass&amp;nbsp;der SQL Server&amp;nbsp;korrekt rechnet. Bleibt als einzige Fehlerquelle also nur noch der Code selbst &amp;uuml;brig...&lt;/p&gt;
&lt;p&gt;Laut MSDN-Referenz zu &lt;a title="Point (geography-Datentyp) in der MSDN" href="http://msdn.microsoft.com/de-de/library/bb933811.aspx" target="_blank"&gt;geography::Point&lt;/a&gt; werden&amp;nbsp;3 Parameter erwartet: Latitude, Longitude und die &lt;a title="Spatial Reference Identifiers in der MSDN" href="http://msdn.microsoft.com/de-de/library/bb964707.aspx" target="_blank"&gt;SRID&lt;/a&gt;. Die Funktion&amp;nbsp;&lt;a title="STGeomFromText (geography-Datentyp) in der MSDN" href="http://msdn.microsoft.com/de-de/library/bb933834.aspx" target="_blank"&gt;geography::STGeomFromText&lt;/a&gt; interpretiert die Angaben aber anders herum. Um genauer zu sein in der Reihenfolge Longitude (geographischer L&amp;auml;nge) und danach Latitude (geographischer Breite).&lt;/p&gt;
&lt;p&gt;Und das war auch schon das ganze Geheimnis ;) Warum geography::Point hier die Werte anders herum erwartet ist mir ein R&amp;auml;tsel und wird es wohl auch bleiben - die Reihenfolge wie sie geography::STGeomFromText&amp;nbsp;interpretiert entspricht den Vorgaben der &lt;a title="Open Geospatial Consortium, Inc." href="http://www.opengeospatial.org/" target="_blank"&gt;OGC&lt;/a&gt;&amp;nbsp;und erscheinen damit in allen m&amp;ouml;glichen Bereichen eben in dieser Reihenfolge (und damit u.a. auch in&amp;nbsp;&lt;a title="Geography Markup Language" href="http://de.wikipedia.org/wiki/Geography_Markup_Language" target="_blank"&gt;GML&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Wie dem auch sei. Es ist alles noch korrekt - man muss nur dran denken ;)&lt;/p&gt;</description>
      <link>http://gehirnwindung.de/post/2009/07/28/Der-geography-Datentyp-und-warum-die-Lange-einer-Linie-nicht-unbedingt-auch-die-Distanz-zwischen-deren-Endpunkten-ist.aspx</link>
      <author>post@example.com (Admin)</author>
      <comments>http://gehirnwindung.de/post/2009/07/28/Der-geography-Datentyp-und-warum-die-Lange-einer-Linie-nicht-unbedingt-auch-die-Distanz-zwischen-deren-Endpunkten-ist.aspx#comment</comments>
      <guid>http://gehirnwindung.de/post.aspx?id=a99ad93d-f666-4d54-9c68-7f26aba37592</guid>
      <pubDate>Tue, 28 Jul 2009 23:52:00 +0100</pubDate>
      <category>Microsoft SQL Server</category>
      <dc:publisher>post@example.com (Admin)</dc:publisher>
      <pingback:server>http://gehirnwindung.de/pingback.axd</pingback:server>
      <pingback:target>http://gehirnwindung.de/post.aspx?id=a99ad93d-f666-4d54-9c68-7f26aba37592</pingback:target>
      <slash:comments>6</slash:comments>
      <trackback:ping>http://gehirnwindung.de/trackback.axd?id=a99ad93d-f666-4d54-9c68-7f26aba37592</trackback:ping>
      <wfw:comment>http://gehirnwindung.de/post/2009/07/28/Der-geography-Datentyp-und-warum-die-Lange-einer-Linie-nicht-unbedingt-auch-die-Distanz-zwischen-deren-Endpunkten-ist.aspx#comment</wfw:comment>
      <wfw:commentRss>http://gehirnwindung.de/syndication.axd?post=a99ad93d-f666-4d54-9c68-7f26aba37592</wfw:commentRss>
    </item>
  </channel>
</rss>