<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Code-Inside Blog</title>
	
	<link>http://code-inside.de/blog</link>
	<description>Webdevelopment on the Microsoft Web Stack with ASP.NET, HTML &amp; Javascript</description>
	<lastBuildDate>Tue, 28 May 2013 20:46:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Code-insideBlog" /><feedburner:info uri="code-insideblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Wieviel Speicher belegt meine RavenDB? Und welchen Plan benötige ich bei CloudBird oder RavenHQ?</title>
		<link>http://feedproxy.google.com/~r/Code-insideBlog/~3/QENJeWWyKhk/</link>
		<comments>http://code-inside.de/blog/2013/05/28/wieviel-speicher-belegt-meine-ravendb-und-welchen-plan-bentige-ich-bei-cloudbird-oder-ravenhq/#comments</comments>
		<pubDate>Tue, 28 May 2013 20:39:08 +0000</pubDate>
		<dc:creator>Robert Mühsig</dc:creator>
				<category><![CDATA[HowTo]]></category>
		<category><![CDATA[CloudBird]]></category>
		<category><![CDATA[RavenDB]]></category>
		<category><![CDATA[RavenHQ]]></category>

		<guid isPermaLink="false">http://code-inside.de/blog/?p=5216</guid>
		<description><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1846-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div>Wer RavenDB nicht auf seinem eigenen Server betreiben möchte oder einfach wissen möchte wieviel Speicherplatz die eigentlichen Daten benötigen gibt es zwei Möglichkeiten: Falls es noch einen anderen Weg gibt: Immer her damit – aktuell hab ich nur die beiden Methoden gefunden und sie scheinen mehr oder weniger zu passen. RavenDB Storage per JSON über ...]]></description>
			<content:encoded><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1846-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div><p>Wer RavenDB nicht auf seinem eigenen Server betreiben möchte oder einfach wissen möchte wieviel Speicherplatz die eigentlichen Daten benötigen gibt es zwei Möglichkeiten:</p>
<p><em>Falls es noch einen anderen Weg gibt: Immer her damit – aktuell hab ich nur die beiden Methoden gefunden und sie scheinen mehr oder weniger zu passen.</em></p>
<h3>RavenDB Storage per JSON über die API:</h3>
<p>Über die <a href="http://ravendb.net/docs/2.0/server/administration/statistics">Server-Statistics</a> (<a href="http://localhost:8080/admin/stats">http://localhost:8080/admin/stats</a>) bekommt man ein JSON mit dem Eintrag “TotalDatabaseHumaneSize” </p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1846.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb996.png" width="398" height="386"></a> </p>
<h3>RavenDB Speicher direkt auf Dateiebene:</h3>
<p>Über das “Data” File innerhalb des Datenbank Ordners sieht man ebenfalls die Größe.</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1847.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb997.png" width="467" height="176"></a> </p>
<h3>Speicherplatz ist lokal natürlich billig… aber wie sieht es gehosted aus?</h3>
<p>Wer RavenDB selbst betreibt der sollte eigentlich keine Probleme mit Festplattenspeicher haben – wir reden hier von einem zweistelligen MB Betrag bei in meinem Beispiel 1500 Dokumenten mit einigen Daten daran – selbst Gigabytes sind heute billig.</p>
<p>Gehosted sieht es bei <a href="https://ravenhq.com/">RavenHQ</a> und <a href="https://www.cloudbird.net/">CloudBird</a> aktuell so aus (Stand Mai 2013). Diese beiden Hoster sind (glaub ich) aktuell auch die einzigen die RavenDB “in der Cloud” gemanaged anbieten. Der Speicher ist hier schon “teurer”, jedenfalls für Hobby-Entwickler.</p>
<h4>RavenHQ</h4>
<p>Genauere Informationen <a href="https://ravenhq.com/pricing.html">gibt es hier</a>.</p>
<p><a href="https://ravenhq.com/pricing.html"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image1848.png" width="570" height="312"></a> </p>
<h4>CloudBird</h4>
<p>Genauere Informationen <a href="https://www.cloudbird.net/pricing">gibt es hier</a>.</p>
<p><a href="https://www.cloudbird.net/pricing"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image1849.png" width="546" height="334"></a> </p>
<p>Damit sollte man nun in der Lage sein abzuschätzen wieviel “Speicher” man benötigt und kann den entsprechenden Plan auswählen.</p>
<img src="http://feeds.feedburner.com/~r/Code-insideBlog/~4/QENJeWWyKhk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://code-inside.de/blog/2013/05/28/wieviel-speicher-belegt-meine-ravendb-und-welchen-plan-bentige-ich-bei-cloudbird-oder-ravenhq/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://code-inside.de/blog/2013/05/28/wieviel-speicher-belegt-meine-ravendb-und-welchen-plan-bentige-ich-bei-cloudbird-oder-ravenhq/</feedburner:origLink></item>
		<item>
		<title>Powershell – Output “formatieren” und Details anzeigen</title>
		<link>http://feedproxy.google.com/~r/Code-insideBlog/~3/527llRqsljk/</link>
		<comments>http://code-inside.de/blog/2013/05/28/powershell-output-formatieren-und-details-anzeigen/#comments</comments>
		<pubDate>Tue, 28 May 2013 19:22:03 +0000</pubDate>
		<dc:creator>Robert Mühsig</dc:creator>
				<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Powershell]]></category>

		<guid isPermaLink="false">http://code-inside.de/blog/?p=5208</guid>
		<description><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image_thumb995-150x150.png" class="attachment-thumbnail wp-post-image" alt="image_thumb.png" title="image_thumb.png" style="margin-bottom: 15px;" /></div>Die Powershell ist ein prima Werkzeug und immer mehr System-Tools und Dienste stellen Powershell Module zur Verfügung. Da ich aber nur “am Rande” mit Powershell zutun habe bin ich auf ein nettes Detail gestossen, welches vermutlich bei den erfahreneren Powershell Usern maximal ein müdes Lächeln hervorruft: Ps-Cmd &#124; Format-List etc. Um den Text-Output zu formatieren ...]]></description>
			<content:encoded><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image_thumb995-150x150.png" class="attachment-thumbnail wp-post-image" alt="image_thumb.png" title="image_thumb.png" style="margin-bottom: 15px;" /></div><p>Die Powershell ist ein prima Werkzeug und immer mehr System-Tools und Dienste stellen Powershell Module zur Verfügung. Da ich aber nur “am Rande” mit Powershell zutun habe bin ich auf ein nettes Detail gestossen, welches vermutlich bei den erfahreneren Powershell Usern maximal ein müdes Lächeln hervorruft:</p>
<h3>Ps-Cmd | Format-List etc.</h3>
<p>Um den Text-Output zu formatieren oder um alle Details des Ergebnisses zu sehen gibt es folgende Befehle:</p>
<p><a href="http://technet.microsoft.com/en-us/library/hh849918.aspx">Format-Wide</a></p>
<p><a href="http://technet.microsoft.com/en-us/library/hh849957.aspx">Format-List</a></p>
<p><a href="http://technet.microsoft.com/en-us/library/hh849892.aspx">Format-Table</a></p>
<p><a href="http://technet.microsoft.com/en-us/library/hh849966.aspx">Format-Custom</a>&nbsp;</p>
<p>Insbesondere das “lange” Dateiennamen bzw. Objekt-Namen irgendwann abgeschnitten werden hatte mich dazu veranlasst nach diesen Methoden zu suchen.</p>
<p>Beispiel:</p>
<p><em>dir | Format-List Name,LastWriteTime</em></p>
<p>Ich nehm den einfachen “dir”-Command, wobei man den Output überall über diese Zusätze formatieren kann.</p>
<h3>Format-Wide</h3>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1843.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb993.png" width="478" height="178"></a>&nbsp;</p>
<h1></h1>
<h3>Format-List</h3>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1844.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb994.png" width="498" height="377"></a> </p>
<h3>Format-Table</h3>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1845.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb995.png" width="508" height="282"></a> </p>
<p>Bei Format-Custom hatte ich spontan kein gutes Beispiel gefunden, vermutlich kann man damit aber nette Sachen machen <img src='http://code-inside.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Powershell-Anfänger Kurs erstmal wieder beendet.</p>
<img src="http://feeds.feedburner.com/~r/Code-insideBlog/~4/527llRqsljk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://code-inside.de/blog/2013/05/28/powershell-output-formatieren-und-details-anzeigen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://code-inside.de/blog/2013/05/28/powershell-output-formatieren-und-details-anzeigen/</feedburner:origLink></item>
		<item>
		<title>Rabatt-Code &amp; Freiticket für die Developer Week 2013</title>
		<link>http://feedproxy.google.com/~r/Code-insideBlog/~3/uK6gf6YafcA/</link>
		<comments>http://code-inside.de/blog/2013/05/27/rabatt-code-freiticket-fr-die-developer-week-2013/#comments</comments>
		<pubDate>Mon, 27 May 2013 20:48:25 +0000</pubDate>
		<dc:creator>Robert Mühsig</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Gewinnspiel]]></category>

		<guid isPermaLink="false">http://code-inside.de/blog/?p=5200</guid>
		<description><![CDATA[<div><img width="150" height="125" src="http://code-inside.de/blog/wp-content/uploads/clip_image002-150x125.jpg" class="attachment-thumbnail wp-post-image" alt="clip_image002.jpg" title="clip_image002.jpg" style="margin-bottom: 15px;" /></div>Nach langer Zeit haben wir mal wieder ein kleines Angebot für euch: Wir sind Medienpartner der Developer Week 2013 und über uns könnt ihr günstiger an Tickets herankommen. Mit dem Code DWX13coi könnt ihr von Sonderkonditionen profitieren (= Ticketpreise werden niedriger &#38; keine bösen Überraschungen). Die Developer Week (DWX) bündelt vom 24.-27. Juni 2013 in ...]]></description>
			<content:encoded><![CDATA[<div><img width="150" height="125" src="http://code-inside.de/blog/wp-content/uploads/clip_image002-150x125.jpg" class="attachment-thumbnail wp-post-image" alt="clip_image002.jpg" title="clip_image002.jpg" style="margin-bottom: 15px;" /></div><p>Nach langer Zeit haben wir mal wieder ein kleines Angebot für euch: Wir sind Medienpartner der Developer Week 2013 und über uns könnt ihr günstiger an Tickets herankommen. Mit dem Code <b>DWX13coi</b> könnt ihr von Sonderkonditionen profitieren (= <strong>Ticketpreise werden niedriger &amp; keine bösen Überraschungen)</strong>. </p>
<p><em>Die <a href="http://www.developer-week.de"><strong>Developer Week (DWX)</strong></a><strong> </strong>bündelt vom <strong>24.-27. Juni 2013</strong> in <strong>Nürnberg</strong> die bekannten Veranstaltungsformate WDC (Web Developer Conference), MDC (Mobile Developer Conference) und DDC (.NET Developer Conference) in einer Woche und an einem Ort. Die Teilnehmer erwarten mehr als 200 Top-Experten vor Ort, fast 40 Thementracks und 250 Sessions zu Web, Mobile und .NET-Entwicklung. </em>
<p><em>Präsentiert wird die Veranstaltung von den Fachmagazinen dotnetpro und der web &amp; mobile developer der Neuen Mediengesellschaft Ulm.</em>
<p>Zur <strong><a href="http://www.developer-week.de/Anmeldung/Anmeldung-2013">Anmeldung geht es direkt hier</a></strong> – dort könnt ihr auch über den Code angeben und bekommt einen günstigeren Preis.<br />
<h2></h2>
<h1>Freiticket? Freiticket! </h1>
<p><strong></strong>&nbsp;</p>
<p><strong>Als kleines Extra gibt es noch ein Freiticket für die komplette Veranstaltung zu gewinnen!</strong></p>
<p>Da einfache Verlosungen immer etwas unlustig sind, probieren wir mal einen anderen Weg: Kommentiert den<strong> </strong><a href="https://www.facebook.com/CodeInsideBlog/posts/604959489522181"><strong>Facebook-Post</strong></a> auf unserer <a href="https://www.facebook.com/CodeInsideBlog/">Facebook Fanseite</a> und schreibt den lustigsten, skurrilsten oder sonderbarsten Checkin-Kommentar den ihr gelesen oder selbst verfasst habt. Der Kommentar mit den höchsten &#8220;Likes&#8221; gewinnt. Am 31. Mai (Freitag) zum Mittag endet die Aktion.</p>
<p><a href="https://www.facebook.com/CodeInsideBlog/posts/604959489522181"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image1842.png" width="339" height="322"></a></p>
<img src="http://feeds.feedburner.com/~r/Code-insideBlog/~4/uK6gf6YafcA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://code-inside.de/blog/2013/05/27/rabatt-code-freiticket-fr-die-developer-week-2013/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://code-inside.de/blog/2013/05/27/rabatt-code-freiticket-fr-die-developer-week-2013/</feedburner:origLink></item>
		<item>
		<title>IIS &amp; Windows Authentication – Troubleshooting mit Negotiate &amp; NTLM</title>
		<link>http://feedproxy.google.com/~r/Code-insideBlog/~3/3B3s1xS6YPY/</link>
		<comments>http://code-inside.de/blog/2013/05/12/iis-windows-authentication-troubleshooting-mit-negotiate-ntlm/#comments</comments>
		<pubDate>Sun, 12 May 2013 19:50:51 +0000</pubDate>
		<dc:creator>Robert Mühsig</dc:creator>
				<category><![CDATA[Fix]]></category>
		<category><![CDATA[IIS]]></category>
		<category><![CDATA[Troubleshooting]]></category>
		<category><![CDATA[Windows Auth]]></category>

		<guid isPermaLink="false">http://code-inside.de/blog/?p=5192</guid>
		<description><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1840-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div>Windows Authentifizierung ist eine einfache (und naheliegende) Authentifizierungs-Option für “Haus-interne” Webapplikationen. Setup Im IIS selbst kann man die Windows Authentifzierung sehr leicht anschalten: Natürlich kann man dies auch über die web.config steuern: &#60;system.web&#62; ... &#60;authentication mode="Windows"/&#62; ... &#60;/system.web&#62; ... Fehlermeldung “HTTP Error 401.2 – Unauthorized”: Dies kann (wie fast immer) viele Gründe haben, z.B. weil ...]]></description>
			<content:encoded><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1840-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div><p>Windows Authentifizierung ist eine einfache (und naheliegende) Authentifizierungs-Option für “Haus-interne” Webapplikationen. </p>
<h3>Setup</h3>
<p>Im IIS selbst kann man die Windows Authentifzierung sehr leicht anschalten:</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/iis1.gif"><img title="iis" style="display: inline" alt="iis" src="http://code-inside.de/blog/wp-content/uploads/iis_thumb1.gif" width="582" height="365"></a></p>
<p>Natürlich kann man dies auch über die <a href="http://msdn.microsoft.com/en-us/library/ff647405.aspx">web.config</a> steuern:</p>
<pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;"> &lt;system.web&gt;
  ...
  &lt;authentication mode="Windows"/&gt;
  ...
 &lt;/system.web&gt;
 ...</pre>
<h3>Fehlermeldung “HTTP Error 401.2 – Unauthorized”:</h3>
<p>Dies kann (wie fast immer) viele Gründe haben, z.B. weil man nicht die erforderten Rechte hat. Wenn man dies als Fehlerquelle ausschliessen kann, sollte man überprüfen ob überhaupt die Windows Authentifzierung angeschalten ist und ob das Feature in den Windows-Komponenten aktiviert ist:</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1839.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb990.png" width="572" height="476"></a></p>
<h3>Providers:</h3>
<p>Im Normalfall gibt es zwei Provider: Negotiate und NTLM. Negotiate sagt einfach nur, dass Server und Client sich abstimmen. Allerdings hatte ich bislang zweimal das Problem, dass Server und Client sich auf Kerberos Authentifizierung geeinigt hatten, dies aber aus irgendeinem Grund nicht funktionierte. Als ich nur noch NTLM nutze ging es.</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1840.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb991.png" width="540" height="467"></a> </p>
<h3>Troubleshooting Tipps:</h3>
<p>Ruft man die Seite direkt auf dem Server über den IE auf, wird immer NTLM genommen (und nicht Kerberos).</p>
<p>Alle nicht IE-Browser versuchen sich über NTLM zu authentifizieren. Zum Testen nehm ich sowohl IE als auch Chrome.</p>
<p>Wer im IE eine automatische Anmeldung möchte, d.h. kein Login Prompt, muss die URL in der Intranet-Zone eintragen (oder die Policies verändern)</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1841.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb992.png" width="568" height="345"></a> </p>
<p>Windows Authentifizierung ist eine nette Sache – wenn sie funktioniert <img src='http://code-inside.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<img src="http://feeds.feedburner.com/~r/Code-insideBlog/~4/3B3s1xS6YPY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://code-inside.de/blog/2013/05/12/iis-windows-authentication-troubleshooting-mit-negotiate-ntlm/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://code-inside.de/blog/2013/05/12/iis-windows-authentication-troubleshooting-mit-negotiate-ntlm/</feedburner:origLink></item>
		<item>
		<title>Json-Online-Tools: Viewer &amp; Json2Csharp Generator</title>
		<link>http://feedproxy.google.com/~r/Code-insideBlog/~3/jxmMTr7aw5s/</link>
		<comments>http://code-inside.de/blog/2013/05/07/json-online-tools-viewer-json2csharp-generator/#comments</comments>
		<pubDate>Tue, 07 May 2013 21:28:59 +0000</pubDate>
		<dc:creator>Robert Mühsig</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Json]]></category>

		<guid isPermaLink="false">http://code-inside.de/blog/?p=5182</guid>
		<description><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1837-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div>Wo APIs im Spiel sind, ist das JSON Format nicht weit. Da ich immer mal wieder zwei Tools benutze, möchte ich diese hier auch mal kurz würdigen. JSON Viewer Wer nur den JSON-Text vor sich hat sieht meist die Struktur nicht. Über JSON Viewer kann man sich recht einfach einen Überblick verschaffen: [URL] JSON2CSharp Der ...]]></description>
			<content:encoded><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1837-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div><p>Wo APIs im Spiel sind, ist das JSON Format nicht weit. Da ich immer mal wieder zwei Tools benutze, möchte ich diese hier auch mal kurz würdigen.</p>
<h3>JSON Viewer</h3>
<p> Wer nur den JSON-Text vor sich hat sieht meist die Struktur nicht. Über JSON Viewer kann man sich recht einfach einen Überblick verschaffen: [<a href="http://jsonviewer.stack.hu/"><strong>URL</strong></a>]</p>
<p><a href="http://jsonviewer.stack.hu/"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image1837.png" width="568" height="564"></a> </p>
<h2>JSON2CSharp</h2>
<p>Der Titel sagt schon alles: Mit dem Tool kann man sehr einfach JSON in CSharp Code umwandeln. Dies ist dann ziemlich nützlich wenn man z.B. das Gegenstück zur einer JSON-API baut und mit den Resultaten “arbeiten” möchte: [<strong><a href="http://json2csharp.com/">URL</a></strong>]</p>
<p><a href="http://json2csharp.com/"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image1838.png" width="560" height="602"></a></p>
<img src="http://feeds.feedburner.com/~r/Code-insideBlog/~4/jxmMTr7aw5s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://code-inside.de/blog/2013/05/07/json-online-tools-viewer-json2csharp-generator/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://code-inside.de/blog/2013/05/07/json-online-tools-viewer-json2csharp-generator/</feedburner:origLink></item>
		<item>
		<title>Tools &amp; Vorgehen für Entwicklung rund um OpenXml oder wie erstelle ich Office Dokumente mit .NET?</title>
		<link>http://feedproxy.google.com/~r/Code-insideBlog/~3/823-ayZGeO4/</link>
		<comments>http://code-inside.de/blog/2013/04/30/tools-vorgehen-fr-entwicklung-rund-um-openxml-oder-wie-erstelle-ich-office-dokumente-mit-net/#comments</comments>
		<pubDate>Tue, 30 Apr 2013 20:17:09 +0000</pubDate>
		<dc:creator>Robert Mühsig</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Office]]></category>
		<category><![CDATA[OpenXML]]></category>

		<guid isPermaLink="false">http://code-inside.de/blog/?p=5174</guid>
		<description><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1833-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div>Durch meine Tätigkeit bei der&#160; OneOffixx AG habe ich recht tiefe Einblicke in die Erstellung von Microsoft Office Dokumente mit .NET bekommen. Da das Problem “Office Dokumente per Code” zu erstellen recht verbreitet ist, schreib ich mal Empfehlungen für die ersten Schritte. Must Have Tools Ganz klar sollte man das Office in der jeweiligen Version ...]]></description>
			<content:encoded><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1833-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div><p>Durch meine Tätigkeit bei der&nbsp; <a href="http://www.oneoffixx.com/">OneOffixx AG</a> habe ich recht tiefe Einblicke in die Erstellung von Microsoft Office Dokumente mit .NET bekommen. Da das Problem “Office Dokumente per Code” zu erstellen recht verbreitet ist, schreib ich mal Empfehlungen für die ersten Schritte.</p>
<h3>Must Have Tools</h3>
<p>Ganz klar sollte man das Office in der jeweiligen Version installiert haben – zum Teil unterscheiden sich die Versionen. Für die meisten Fälle sollte es aber klappen, aber lieber nachprüfen bevor der Kunde sich ärgert <img src='http://code-inside.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . <br/> <b>Wichtiger Hinweis: OpenXML benötigt keine Office Installation. Man kann es bedenkenlos z.B. auf einem Webserver nutzen. </b></p>
<p>Das OpenXML SDK und das OpenXML SDK Productivity Tool for Microsoft Office. Die aktuellste Version ist die 2.5, welches es <a href="http://www.microsoft.com/en-us/download/details.aspx?id=30425"><strong>hier zum Download gibt</strong></a> – wobei man erst das SDK installieren muss und danach die Tools.</p>
<p>Visual Studio wäre natürlich von Vorteil <img src='http://code-inside.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Ein guten XML Viewer – Notepad ist leicht nervig. Ich nutze <a href="http://notepad-plus-plus.org/"><strong>Nodepad++</strong></a> mit den XML Tools Plugin.</p>
<p><strong>OpenXML ist… kompliziert…</strong></p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1834.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; margin: 0px 10px 0px 0px; border-left: 0px; display: inline" border="0" alt="image" align="left" src="http://code-inside.de/blog/wp-content/uploads/image_thumb987.png" width="170" height="330"></a> </p>
<p>Microsofts XML Spezifikation liegt “gefühlt” sehr nah an der Ur-Implementierung im binären Format &#8211; es finden sich daher oft sehr interessante Konstrukte in XML Form wieder.</p>
<p>Das Bild stammt zudem von <a href="http://noooxml.wikidot.com/rice-pudding">dieser Seite</a>, welche den Standard “nicht so gern hat” – ohne Wertung von meiner Seite <img src='http://code-inside.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Da der Umgang in komplexeren Dokumenten <a href="http://msdn.microsoft.com/en-us/library/office/ff478255.aspx">nicht so einfach wie hier dargestellt</a> ist empfehle ich jeden folgendes Vorgehen…</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3>Vorgehen: Wunsch-Dokument erstellen – OpenXML Productivity Tool – Reflect Code FTW!</h3>
<p>Am einfachsten ist es sich sein Wunsch-Dokument in Word/Powerpoint/Excel zu erstellen (bzw. ein bestehendes in das Tool laden) und über das Productivity Tool sich den Code dazu anzeigen lassen.</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1835.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb988.png" width="570" height="437"></a> </p>
<p>Der erzeugte Code ist zwar “kryptisch”, funktioniert aber (im Sinne von Copy/Paste in ein neues Projekt) und nun kann man sich Stück für Stück den Code refactoren. Das Tool kann neben “Reflect Code” auch ein Diff zwischen zwei Open XML Dateien erzeugen, zum Debugging äusserst hilfreich!</p>
<h3>Andere Herangehensweise: Das Zip mal öffnen…</h3>
<p>Um die Struktur genauer zu verstehen ist es auch von Vorteil die docx/pptx/xlsx Datei in .zip umzubenennen und die einzelnen XML Files genauer anzuschauen:</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1836.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb989.png" width="576" height="304"></a> </p>
<h3>Wo liegt denn die DocumentFormat.OpenXml.dll und was brauch ich noch?</h3>
<p>Die .NET Assembly wird mit dem SDK installiert:</p>
<p><em>C:\Program Files (x86)\Open XML SDK\V2.5\lib</em></p>
<p>Das Open XML SDK setzt auf den Namespace System.IO.Packaging auf, <a href="http://msdn.microsoft.com/en-us/library/system.io.packaging.aspx">daher benötigt man noch die WindowsBase.dll</a>.</p>
<h3>Das wäre es eigentlich auch schon… </h3>
<p>Durchbeissen und Frust-Resistenzen aufbauen <img src='http://code-inside.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  </p>
<p>Happy Coding!</p>
<img src="http://feeds.feedburner.com/~r/Code-insideBlog/~4/823-ayZGeO4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://code-inside.de/blog/2013/04/30/tools-vorgehen-fr-entwicklung-rund-um-openxml-oder-wie-erstelle-ich-office-dokumente-mit-net/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://code-inside.de/blog/2013/04/30/tools-vorgehen-fr-entwicklung-rund-um-openxml-oder-wie-erstelle-ich-office-dokumente-mit-net/</feedburner:origLink></item>
		<item>
		<title>Windows Phone SDK- &amp; “System”-Icons</title>
		<link>http://feedproxy.google.com/~r/Code-insideBlog/~3/VmRR6Q7hmqY/</link>
		<comments>http://code-inside.de/blog/2013/04/28/windows-phone-sdk-system-icons/#comments</comments>
		<pubDate>Sun, 28 Apr 2013 11:08:36 +0000</pubDate>
		<dc:creator>Robert Mühsig</dc:creator>
				<category><![CDATA[Windows Phone]]></category>
		<category><![CDATA[Icons]]></category>

		<guid isPermaLink="false">http://code-inside.de/blog/?p=5163</guid>
		<description><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1832-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div>Zwar legt das Metro Design viel Wert auf Typografie – jedoch sind auch Icons sehr wichtig. Wer das Windows Phone SDK installiert hat, bekommt 36 Icons mitgeliefert. Diese sind unter diesem Pfad zu finden: C:\Program Files (x86)\Microsoft SDKs\Windows Phone\v8.0\Icons Viele Icons, welche man von den eingebauten Anwendungen kennt, sind allerdings nicht enthalten. Pedro Lamas hat ...]]></description>
			<content:encoded><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1832-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div><p>Zwar legt das Metro Design viel Wert auf Typografie – jedoch sind auch Icons sehr wichtig. Wer das Windows Phone SDK installiert hat, bekommt 36 Icons mitgeliefert. Diese sind unter diesem Pfad zu finden:</p>
<p><em>C:\Program Files (x86)\Microsoft SDKs\Windows Phone\v8.0\Icons</em></p>
<p>Viele Icons, welche man von den eingebauten Anwendungen kennt, sind allerdings nicht enthalten. <a href="http://www.pedrolamas.com/">Pedro Lamas</a> hat 99 weitere Icons aus von den App-Resources extrahiert und <a href="http://www.pedrolamas.com/windows-phone/windows-phone-8-application-bar-icons/"><strong>bietet sie hier zum Download</strong></a> an.</p>
<img src="http://feeds.feedburner.com/~r/Code-insideBlog/~4/VmRR6Q7hmqY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://code-inside.de/blog/2013/04/28/windows-phone-sdk-system-icons/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://code-inside.de/blog/2013/04/28/windows-phone-sdk-system-icons/</feedburner:origLink></item>
		<item>
		<title>Wie finde ich heraus ob mein ADFS 2.0 funktioniert?</title>
		<link>http://feedproxy.google.com/~r/Code-insideBlog/~3/86_RT5nTfaQ/</link>
		<comments>http://code-inside.de/blog/2013/04/23/wie-finde-ich-heraus-ob-mein-adfs-2-0-funktioniert/#comments</comments>
		<pubDate>Tue, 23 Apr 2013 21:10:51 +0000</pubDate>
		<dc:creator>Robert Mühsig</dc:creator>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[HowTo]]></category>
		<category><![CDATA[ADFS]]></category>
		<category><![CDATA[Auth]]></category>

		<guid isPermaLink="false">http://code-inside.de/blog/?p=5159</guid>
		<description><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1830-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div>Ich hatte mich recht lange mti dem Thema ADFS 2.0 (“Active Directory Federation Services”) beschäftigt und da kam die recht einfache Frage auf: Wie stelle ich fest ob die Verbindung zwischen ADFS und AD “funktioniert”? Hier eine simple Variante es zu testen… Was ist ein ADFS überhaupt? Wenn man über AD-Grenzen hinweg “Vertrauensstellungen” braucht, dann ...]]></description>
			<content:encoded><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1830-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div><p>Ich hatte mich recht lange mti dem Thema <a href="http://technet.microsoft.com/en-us/library/adfs2(v=ws.10).aspx">ADFS 2.0 (“Active Directory Federation Services”)</a> beschäftigt und da kam die recht einfache Frage auf: Wie stelle ich fest ob die Verbindung zwischen ADFS und AD “funktioniert”? Hier eine simple Variante es zu testen…</p>
<h3>Was ist ein ADFS überhaupt?</h3>
<p>Wenn man über AD-Grenzen hinweg “Vertrauensstellungen” braucht, dann nimmt man in der Microsoft Welt die Active Directory Services. Diese vermitteln zwischen Sender (eigenes Unternehmens-AD) und Empfänger (ein anderes AD oder ein grosse “Zentrale”, wie z.B. der <a href="http://en.wikipedia.org/wiki/Access_Control_Service">Windows Azure Access Control Service</a>) und stellt für den angemeldeten Benutzer Claims aus. Vermutlich ist das nicht 100% ganz exakt und meine Begrifflichkeiten passen auch nicht 100%, aber im Grunde versteh ich das System so <img src='http://code-inside.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h3>Wie teste ich nun die Funktionalität des ADFS?</h3>
<p>Der ADFS nutzt den IIS um die eigentlichen Endpunkte zu hosten. Es gibt auch eine simple Login-Seite, die jeder Nutzen kann:</p>
<p><strong><a href="https://{ADFS-FQDN}/adfs/ls/IdpInitiatedSignon.aspx">https://{ADFS-FQDN}/adfs/ls/IdpInitiatedSignon.aspx</a></strong>
<p>Danach erscheint eine simple “Login-Seite” – nach dem Klick auf “Anmelden” sollte sowas zu sehen sein:
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1830.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb983.png" width="558" height="252"></a>
<p>Wenn diese Seite ohne es Nutzernamen / Passworts kam funktioniert die Anmeldung über Kerberos – andernfalls wird NTLM genommen.
<p>Falls<strong> alles schief läuft</strong> (oder die Konfigurationsdatenbank “kaputt” ist) sieht man solch eine <strong>Fehlermeldung</strong>:
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1831.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb984.png" width="550" height="225"></a>
<p><strong>Was man damit testen kann:</strong>
<p>Damit stellt man erstmal nur sicher, dass die Konfiguration/Verbindung<strong> zwischen ADFS und eigenen AD “funktioniert” – mehr nicht – aber auch hier kann es schon zu Problemen kommen</strong>. Ob nun die “Gegenstelle” funktioniert ist ein anderes Problem.<br />
<h3>Ich habe ein ADFS Proxy im Einsatz – was nun?</h3>
<p>Im Grunde prüft man erst den “Haupt”-ADFS und später schaut man von einer anderen Maschine, welche nur den Proxy sieht, ob dieser Login klappt. Danach geht es weiter bis hin zum “Kunden”.
<p>In diesem Blogpost ist das Vorgehen näher beschrieben (und ich glaub von diesem hab ich auch den Tipp) : <a href="http://www.dagint.com/2011/10/how-to-test-if-adfs-is-functioning/">How to test if ADFS is functioning</a><br />
<h3>Troubleshooting</h3>
<p>Ich hatte ein paar Probleme mit dem ADFS, welche leider noch nicht vollständig gelöst wurden, jedoch hab ich ein paar Links noch gefunden, welche vielleicht jemanden weiterhelfen:</p>
<p><a href="http://social.technet.microsoft.com/wiki/contents/articles/1600.ad-fs-2-0-how-to-change-the-local-authentication-type.aspx">AD FS 2.0: How to Change the Local Authentication Type</a></p>
<p><a href="http://social.technet.microsoft.com/wiki/contents/articles/ad-fs-2-0-how-to-configure-the-spn-serviceprincipalname-for-the-service-account.aspx">AD FS 2.0: How to Configure the SPN (servicePrincipalName) for the Service Account</a></p>
<img src="http://feeds.feedburner.com/~r/Code-insideBlog/~4/86_RT5nTfaQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://code-inside.de/blog/2013/04/23/wie-finde-ich-heraus-ob-mein-adfs-2-0-funktioniert/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://code-inside.de/blog/2013/04/23/wie-finde-ich-heraus-ob-mein-adfs-2-0-funktioniert/</feedburner:origLink></item>
		<item>
		<title>Windows Phone Fonts – wenn Visual Studio “lügt”</title>
		<link>http://feedproxy.google.com/~r/Code-insideBlog/~3/VlDXBEJAEmg/</link>
		<comments>http://code-inside.de/blog/2013/04/22/windows-phone-fonts-wenn-visual-studio-lgt/#comments</comments>
		<pubDate>Mon, 22 Apr 2013 21:45:40 +0000</pubDate>
		<dc:creator>Robert Mühsig</dc:creator>
				<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Windows Phone]]></category>
		<category><![CDATA[Fonts]]></category>

		<guid isPermaLink="false">http://code-inside.de/blog/?p=5152</guid>
		<description><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1828-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div>Heute bin ich auf ein kleines Problem gestossen: Meine Windows Phone App wollte meinen ausgefählten Font nicht anzeigen – auch einige andere gingen nicht. Obwohl der Visual Studio Designer die Fonts durchaus anzeigt: Im Emulator ist davon allerdings nichts mehr zu sehen: Grund hierfür: Windows Phone enthält nicht alle Schriftarten wie Windows D.h. bei der ...]]></description>
			<content:encoded><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1828-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div><p>Heute bin ich auf ein kleines Problem gestossen: Meine Windows Phone App wollte meinen ausgefählten Font nicht anzeigen – auch einige andere gingen nicht. </p>
<p>Obwohl der Visual Studio Designer die Fonts durchaus anzeigt:</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1828.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb981.png" width="299" height="502"></a> </p>
<p>Im Emulator ist davon allerdings nichts mehr zu sehen:</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1829.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb982.png" width="295" height="496"></a> </p>
<p><strong>Grund hierfür:</strong></p>
<h3>Windows Phone enthält nicht alle Schriftarten wie Windows</h3>
<p>D.h. bei der Wahl der Schriftarten sollte man darauf achten, dass sie mit Windows Phone kompatibel sind. </p>
<p>Ich hab zwei Seiten gefunden welche verfügbare Fonts auflisten:</p>
<p><a href="http://msdn.microsoft.com/en-us/library/ff806365%28v=vs.95%29.aspx">Fonts in Silverlight for Windows Phone</a></p>
<p><a href="http://msdn.microsoft.com/en-us/library/windowsphone/develop/cc189010(v=vs.105).aspx">Text and fonts for Windows Phone</a></p>
<p>PS: Comic Sans ist natürlich verfügbar <img src='http://code-inside.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<img src="http://feeds.feedburner.com/~r/Code-insideBlog/~4/VlDXBEJAEmg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://code-inside.de/blog/2013/04/22/windows-phone-fonts-wenn-visual-studio-lgt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://code-inside.de/blog/2013/04/22/windows-phone-fonts-wenn-visual-studio-lgt/</feedburner:origLink></item>
		<item>
		<title>WebDeploy Port ändern oder wofür ist Port 8172 da?</title>
		<link>http://feedproxy.google.com/~r/Code-insideBlog/~3/5XXkadAJxaQ/</link>
		<comments>http://code-inside.de/blog/2013/04/20/webdeploy-port-ndern-oder-wofr-ist-port-8172-da/#comments</comments>
		<pubDate>Sat, 20 Apr 2013 21:19:27 +0000</pubDate>
		<dc:creator>Robert Mühsig</dc:creator>
				<category><![CDATA[HowTo]]></category>
		<category><![CDATA[IIS]]></category>
		<category><![CDATA[WebDeploy]]></category>

		<guid isPermaLink="false">http://code-inside.de/blog/?p=5146</guid>
		<description><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1825-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div>Wer WebDeploy auf einem Server Betriebssystem nutzt, der geht im Standardfall über den Port 8172. Aber wofür ist der Port eigentlich da und wie kann ich den ändern? Hinweis: Für die WebDeploy Installieren empfehle ich diesen und diesen Blogpost.&#160; Port 8172 = IIS Management Service Default Port Der Port 8172 ist der Standard-Port des IIS ...]]></description>
			<content:encoded><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1825-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div><p>Wer WebDeploy auf einem Server Betriebssystem nutzt, der geht im Standardfall über den Port 8172. Aber wofür ist der Port eigentlich da und wie kann ich den ändern?</p>
<p><em>Hinweis: Für die WebDeploy Installieren empfehle ich </em><a href="http://code-inside.de/blog/2012/11/06/setup-iis-8-fr-asp-net-webdeploy-auf-windows-8-und-windows-server-2012/"><em>diesen</em></a><em> und </em><a href="http://code-inside.de/blog/2012/10/15/web-deploy-per-webpi-installiert-und-iis-management-service-nicht-vorhanden/"><em>diesen</em></a><em> Blogpost.</em>&nbsp; </p>
<p><strong>Port 8172 = IIS Management Service Default Port</strong></p>
<p>Der Port 8172 ist der Standard-Port des IIS Management Services, welchen es auch nur für Server Betriebssysteme gibt (also keine Sorge wenn ihr ihn im IIS unter Windows 7/8 nicht findet).</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1825.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb978.png" width="376" height="410"></a></p>
<p>Über die GUI (und sicher auch über die Powershell) kann man diese Einstellungen ändern wenn der Dienst gerade nicht läuft.</p>
<p>Das war es eigentlich schon. </p>
<p><strong>Hintergrund-Info: WebDeploy &amp; Web Management Service Handler</strong></p>
<p>Weiter oben habe ich schon geschrieben das der Web Management Service nur auf Server Betriebssystemen zum Einsatz kommt – wie funktioniert dann aber WebDeploy auf meinem lokalen IIS?</p>
<p>Auf dem Blog von <a href="http://blog.richardszalay.com/">Richard Szalay</a> habe ich <a href="http://blog.richardszalay.com/2013/02/02/building-a-deployment-pipeline-with-msdeploy-part-4-server-configuration/">eine tolle Zusammenfassung über WebDeploys “Deployment Modelle” gefunden</a>:</p>
<ol>
<ol>
<li><em><strong>Web</strong> <strong>Management Service (WMSvc) handler</strong><br />This is the preferred method for IIS 7+ / Windows Server 2008+ and supports non-administrator deployments. It piggybacks on the WMSvc (ie. remote IIS management) by registering a custom handler (</em><a href="http://server:8172/msdeploy.axd"><em>http://server:8172/msdeploy.axd</em></a><em>). Making use of WMSvc also means that this method is not available to Windows client versions (including 7 and 8), as WMSvc is not available on those platforms. At the command line, this method is specified on the dest provider as “,computerName=http://server:8172/msdeploy.axd?site=iis-site-name”<br /></em>
<li><em><strong>Web Deploy Agent Service</strong><br />This is the only choice for IIS6 / Server 2003, is not installed by default, and requires the deployment user to be an administrator. At the comment line, this method is specified as “,computerName=server“ </em>
<li><em><strong>“On Demand” Agent Service (temp agent)<br /></strong>This choice installs the agent service temporarily for a single deployment. Useful when you have administrator credentials but aren’t able to remotely install the handler or agent service. At the command line, this method is specified as“,computerName=server,tempAgent=true”</em></li>
</ol>
</ol>
<p>&nbsp;</p>
<p>WebDeploy auf dem Server selbst funktioniert immer im Zusammenspiel mit dem Web Management Service – ändert man den Port des WMSvc Handlers, ändert man den Port für WebDeploy.</p>
<p><strong>Hintergrund-Info: Wo werden diese Einstellungen eigentlich gespeichert?</strong></p>
<p>Ein paar dieser <a href="http://www.iis.net/learn/manage/remote-administration/remote-administration-for-iis-manager">Settings (wie z.B. den Port) habe ich in der Registry</a> wiedergefunden:</p>
<p>Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WebManagement\Server</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1826.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb979.png" width="458" height="275"></a> </p>
<p>Andere Settings stehen in der <a href="http://www.iis.net/configreference/system.webserver/management">administration.config </a>(unter C:\Windows\System32\inetsrv\config)</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1827.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb980.png" width="240" height="133"></a> </p>
<p><strong>TL;DR:</strong></p>
<p>Auf einem Server im IIS Manager auf Management Service gehen und da den Port ändern. WebDeploy nutzt den Management Service für das Deployment – wobei der Management Service auch zur “Remote-Verwaltung” dient.</p>
<img src="http://feeds.feedburner.com/~r/Code-insideBlog/~4/5XXkadAJxaQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://code-inside.de/blog/2013/04/20/webdeploy-port-ndern-oder-wofr-ist-port-8172-da/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://code-inside.de/blog/2013/04/20/webdeploy-port-ndern-oder-wofr-ist-port-8172-da/</feedburner:origLink></item>
		<item>
		<title>IIS meets your Browser – Administration im Web mit Servant</title>
		<link>http://feedproxy.google.com/~r/Code-insideBlog/~3/mpEPrLJ9XlM/</link>
		<comments>http://code-inside.de/blog/2013/04/18/iis-meets-your-browser-administration-im-web-mit-servant/#comments</comments>
		<pubDate>Thu, 18 Apr 2013 21:52:22 +0000</pubDate>
		<dc:creator>Robert Mühsig</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Administration]]></category>
		<category><![CDATA[IIS]]></category>

		<guid isPermaLink="false">http://code-inside.de/blog/?p=5138</guid>
		<description><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1822-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div>IIS Administration ist nicht einfach – zwar gibt es Powershell Scripts, aber intuitiv geht anders. Über einen Tweet von Scott Hanselman bin ich auf das Projekt von Jonas Hovgaard gestossen: Servant. Achtung: Das Tool befindet sich noch in der Anfangsphase – alles auf eigene Gefahr, aber he… es sieht schick aus, also Installation Nach dem ...]]></description>
			<content:encoded><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1822-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div><p>IIS Administration ist nicht einfach – zwar gibt es Powershell Scripts, aber intuitiv geht anders. Über einen <a href="https://twitter.com/shanselman/status/324976476040613890">Tweet von Scott Hanselman</a> bin ich auf das Projekt von <a href="https://twitter.com/jhovgaard">Jonas Hovgaard</a> gestossen: <a href="http://servant.io/"><strong>Servant</strong></a><strong>.</strong></p>
<p><strong>Achtung: Das Tool befindet sich noch in der Anfangsphase – alles auf eigene Gefahr, aber he… es sieht schick aus, also <img src='http://code-inside.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </strong></p>
<h3>Installation</h3>
<p>Nach dem Download es Zips gibt es zwei Wege Servant zu nutzen:</p>
<p>Direkt ausführen über die Servant.Service.exe oder die Batch Datei aufrufen (die auch wieder nur die .exe mit einem Parameter aufruft) – über die Batch Datei wird ein Dienst “Servant for IIS” erstellt.</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1823.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb976.png" width="248" height="393"></a> </p>
<h3>Nach dem Starten: &lt;3</h3>
<p>Nachdem man ein Admin-Kennwort festgelegt hat (aktuell ist dies die einzige Möglichkeit) sieht man direkt seine IIS Konfiguration:</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1824.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb977.png" width="652" height="335"></a> </p>
<p>Schaut gut aus…</p>
<h3></h3>
<h3>Hintergrund Infos</h3>
<p>Wer Servant direkt installiert, installiert im Hintergrund einen Dienst – die Management Seite selbst ist nicht im IIS gehostet. </p>
<p>Servant benutzt zudem <a href="http://nancyfx.org/">NancyFX</a> und <a href="http://www.servicestack.net/">ServiceStack</a> (und bestimmt weitere nette Sachen <img src='http://code-inside.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  )</p>
<p>Wer mehr Wissen will der kann sich via <a href="https://twitter.com/servantforiis">Twitter</a> oder <a href="https://www.facebook.com/servantforiis">Facebook</a> connecten (oder <a href="http://servant.io/">direkt auf der Website</a>).</p>
<h3>Ausblick</h3>
<p>Jonas hat auf <a href="https://jabbr.net/#/rooms/servant">Jabbr einen Servant Raum</a> erstellt und ein paar Ausblicke gegeben. Denkbar ist dass Servant eine REST API für das Management von IIS-Servern zur Verfügung stellt und auch Git-Deployment ermöglichen soll (ähnlich wie Microsoft es mit <a href="https://github.com/projectkudu/kudu">Projekt Kudu</a> für Azure gemacht hat).</p>
<img src="http://feeds.feedburner.com/~r/Code-insideBlog/~4/mpEPrLJ9XlM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://code-inside.de/blog/2013/04/18/iis-meets-your-browser-administration-im-web-mit-servant/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://code-inside.de/blog/2013/04/18/iis-meets-your-browser-administration-im-web-mit-servant/</feedburner:origLink></item>
		<item>
		<title>Howto: Sharepoint Api (CSOM) per Javascript nutzen</title>
		<link>http://feedproxy.google.com/~r/Code-insideBlog/~3/Oh4NLkvfW8c/</link>
		<comments>http://code-inside.de/blog/2013/04/17/howto-sharepoint-api-csom-per-javascript-nutzen/#comments</comments>
		<pubDate>Wed, 17 Apr 2013 15:49:00 +0000</pubDate>
		<dc:creator>Oliver Guhr</dc:creator>
				<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://code-inside.de/blog/2013/04/17/howto-sharepoint-api-csom-per-javascript-nutzen/</guid>
		<description><![CDATA[Sharepoint Webparts können seit Sharepoint 2010 „selbständige“ Webseiten sein, die völlig getrennt vom Sharepoint laufen. Das gibt uns die Möglichkeit, endlich Sharepoint Webparts mit MVC zu erstellen. Um auf die Features vom Sharepoint zugreifen zu können, gibt es mit Sharepoint 2013 das umfangreiche Client Side Object Model kurz CSOM. Diese Features werden zurzeit von CSOM ...]]></description>
			<content:encoded><![CDATA[<p>Sharepoint Webparts können seit Sharepoint 2010 „selbständige“ Webseiten sein, die völlig getrennt vom Sharepoint laufen. Das gibt uns die Möglichkeit, endlich Sharepoint Webparts mit MVC zu erstellen. Um auf die Features vom Sharepoint zugreifen zu können, gibt es mit Sharepoint 2013 das umfangreiche Client Side Object Model kurz CSOM.
<p>Diese Features werden zurzeit von CSOM unterstützt:</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1820.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb973.png" width="590" height="287"></a></p>
<p>Um mit dem Sharepoint zu kommunizieren stehen dem Entwickler REST/OData, Javascript Bibliothek und C# Schnittstellen bereit.
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1821.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb974.png" width="590" height="248"></a>
<p>Als Javascript Entwickler hat man also 2 Möglichkeiten um Daten mit dem Sharepoint auszutauschen, entweder man nutzt die Javascript Bibliothek oder man benutzt die REST Schnittstelle per jQuery. Ich persönlich, finde die bereitgestellte Javascript Bibliothek nicht gelungen. Was im .net Code sinnvoll ist, wirkt im JS Code eigenartig unhandlich. Die breitgestellten Bibliotheken wurden mit Hinblick auf größtmögliche Konsistenz entworfen. Die Schnittstellen sollten sich in allen Welten möglichst gleich anfühlen. Dieser Ansatz ist durchaus nachvollziehbar aber zum Glück haben wir die Wahl J<br />
<h3>&nbsp;</h3>
<h3>CSOM JavaScript Library</h3>
<p>&nbsp;</p>
<pre class="brush: js; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">var context = SP.ClientContext.get_current();
site = context.get_web();
context.load(site);
context.executeQueryAsync(
	function(){console.log(site.get_title())},
	function(){console.log(‘error’)},
);
</pre>
<p>Die Idee hinter dieser Schnittstelle ist, dass man mit „context.get_web();“ sagt welchen Daten man laden möchte. Mit „context.load(site)“ fügt man es dem Request hinzu und „context.executeQueryAsync“ führt den Request dann schließlich aus. Wenn man sich die Objekte im Debugger seines lieblings Browsers anschaut, bekommt man oft einen Berg unleserlicher Variablennamen angezeigt – super für Menschen die ihren Spaß an Rätseln haben, für alle anderen unter Umständen eher anstrengend. Es gibt auch eine nicht minifizierte Variante der Bibliothek die diesen Nachteil beheben könnte, irgendwo im Netz, so sagte man. </p>
<h3>&nbsp;</h3>
<h3>CSOM REST Api mit JQuery</h3>
<p>&nbsp;</p>
<pre class="brush: js; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">var requestUri = _spPageContextInfo.webAbsoluteUrl + "/_api/web/?$select=Title";
$.ajax({
	url:requestUri,
	beforeSend: function (request)
            {
                request.setRequestHeader("Accept", "application/json; odata=verbose");
            },
	success:function(data){console.log(data.d.Title)}
});
</pre>
<p>Das Schöne an dieser Variante ist, dass man die Urls zum Debuggen auch einfach mit dem Browser aufrufen kann und dann das Ganze als lesbares XML angezeigt bekommt. Wichtig bei dieser Variante ist, dass man den accept Header auf &#8220;application/json; odata=verbose&#8221; setzt. Ich hatte es zuerst mit jQuery’s getJSON versucht und mich über die „406 request is not acceptable“ Fehlermeldung gewundert. Das liegt daran, dass jQuery den accept Header &#8220;application/json“ setzt und sich der Sharepoint nicht so richtig wohl fühlt, wenn man ihm das „odata=verbose“ vorenthält. </p>
<p>Das Ergebnis ist in beiden Fällen das Gleiche. Für was man sich letztendlich entscheidet ist also Geschmacksache.</p>
<img src="http://feeds.feedburner.com/~r/Code-insideBlog/~4/Oh4NLkvfW8c" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://code-inside.de/blog/2013/04/17/howto-sharepoint-api-csom-per-javascript-nutzen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://code-inside.de/blog/2013/04/17/howto-sharepoint-api-csom-per-javascript-nutzen/</feedburner:origLink></item>
		<item>
		<title>Windows Phone, Images &amp; OutOfMemoryException</title>
		<link>http://feedproxy.google.com/~r/Code-insideBlog/~3/neaGyC6UMc8/</link>
		<comments>http://code-inside.de/blog/2013/04/12/windows-phone-images-outofmemoryexception/#comments</comments>
		<pubDate>Fri, 12 Apr 2013 21:48:39 +0000</pubDate>
		<dc:creator>Robert Mühsig</dc:creator>
				<category><![CDATA[HowTo]]></category>
		<category><![CDATA[App]]></category>
		<category><![CDATA[Windows Phone]]></category>

		<guid isPermaLink="false">http://code-inside.de/blog/2013/04/12/windows-phone-images-outofmemoryexception/</guid>
		<description><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1816-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div>Wer normalerweise Software entwickelt die auf großen Servern oder auf richtigen PC-Clients läuft der schnell Gefahr bei der Entwicklung für mobile Endgeräte recht schnell eine “OutOfMemoryException” zu sehen. Jedenfalls ging es mir so Szenario: Viele Bilder laden = ಠ_ಠ Wer in Windows Phone viele Bilder (mit hoher Auflösung) als Bitmap in den Speicher laden oder ...]]></description>
			<content:encoded><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1816-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div><p>Wer normalerweise Software entwickelt die auf großen Servern oder auf richtigen PC-Clients läuft der schnell Gefahr bei der Entwicklung für mobile Endgeräte recht schnell eine “OutOfMemoryException” zu sehen. Jedenfalls ging es mir so <img src='http://code-inside.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h3>Szenario: Viele Bilder laden = ಠ_ಠ</h3>
<p>Wer in Windows Phone viele Bilder (mit hoher Auflösung) als Bitmap in den Speicher laden oder anzeigen möchte, sollte sich im klaren sein, dass das schief gehen kann.</p>
<p><strong>Was sind denn “viele”?</strong></p>
<p>Ich hatte bereits das Problem das ich ab 8-10 Bilder ein Problem hatte – hierbei hab ich einfach auf Bilder auf dem Phone zugegriffen <strong>(ohne die Bilder zu skalieren!)</strong> und die Kamera des Nokias schiesst recht hochauflösende Bilder.</p>
<p><strong>Ergebnis:</strong></p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1816.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb969.png" width="581" height="404"></a> </p>
<p><strong>Das Memory-Limit bei Windows Phone Apps</strong></p>
<p>Ab 150MB sollte man vorsichtig sein. Mehr dazu in der <a href="http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj681682(v=vs.105).aspx">MSDN</a></p>
<p><strong>URIs anstatt Bitmaps</strong></p>
<p>Wer eine Foto-Anwendung baut sollte im ViewModel bzw. in der Applikationslogik eher mit URIs (= Pfad zum eigentlichen Bild) arbeiten anstatt direkt mit großen Bitmaps. Um das Bild in der UI anzuzeigen habe ich mir einen Converter geschrieben:</p>
<p>Im XAML:</p>
<pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">&lt;Image Width="108" Height="108" Stretch="UniformToFill" Source="{Binding PhotoSource, Converter={StaticResource UriPathToThumbnailConverter}}" /&gt;</pre>
<p>Converter:</p>
<pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">public class UriPathToThumbnailConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if(ViewModelBase.IsInDesignModeStatic)
            {
                return value;
            }

            IsolatedStorageFile ISF = IsolatedStorageFile.GetUserStoreForApplication();

            Uri path = value as Uri;

            using (var sourceFile = ISF.OpenFile(path.LocalPath, FileMode.Open, FileAccess.Read))
            {
                BitmapImage bm = new BitmapImage();
                bm.DecodePixelWidth = 220;
                bm.SetSource(sourceFile);
                return bm;
            }
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }</pre>
<p>Wichtig ist auch hier “<a href="http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.bitmapimage.decodepixelwidth.aspx">DecodePixelWidth</a>” bzw. “DecodePixelHeight” zu setzen – damit kann wird das Bild auf eine bestimmte größe festgelegt und ich hatte die Memory Probleme in den Griff bekommen.</p>
<h3><strong>Profiler für Windows Phone Apps</strong> </h3>
<p>Im <a href="http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj215908(v=vs.105).aspx">Visual Studio selbst ist auch ein Profiler</a> für Windows Phone Apps enthalten:</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1817.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb970.png" width="558" height="478"></a> </p>
<p>Danach öffnet sich noch ein weiteres Menü:</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1818.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb971.png" width="422" height="296"></a> </p>
<p>Danach startet die Anwendung und bis man die “Session” beendet werden Daten aufgenommen.</p>
<p><strong>Ergebnis des Profilers:</strong></p>
<p>Ein Graph!</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1819.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb972.png" width="545" height="153"></a> </p>
<p>Damit sollte man den Speicherverbrauch im Auge behalten können und optimieren.</p>
<p><strong>Weitere Tipps für Bilder &amp; Windows Phone</strong></p>
<p><a href="http://blogs.msdn.com/b/swick/archive/2011/04/07/image-tips-for-windows-phone-7.aspx">Dieser Blogpost</a> enthält noch einige weitere Hinweise – auch wenn er mit Windows Phone 7 betitelt ist, scheint es nach wie vor zuzutreffen. Weitere Tipps findet man auch <a href="http://msdn.microsoft.com/en-us/library/windowsphone/develop/ff967560(v=vs.105).aspx">in der MSDN</a>.</p>
<p><strong>Fazit:</strong></p>
<p>App-Entwickler sollten ein wesentlich strengeren Blick auf die Performance- und Memory-Werte der Anwendung schauen da man sehr leicht das System ausreizen kann. Mit den Hinweisen konnte ich jedenfalls meine Memory Probleme lösen <img src='http://code-inside.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<img src="http://feeds.feedburner.com/~r/Code-insideBlog/~4/neaGyC6UMc8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://code-inside.de/blog/2013/04/12/windows-phone-images-outofmemoryexception/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://code-inside.de/blog/2013/04/12/windows-phone-images-outofmemoryexception/</feedburner:origLink></item>
		<item>
		<title>Azure Access Control Service, Microsoft Account Login, JSON Web Token und ASP.NET – “ohne WIF-Magic”</title>
		<link>http://feedproxy.google.com/~r/Code-insideBlog/~3/ohdL_lYlckE/</link>
		<comments>http://code-inside.de/blog/2013/04/09/azure-access-control-service-microsoft-account-login-json-web-token-und-asp-net-ohne-wif-magic/#comments</comments>
		<pubDate>Tue, 09 Apr 2013 00:24:15 +0000</pubDate>
		<dc:creator>Robert Mühsig</dc:creator>
				<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Access Control Service]]></category>
		<category><![CDATA[Azure AD]]></category>
		<category><![CDATA[Login]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[WAAD]]></category>

		<guid isPermaLink="false">http://code-inside.de/blog/?p=5113</guid>
		<description><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1811-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div>Buzzwords?! Nein – am Ende passt es doch alles zusammen und ist sogar ziemlich cool. Ich hatte bereits das kostenlose Buch über Claim-based Authentifizierung empfohlen – heute geht es um folgendes Szenario: Wie kann ich meine ASP.NET Seite auf “einfachste” und ohne grosse Zauberei mit dem Access Control Service verbinden?&#160; Achtung: Microsoft selbst empfiehlt eher ...]]></description>
			<content:encoded><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1811-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div><p>Buzzwords?! Nein – am Ende passt es doch alles zusammen und ist sogar ziemlich cool. Ich hatte bereits das kostenlose Buch über <a href="http://code-inside.de/blog/2013/03/19/guide-zu-claims-based-identity-mit-dem-access-control-service/">Claim-based Authentifizierung</a> empfohlen – heute geht es um folgendes Szenario:</p>
<p><em>Wie kann ich meine ASP.NET Seite auf “einfachste” und ohne grosse Zauberei mit dem Access Control Service verbinden?</em>&nbsp; </p>
<p><strong>Achtung:</strong> Microsoft selbst empfiehlt eher ein grösseres Tooling <a href="http://www.asp.net/vnext/overview/latest/windows-azure-authentication">(im Falle von ASP.NET ist das auch echt schick!),</a> was am Ende die web.config unglaublich aufbläht – zudem hatte ich Schwierigkeiten weil die Handler da “zu viel automatisch” machen. <br />Die Idee hab ich <a href="http://geekswithblogs.net/EltonStoneman/archive/2012/09/19/wif-less-claim-extraction-from-acs-jwt.aspx">von diesem Post</a> – und funktioniert bislang <img src='http://code-inside.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Zudem lernt man einiges über die Protokolle dahinter.</p>
<p><strong>Kurzfassung: Was ist der Access Control Service (ACS)</strong></p>
<p>Dieser Azure Service darf man sich wie einen zentralen Verteiler für Authentifizierung vorstellen – man kann verschiedene Authentifizierungsanbieter einklicken und ACS übernimmt dabei die Transformation der Tokens in das was wir benötigen. Eure Anwendung soll ADFS (für Business Kunden), Microsoft Account und Facebook unterstützen? Puh… Der Access Control Service kann hierfür interessant sein!&nbsp; </p>
<p>Mehr Informationen gibt es <a href="http://www.windowsazure.com/en-us/develop/net/how-to-guides/access-control/">hier</a>.</p>
<p>&nbsp;<a href="http://code-inside.de/blog/wp-content/uploads/image1806.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb959.png" width="358" height="358"></a> </p>
<p><strong>Was ist ein Microsoft Account?</strong></p>
<p>Der Microsoft Account war früher bekannt unter dem Namen Windows Live ID. Diese Bezeichnung sieht man immer wieder, aber eigentlich find ich Microsoft Account vom Naming her besser, daher bleiben wir dabei.</p>
<p><strong>Was ist ein JSON Web Token (JWT)?</strong></p>
<p>Über dieses Format werden am Ende die Claims ausgetauscht. Mehr dazu <a href="http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html">hier</a>.</p>
<h3>Vorbereitung: ACS Namespace</h3>
<p>Für das Sample benötigen wir ein ACS Namespace, der im Management-Portal eingerichtet werden kann:</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1807.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb960.png" width="556" height="412"></a> </p>
<p>Dort legen wir eine “Relying party application” an – dies repräsentiert unsere Claim-based Anwendung:</p>
<p>(aktuell ist die ACS-Verwaltung immer noch im alten look)</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1808.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb961.png" width="571" height="624"></a> </p>
<p>Wichtigster Punkte:</p>
<p>- der Realm</p>
<p>- die Return URL</p>
<p>- das Token Format auf JWT umstellen</p>
<p>- Bei Identity Provider “Windows Live ID” auswählen </p>
<p>- Eine Rule Group anlegen (bei mir ist die schon angelegt)</p>
<p>In der Rule Group sicher stellen, dass auch die Claims weitergegeben werden:</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1809.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb962.png" width="624" height="364"></a> </p>
<h3>Welche Daten bekomme ich durch die Windows Live ID/Microsoft Account?</h3>
<p>Fast keine – bis auf einen kryptischen Key im “nameidentifier”-Claim. D.h. man kommt aktuell an absolut 0 Profil Informationen und man muss den Nutzer diese Geschichte manuell nochmal eintragen lassen. Der Key ist auch pro ACS Namespace eindeutig – die Realms spielen (anders als es vielleicht in der MSDN steht) keine Rolle für den “nameidentifier” </p>
<h3></h3>
<h3>Schauen wir uns das Sample an:</h3>
<p>Standard-MVC App – kein Azure Auth Toolkit etc. in Verwendung! Nur der Link hinter “Log in” verweisst auf einen Controller den ich gleich zeige.</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1810.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb963.png" width="574" height="355"></a> </p>
<p>Bei “Log in” werde ich sofort auf die Microsoft Login Seite umgeleitet.</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1811.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb964.png" width="571" height="374"></a> </p>
<p><em>Kleiner Hinweis: Die Parameter in der URL wie “wa” oder “wtrealm” stammen aus </em><a href="http://docs.oasis-open.org/wsfed/federation/v1.2/os/ws-federation-1.2-spec-os.html"><em>dem WS-Federation Spec</em></a><em>.</em></p>
<p>Oben in der Adresse sieht man auch unseren Access Control Service wieder (bzw. den ich angelegt hab). Danach wird man direkt auf die Startseite umgeleitet und ist unter einem sehr seltsamen Namen “angemeldet”</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1812.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb965.png" width="556" height="358"></a> </p>
<h3><strong></strong></h3>
<h2>Was passiert im Hintergrund?</h2>
<p>&nbsp;</p>
<p>Hier der komplette Code meines Authentifzierungs-Controllers:</p>
<pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">/// &lt;summary&gt;
    /// Everything based on WS-Federation: http://docs.oasis-open.org/wsfed/federation/v1.2/os/ws-federation-1.2-spec-os.html
    /// &lt;/summary&gt;
    public class AuthController : Controller
    {
        public ActionResult Index()
        {
            // Microsoft Account Login

            // 2 Option - use hosted Loginpage from ACS or host your own...

            // based on Azure ACS Portal - Login Page Integration - Option 1:
            // Problem: wfresh=0 not supported - logout is :/
            return new RedirectResult("https://codeinside.accesscontrol.windows.net:443/v2/wsfederation?wa=wsignin1.0&amp;wtrealm=urn:sample:wifless");

            // Option 2: Use the link from the JSON - but needed more coding.
            // But wfresh=0 is supported!
            //return new RedirectResult("https://login.live.com/login.srf?wa=wsignin1.0&amp;wtrealm=https%3a%2f%2faccesscontrol.windows.net%2f&amp;wreply=https%3a%2f%2fcodeinside.accesscontrol.windows.net%2fv2%2fwsfederation&amp;wp=MBI_FED_SSL&amp;wctx=cHI9d3NmZWRlcmF0aW9uJnJtPXVybiUzYXNhbXBsZSUzYXdpZmxlc3Mmcnk9aHR0cCUzYSUyZiUyZmxvY2FsaG9zdCUzYTg4MTclMmZBdXRoJTJmQ2FsbGJhY2s1&amp;wfresh=0");
        }

        [ValidateInput(false)]
        public ActionResult Callback(string wresult, string wa)
        {
            if (wa == "wsignin1.0")
            {
                var wrappedToken = XDocument.Parse(wresult);
                var binaryToken = wrappedToken.Root.Descendants("{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}BinarySecurityToken").First();
                var tokenBytes = Convert.FromBase64String(binaryToken.Value);
                var token = Encoding.UTF8.GetString(tokenBytes);

                var result = AcsAuthorizationTokenValidator.RetrieveClaims(token,
                                                                          "https://codeinside.accesscontrol.windows.net/",
                                                                          new List&lt;string&gt;() { "urn:sample:wifless" });

                var name = result.Claims.Single(x =&gt; x.Type == ClaimTypes.NameIdentifier);

                FormsAuthentication.SetAuthCookie(name.Value, false);
            }
            else if (wa == "wsignoutcleanup1.0")
            {
                FormsAuthentication.SignOut();
            }
            return RedirectToAction("Index", "Home");
        }

        public ActionResult Logout()
        {
            FormsAuthentication.SignOut();

            return RedirectToAction("Index", "Home");
        }

    }</pre>
<p>Über Auth/Index werd ich direkt zum ACS Login bzw. direkt weiter zum Microsoft Login umgeleitet. Die Links zu dieser Seite findet man in seinem ACS-Namespace unter “Application integration” – in meinem Fall nehm ich die Option 1.</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1813.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb966.png" width="565" height="348"></a> </p>
<p>Wenn ich mehrere Identity Provider (z.B. Facebook oder Google) ebenfalls auf das Sample zuschalten (was wirklich so einfach geht wie es klingt), dann würde eine etwas spartanische Login-Seite mit einer Auswahl den User begrüssen. </p>
<p>Der Nachteil der Variante 1:</p>
<p>- Sehr spartanisches UI bei mehreren Identity Providern</p>
<p>- Den Login erzwingen ist gar nicht so einfach. Wenn man irgendwie mit irgendeinem Microsoft Account eingeloggt ist, sieht der Nutzer noch nichtmal den Account. Da man selbst auch keinen Zugriff auf den Microsoft Account Namen hat ist es schwer dem User zu vermitteln mit welchem Account er überhaupt gerade arbeitet.</p>
<p>- Logout ist auch schwieriger – aber ich zeig gleich eine Variante wie es gehen könnte (die ich jetzt nicht umgesetzt hab)</p>
<p>Das Gute an der Variante: Es ist ein sehr simpler Link mit einem Callback…</p>
<p><strong>Noch zur Variante 2:</strong></p>
<p>Dort wird ein Link zu einem JSON angeboten was man recht einfach auswerten kann – mit allen Identity Providern und den richtigen Login-URLs sowie der Logout URL.</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1814.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb967.png" width="557" height="154"></a> </p>
<p>Bei dieser LoginUrl (die direkt auf login.live etc. zeigt) wird auch der Parameter “wfresh=0” unterstützt – d.h. der Nutzer muss sich explizit vorher anmelden – was schon wesentlich besser ist.</p>
<p><strong>Zum Callback:</strong></p>
<p>Nachdem die Authentifizierung durch ist schickt der Access Control Service die Antwort zum eingetragenen Callback URL – darin enthalten ist ein XML:</p>
<pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">&lt;t:RequestSecurityTokenResponse xmlns:t="http://schemas.xmlsoap.org/ws/2005/02/trust"&gt;
	&lt;t:Lifetime&gt;
		&lt;wsu:Created xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"&gt;2013-04-08T23:49:21.754Z&lt;/wsu:Created&gt;
		&lt;wsu:Expires xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"&gt;2013-04-08T23:59:21.754Z&lt;/wsu:Expires&gt;
	&lt;/t:Lifetime&gt;
	&lt;wsp:AppliesTo xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"&gt;
		&lt;EndpointReference xmlns="http://www.w3.org/2005/08/addressing"&gt;
			&lt;Address&gt;urn:sample:wifless&lt;/Address&gt;
		&lt;/EndpointReference&gt;
	&lt;/wsp:AppliesTo&gt;
	&lt;t:RequestedSecurityToken&gt;
		&lt;wsse:BinarySecurityToken wsu:Id="_d3b3e3f6-4bd2-424c-89e9-ebbe662c1305-E64ACB699C73604D58CEA265FE69ECA9" ValueType="urn:ietf:params:oauth:token-type:jwt" EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"&gt;ZXlKMGVYQWlPaUpLVjFRaUxDSmhiR2NpT2lKU1V6STFOaUlzSW5nMWRDSTZJamRUZDFaRmMyNHpVbW93YW5WblNWUjBWRlp4WjJwQ1VVWlJVU0o5LmV5SmhkV1FpT2lKMWNtNDZjMkZ0Y0d4bE9uZHBabXhsYzNNaUxDSnBjM01pT2lKb2RIUndjem92TDJOdlpHVnBibk5wWkdVdVlXTmpaWE56WTI5dWRISnZiQzUzYVc1a2IzZHpMbTVsZEM4aUxDSnVZbVlpT2pFek5qVTBOalE1TmpFc0ltVjRjQ0k2TVRNMk5UUTJOVFUyTVN3aWJtRnRaV2xrSWpvaVMwMVpOR3A1ZUdGSFRWWllZbkl3V2xsRE9DOXJlUzlFTjJabWNXRTBZM1Z0U3pKQ1dFNWxWRUZIV1QwaUxDSnBaR1Z1ZEdsMGVYQnliM1pwWkdWeUlqb2lkWEpwT2xkcGJtUnZkM05NYVhabFNVUWlmUS5VeDFsa0hDaDdBYl85d2lQN1BnR20zNjR4T2tsOHBHUEhNSEF2ZVJSMEVGRTR2VHRybV9wbmF3ajR0STVQZlVFOXB1d1JYNDQzOWRhSkQ4MzM4SG5yOVI1VktmZ3JIYnRuTlM2UVJoeGNIUDREZjBINVFQcFZ2Tm9VU1lJa2ZLWTVFUXE5ei1JVEpiNVZhWEZscF81OENUaDJtMkVYYkIwR3pRLV9BQlF3MWIxZEd1dHV5VHVfdEhWWUdPek9iTDdac0l1dHJXQTdjOEtJYUpoT21NVzNxNEp4RVBLNllnTURERWxkcmR6OFRTVTFZVE8xY3ZqMGZZVHh3d0t3MVlFQmlEamJSLUVxN1FKQzZDZWRsZjJmaDRDbkNBQlFTZzlhbmRVSDZSeTBqU3ctX2tZaHBZOTdkdkpRRDh4eDY2eVMxQmZBNXViQlVMbXF6eWh3U2NYaXc=&lt;/wsse:BinarySecurityToken&gt;
	&lt;/t:RequestedSecurityToken&gt;
	&lt;t:TokenType&gt;urn:ietf:params:oauth:token-type:jwt&lt;/t:TokenType&gt;
	&lt;t:RequestType&gt;http://schemas.xmlsoap.org/ws/2005/02/trust/Issue&lt;/t:RequestType&gt;
	&lt;t:KeyType&gt;http://schemas.xmlsoap.org/ws/2005/05/identity/NoProofKey&lt;/t:KeyType&gt;
&lt;/t:RequestSecurityTokenResponse&gt;</pre>
<p>Interessant hier ist der “BinarySecurityToken”, wenn wir diesen base64 kodierten String umwandeln bekommen wird dies:</p>
<pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6IjdTd1ZFc24zUmowanVnSVR0VFZxZ2pCUUZRUSJ9.eyJhdWQiOiJ1cm46c2FtcGxlOndpZmxlc3MiLCJpc3MiOiJodHRwczovL2NvZGVpbnNpZGUuYWNjZXNzY29udHJvbC53aW5kb3dzLm5ldC8iLCJuYmYiOjEzNjU0NjQ5NjEsImV4cCI6MTM2NTQ2NTU2MSwibmFtZWlkIjoiS01ZNGp5eGFHTVZYYnIwWllDOC9reS9EN2ZmcWE0Y3VtSzJCWE5lVEFHWT0iLCJpZGVudGl0eXByb3ZpZGVyIjoidXJpOldpbmRvd3NMaXZlSUQifQ.Ux1lkHCh7Ab_9wiP7PgGm364xOkl8pGPHMHAveRR0EFE4vTtrm_pnawj4tI5PfUE9puwRX4439daJD8338Hnr9R5VKfgrHbtnNS6QRhxcHP4Df0H5QPpVvNoUSYIkfKY5EQq9z-ITJb5VaXFlp_58CTh2m2EXbB0GzQ-_ABQw1b1dGutuyTu_tHVYGOzObL7ZsIutrWA7c8KIaJhOmMW3q4JxEPK6YgMDDEldrdz8TSU1YTO1cvj0fYTxwwKw1YEBiDjbR-Eq7QJC6Cedlf2fh4CnCABQSg9andUH6Ry0jSw-_kYhpY97dvJQD8xx66yS1BfA5ubBULmqzyhwScXiw</pre>
<p>Nun kommt ein NuGet Package ins Spiel – <a href="https://nuget.org/packages/Microsoft.IdentityModel.Tokens.JWT">der JWTSecurityTokenHandler</a> über dies und etwas Code (basierend auf diesem <a href=" http://code.msdn.microsoft.com/AAL-Native-Application-to-fd648dcf/sourcecode?fileId=62849&amp;pathId=697488104">Microsoft Sample</a>) bekommen wir am Ende die Claims als ClaimsPrincipal:</p>
<pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">/// &lt;summary&gt;
    /// Based on this sample: http://code.msdn.microsoft.com/AAL-Native-Application-to-fd648dcf/sourcecode?fileId=62849&amp;pathId=697488104
    /// &lt;/summary&gt;
    public class AcsAuthorizationTokenValidator
    {
        /// &lt;summary&gt;
        ///
        /// &lt;/summary&gt;
        /// &lt;param name="token"&gt;= Token&lt;/param&gt;
        /// &lt;param name="allowedAudience"&gt;= Azure ACS Namespace&lt;/param&gt;
        /// &lt;param name="issuers"&gt;= RPs in ACS&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        public static ClaimsPrincipal RetrieveClaims(string token, string issuer, List&lt;string&gt; allowedAudiences)
        {
            JWTSecurityTokenHandler tokenHandler = new JWTSecurityTokenHandler();

            // Set the expected properties of the JWT token in the TokenValidationParameters
            TokenValidationParameters validationParameters = new TokenValidationParameters()
                                                                 {
                                                                     AllowedAudiences = allowedAudiences,
                                                                     ValidIssuer = issuer,
                                                                     SigningToken = new X509SecurityToken(new X509Certificate2(GetSigningCertificate(issuer + "FederationMetadata/2007-06/FederationMetadata.xml")))
                                                                 };

            return tokenHandler.ValidateToken(token, validationParameters);
        }

        private static byte[] GetSigningCertificate(string metadataAddress)
        {
            if (metadataAddress == null)
            {
                throw new ArgumentNullException(metadataAddress);
            }

            using (XmlReader metadataReader = XmlReader.Create(metadataAddress))
            {
                MetadataSerializer serializer = new MetadataSerializer()
                                                    {
                                                        CertificateValidationMode = X509CertificateValidationMode.None
                                                    };

                EntityDescriptor metadata = serializer.ReadMetadata(metadataReader) as EntityDescriptor;

                if (metadata != null)
                {
                    SecurityTokenServiceDescriptor stsd = metadata.RoleDescriptors.OfType&lt;SecurityTokenServiceDescriptor&gt;().First();

                    if (stsd != null)
                    {
                        X509RawDataKeyIdentifierClause clause = stsd.Keys.First().KeyInfo.OfType&lt;X509RawDataKeyIdentifierClause&gt;().First();

                        if (clause != null)
                        {
                            return clause.GetX509RawData();
                        }
                        throw new Exception("The SecurityTokenServiceDescriptor in the metadata does not contain the Signing Certificate in the &lt;X509Certificate&gt; element");
                    }
                    throw new Exception("The Federation Metadata document does not contain a SecurityTokenServiceDescriptor");
                }
                throw new Exception("Invalid Federation Metadata document");
            }
        }
    }</pre>
<p><strong>Ergebnis:</strong></p>
<p>Claims…von Microsoft! Leider keine “menschlich-lesbaren” – aber immerhin gibt es dabei kein Datenschutz Risiko <img src='http://code-inside.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1815.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb968.png" width="576" height="200"></a> </p>
<h3></h3>
<h3>ACS to the rescue!</h3>
<p>Der Access Control Service ist ein recht interessanter Dienst und steht auch in keiner Konkurrenz zum Azure AD – man kann auch <a href="http://www.cloudidentity.com/blog/2012/11/07/PROVISIONING-A-DIRECTORY-TENANT-AS-AN-IDENTITY-PROVIDER-IN-AN-ACS-NAMESPACE/">Azure AD und Facebook in seiner Anwendung über den ACS</a> nutzen. Stellt es euch als Plugin-fähigen Identitiy Provider vor.</p>
<p>Ich versuch demnächst noch zum neuen “Azure AD” zu schreiben – bis dahin können interssierte ein Blick hier reinwerfen wenn man <a href="http://azurecoder.azurewebsites.net/using-windows-azure-active-directory-waad-part-1-setup/">ACS und Azure Active Directory zusammen</a> nutzen möchte.</p>
<p>&nbsp;</p>
<p><a href="https://github.com/Code-Inside/Samples/tree/master/2013/AcsJustMicrosoftAccMvc"><strong>Download Sample @ GitHub</strong></a></p>
<img src="http://feeds.feedburner.com/~r/Code-insideBlog/~4/ohdL_lYlckE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://code-inside.de/blog/2013/04/09/azure-access-control-service-microsoft-account-login-json-web-token-und-asp-net-ohne-wif-magic/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://code-inside.de/blog/2013/04/09/azure-access-control-service-microsoft-account-login-json-web-token-und-asp-net-ohne-wif-magic/</feedburner:origLink></item>
		<item>
		<title>Subdomain vs. Subdirectory</title>
		<link>http://feedproxy.google.com/~r/Code-insideBlog/~3/k5KeuhxlUXA/</link>
		<comments>http://code-inside.de/blog/2013/04/08/subdomain-vs-subdirectory/#comments</comments>
		<pubDate>Sun, 07 Apr 2013 23:55:56 +0000</pubDate>
		<dc:creator>Robert Mühsig</dc:creator>
				<category><![CDATA[WebDev]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[URL]]></category>

		<guid isPermaLink="false">http://code-inside.de/blog/2013/04/08/subdomain-vs-subdirectory/</guid>
		<description><![CDATA[Lieber blog.mydomain.com oder mydomain.com/blog? Gute Frage! Am Wochenende kam die Frage über Twitter wieder rein und hier mal meine Erfahrungen: Nehmt eine Subdomain, wenn… - ihr unter einer Domain “verschiedene Dienste” anbieten möchtet, die auch “logische getrennt sind” - ihr leicht Einfluss auf die Subdomains nehmen könnt Bsp: blog.mydomain.com shop.mydomain.com forum.mydomain.com Warum? Wenn ihr diese ...]]></description>
			<content:encoded><![CDATA[<p>Lieber blog.mydomain.com oder mydomain.com/blog? Gute Frage! Am Wochenende kam die Frage über <a href="https://twitter.com/Cayas_Software/status/320208299805011968">Twitter wieder rein</a> und hier mal meine Erfahrungen: </p>
<h3>Nehmt eine Subdomain, wenn…</h3>
<p>- ihr unter einer Domain “verschiedene Dienste” anbieten möchtet, die auch “logische getrennt sind”</p>
<p>- ihr leicht Einfluss auf die Subdomains nehmen könnt </p>
<p>Bsp:</p>
<p>blog.mydomain.com</p>
<p>shop.mydomain.com </p>
<p>forum.mydomain.com</p>
<p><strong>Warum?</strong></p>
<p>Wenn ihr diese Sachen über Subdirectories löst ist es schwieriger diese Dienste auszulagern. Man kann sehr einfach einen CNAME Eintrag machen und so verweisst z.B. blog.mydomain.com auf ein Tumblr Blog und nicht auf meine Maschine. Auch kann man sehr einfach die einzelnen Seiten unter anderen Maschinen laufen lassen (ohne Loadbalancer etc.).</p>
<p>Mit Subdirectories ist diese Sache komplizierter</p>
<h3>Nehmt ein Subdirectory, wenn…</h3>
<p>- ihr keinen Einfluss auf Subdomains habt (z.B. beim Kunden wird der gesamte Applikations-Stack installiert und ihr wollt den Admin nicht unnötig DNS-Settings einpflegen lassen)</p>
<p>- es Applikations-Interna oder die Seiten zu klein sind um eine eigene WebApp” daraus zu machen (Sowas wie ein Impressum vll.)</p>
<h3>Was sagt Google zu dem Thema?</h3>
<p>Ein Google Mitarbeiter hat sich dazu auf YouTube geäussert:</p>
<p><iframe height="315" src="http://www.youtube.com/embed/_MswMYk05tk" frameborder="0" width="560" allowfullscreen></iframe>
<p>&nbsp;</p>
<h3>Und was sagt Stackoverflow?</h3>
<p>Die <a href="http://stackoverflow.com/questions/1965609/subdomain-vs-subdirectory-in-web-programming">Antwort</a> find ich ziemlich gut:</p>
<p><em>Pro&#8217;s for subdomains:</em>
<ul>
<li><em>You can isolate configuration (for for example apache) per-domain. </em>
<li><em>It will be easier to migrate parts of your application to other machines. Sub-directories won&#8217;t really give you this flexibility. </em>
<li><em>Instead of having to use a $baseUri variable in every html template, you can just assume the root of the app is always /.</em></li>
</ul>
<p><em>Cons:</em>
<ul>
<li><em>It will be much more annoying to quickly setup staging or temporary development environments. For every &#8216;app&#8217; you will now need DNS of hosts-file entries and webserver configuration. With subdirectories you could drop the app in a directory, and go! </em>
<li><em>If you do ever have the requirement to deploy your application on a different system where using / is because of some odd policy not possible, some rewriting might be in order.</em></li>
</ul>
<p><em>My advice:</em>
<p><em>Make sure you can always do both, which will give you the best of both worlds. Every part of your app should have a configurable base uri that is always respected. As long as you make sure you can always go both ways, then who cares what you do? it&#8217;s just a url and it can always be changed.</em><br />
<h3>Aber du nutzt selber code-inside.de/blog?</h3>
<p>Ja – der Blog ist schon einige Jahre alt und damals wusste ich es nicht besser. Problematisch bei einer Änderung jetzt wäre das die alten Links trotzdem noch funktionieren müssen und ich nicht genau weiss wie Google darauf reagiert. </p>
<p>Daher vorher Gedanken machen <img src='http://code-inside.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<img src="http://feeds.feedburner.com/~r/Code-insideBlog/~4/k5KeuhxlUXA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://code-inside.de/blog/2013/04/08/subdomain-vs-subdirectory/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://code-inside.de/blog/2013/04/08/subdomain-vs-subdirectory/</feedburner:origLink></item>
		<item>
		<title>Das Ende der Freiheit im Internet?</title>
		<link>http://feedproxy.google.com/~r/Code-insideBlog/~3/aEXw5WB-WmQ/</link>
		<comments>http://code-inside.de/blog/2013/04/04/das-ende-der-freiheit-im-internet/#comments</comments>
		<pubDate>Thu, 04 Apr 2013 17:19:35 +0000</pubDate>
		<dc:creator>antje.kilian</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://code-inside.de/blog/?p=5087</guid>
		<description><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/clip_image0011-150x150.jpg" class="attachment-thumbnail wp-post-image" alt="clip_image001.jpg" title="clip_image001.jpg" style="margin-bottom: 15px;" /></div>&#160; Das Musik- und Filmindustrie keine Fans des schnellen und weitestgehend anonymen Datenaustauschs über das Internet sind, ist inzwischen hinlänglich bekannt. Die einschlägige Presse berichtet unerlässlich von Klagewellen gegen Internetnutzer, die sich des verteufelten Filesharings schuldig gemacht haben. Fest steht, die rechtliche Handhabe zum Thema IP Recht im Internet steckt momentan noch in den Kinderschuhen ...]]></description>
			<content:encoded><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/clip_image0011-150x150.jpg" class="attachment-thumbnail wp-post-image" alt="clip_image001.jpg" title="clip_image001.jpg" style="margin-bottom: 15px;" /></div><p>&nbsp;</p>
<p><strong> </strong></p>
<p>Das Musik- und Filmindustrie keine Fans des schnellen und weitestgehend anonymen Datenaustauschs über das Internet sind, ist inzwischen hinlänglich bekannt. Die einschlägige Presse berichtet unerlässlich von Klagewellen gegen Internetnutzer, die sich des verteufelten Filesharings schuldig gemacht haben. Fest steht, die rechtliche Handhabe zum Thema IP Recht im Internet steckt momentan noch in den Kinderschuhen und die Liste der Grauzonen und Schlupflöcher ist lang.</p>
<p>Eine Idee der belgischen Künstlervereinigung <a href="http://www.sabam.be/">SABAM</a> sollte diese Problematik nun ein für allemal lösen. In einer Reihe von Gerichtsverfahren versuchte das Unternehmen Internet Access Provider und Host Provider dazu zu verpflichten, allgemeine Sperren in ihr System einzufügen, die sämtliche Kommunikation ihrer User auf urheberrechtlich fragwürdige Inhalte filtern sollte. Das endgültige Ende der Anonymität im Internet?</p>
<p>&nbsp;</p>
<p><strong> </strong></p>
<p><strong>SABAM vs. Scarlet</strong></p>
<p><strong> </strong></p>
<p>Alles begann damit, dass mehrere auffällig gewordene IP Adressen zu Kundenanschlüssen des niederländischen Internetanbieters <a href="http://www.scarlet.be/nl/">Scarlet</a> zurückverfolgt werden konnten. SABAM strebte daraufhin ein Gerichtsverfahren an, wonach Scarlet dazu verurteilt werden sollte, ein generelles Filtersystem zu integrieren, welches sämtliche Kommunikation ihrer Kunden auf mögliche Urheberrechtsverletzungen kontrolliert. Wenn das System eine solche Verletzung nachweißt, müsste Scarlet den Namen sowie die Adresse des betroffenen Kunden an den Rechteinhaber weitergeben, damit dieser unverzüglich ein ordentliches Gerichtsverfahren anstreben könnte. Das alles natürlich auf Kosten des Internetanbieters und damit auf Kosten der Kunden, versteht sich.</p>
<p>Das belgische Gericht sah sich mit dieser Anfrage überfordert und konsultierte daher den Europäischen Gerichtshof mit der Bitte um Klärung. Darf ein nationales Gericht einen so weitreichenden Eingriff in die Privatsphäre unzähliger Benutzer bewilligen?</p>
<p>&nbsp;</p>
<p><strong> </strong></p>
<p><strong>Der EuGH</strong></p>
<p>Der EuGH sah hier zwei sehr wichtige Grundrechte kollidieren. Zum Einen das Recht auf Schutz des geistigen Eigentums und zum Anderen die Schutz der Privatsphäre. Der EuGH war der Ansicht, dass es dem Internetanbieter sowie seinen Kunden nicht zuzumuten ist, eine von Zeitraum und Umfang unbeschränkte Überprüfung über sich ergehen zu lassen und wies daher das Anliegen SABAM’s ab.</p>
<p><strong> </strong></p>
<p><strong>Privatsphäre FTW?</strong></p>
<p>Nicht wirklich. Juristen streiten noch über den Wert dieser Entscheidung. Trotz dass die allmächtige Musikindustrie enorm auf die Bretter geschickt wurde, nehmen es die Juristen sehr genau und begründen, dass die Zurückweisung nur für das speziell angefragte Filterungssystem gelten würde. Ein generelles Nein zum Filtern persönlicher Informationen ist das noch nicht.</p>
<p>&nbsp;</p>
<p><strong>Aber so gut wie oder?</strong></p>
<p>Nicht wenn es nach unseren Nachbarn von der anderen Teichseite geht. Datenschutz wird ja bekanntlich nicht gerade großgeschrieben in den USA. Während in UK die Internetanbieter <a href="http://www.bbc.co.uk/news/technology-17853518">gemeinschaftlich auf die Barrikaden gehen</a>, gründen die amerikanischen Access Provider sogar eine Gemeinschaft mit den Vertretern der Musik- und Filmindustrie. Die Internet Service Provider Gruppe ISP, deren Mitglieder insgesamt 60% des amerikanischen Marktanteiles ausmachen, gründeten gemeinsam mit einigen namen haften Künstlervereinigungen das CCI, <a href="http://www.copyrightinformation.org/">Center for Copyright Information</a>. Zusammen wurde ein 4 Jahres Vertrag geschlossen, der vor allem die Einführung eines Copyright Alert Systems zum Inhalt hat. Schlaues Vorgehen der Künstlerverbände? Sie übernehmen die Hälfte der Kosten und der Rest kann ja im Notfall noch 1:1 auf den Kunden umgewälzt werden.</p>
<p>&nbsp;</p>
<p><strong> </strong></p>
<p><strong>Copyright Alert System oder nix gönnen sie einem!</strong></p>
<p><strong> </strong></p>
<p>Das Alert System funktioniert folgender Maßen: Private Unternehmen durchsuchen das Internet nach möglichen Rechtsverletzern. Wird ein solcher aufgespürt, gibt es eine Meldung an den Internetanbieter. Dieser trägt den Verstoß in eine Datenbank ein und sendet dem Kunden gleichzeitig eine Warnung, dass sein Fehlverhalten registriert wurde. Erfolgen einige Warnungen innerhalb eines kurzen Zeitrahmens wird’s ernst. Technische „Bestrafungen“ sind die Folge, wie zum Beispiel die Drosselung der Netzgeschwindigkeit oder wenns ganz hart kommt sogar die Sperrung des Zugangs. Der Kunde bekommt dann die Möglichkeit an einem Besserungsprogramm teilzunehmen, bei dem ihm das unerwünschte Verhalten abtrainiert wird bis er sich wieder als verantwortungsbewusster Internetnutzer bewährt hat.</p>
<p>Zusätzlich werden die Ergebnisse der Inquisition Untersuchung in einem monatlichen Bericht an die Rechteinhaber übersendet, damit diesen der Gang vor Gericht dadurch erleichtert wird, dass sie sich nicht mehr mit dem lästigen Raussuchen von Namen und Adressen rumärgern müssen.</p>
<p>&nbsp;</p>
<p><strong>Aber ich wars doch garnicht!</strong></p>
<p><strong> </strong></p>
<p>Zu Unrecht beschuldigt? Keine Sorge! Es kann natürlich Beschwerde gegen die Verwarnungen eingelegt werden. Gegen einen geringen Unkostenbeitrag von 35$ kann der Kunde eine zweite Überprüfung beantragen, die dann von einem durch die Vertreter der Künstlerverbände gestelltes Anwälteteam durchgeführt wird.</p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong>Fazit: lieber noch schnell ein paar Downloads anschieben</strong></p>
<p>Ein weiterer Schritt in die totale Offenlegung des Internets. Zwar kann man sicherlich argumentieren, dass die Schaffer geistigen Eigentums ein berechtigtes Interesse an der Kohle Wahrung ihrer Rechte haben, aber das ein solches System, einmal eingeführt, sich nicht nur auf Verstöße gegen das Copyright beschränkt dürfte jedem klar sein. Wir haben das Glück, dass Europa sich noch zögerlich bei derartig starken Eingriffen bewegt, aber wie man am Beispiel des britischen Digital Aconomy Acts sieht, kann dieser Trend schneller zu uns überschwappen als uns lieb ist.</p>
<p>Mehr Informationen auf <a href="http://heise.de/-1473159">Heise Online</a> oder im <a href="http://curia.europa.eu/juris/document/document.jsf;jsessionid=9ea7d2dc30db2281319924d34a44b722f155719bd5f7.e34KaxiLc3qMb40Rch0SaxuLa3b0?text=&amp;docid=115202&amp;pageIndex=0&amp;doclang=DE&amp;mode=lst&amp;dir=&amp;occ=first&amp;part=1&amp;cid=879384">Urteilstext des EuGH</a>.</p>
<p>&nbsp;</p>
<p><strong>Anmerkung:</strong></p>
<p>Dieser Blog Post wurde von Antje Kilian verfasst, die ansonsten für die Übersetzung der englischen Artikel auf Code Inside verantwortlich ist. Da sie sich momentan in den letzten Zügen ihres Studiums des Internetrechts befindet, dachten wir es wäre eine gute Idee etwas davon auch für den Blog zu nutzen.</p>
<p>Wenn euch der kurze Ausflug in die Juristerei gefallen hat und ihr gerne auch in Zukunft hin und wieder einige technisch relevante, juristische News lesen möchtet oder wenn euch so was überhaupt nicht interessiert, dann hinterlasst uns gerne euer Feedback in den Kommentaren, via Twitter, Facebook oder wo auch immer <img class="wlEmoticon wlEmoticon-winkingsmile" style="border-style: none" src="http://code-inside.de/blog/wp-content/uploads/wlEmoticon-winkingsmile12.png" alt="Zwinkerndes Smiley" />.</p>
<img src="http://feeds.feedburner.com/~r/Code-insideBlog/~4/aEXw5WB-WmQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://code-inside.de/blog/2013/04/04/das-ende-der-freiheit-im-internet/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://code-inside.de/blog/2013/04/04/das-ende-der-freiheit-im-internet/</feedburner:origLink></item>
		<item>
		<title>Windows Phone 8 Camera API &amp; Camera Capture Task</title>
		<link>http://feedproxy.google.com/~r/Code-insideBlog/~3/-Dzn32mgTOI/</link>
		<comments>http://code-inside.de/blog/2013/04/02/windows-phone-8-camera-api-camera-capture-task/#comments</comments>
		<pubDate>Tue, 02 Apr 2013 20:51:53 +0000</pubDate>
		<dc:creator>Robert Mühsig</dc:creator>
				<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Windows Phone]]></category>
		<category><![CDATA[Camera]]></category>

		<guid isPermaLink="false">http://code-inside.de/blog/?p=5079</guid>
		<description><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1801-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div>Wer ein Windows Phone sein eigen nennt und .NET Entwickler ist da liegt es nah mal das Windows Phone SDK auszuprobieren. Der Zugriff auf Hardware geht bei “nativen” Anwendungen naturgemäß deutlich einfacher als es selbst bei modernsten Webanwendung im Jahre 2013 möglich wäre, daher hab ich mir die Kamera API unter Windows Phone 8 angeschaut. ...]]></description>
			<content:encoded><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1801-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div><p>Wer ein Windows Phone sein eigen nennt und .NET Entwickler ist da liegt es nah mal das Windows Phone SDK auszuprobieren. Der Zugriff auf Hardware geht bei “nativen” Anwendungen naturgemäß deutlich einfacher als es selbst bei modernsten Webanwendung im Jahre 2013 möglich wäre, daher hab ich mir die Kamera API unter Windows Phone 8 angeschaut.</p>
<p>In meinem Beispiel möchte ich einfach nur auf die Kamera zugreifen und ein aktuelles Bild aufnehmen und anzeigen – keine Speicherung, keine Videoaufnahme etc.</p>
<h3>Variante 1: Camera Capture Task</h3>
<p>Die einfachste Möglichkeit ein Bild aufzunehmen ist auf die mitgelieferte Foto-App zu verweisen – dafür gibt es den “<a href="http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh394006(v=vs.105).aspx">Camera Capture Task</a>”. </p>
<p><strong>Vorteil:</strong> </p>
<p>Spezielle Bildeinstellungen (ISO…), Kamerablitz, Zoomeinstellungen etc. kann der Nutzer wie gewohnt nutzen und die eigene App benötigt prinzipell keinen direkten Zugriff auf die Kamera. Generell kann man auch davon ausgehen dass die Foto-App sehr gut getestet ist.</p>
<p><strong>Nachteil:</strong></p>
<p>Aufgenommen Bilder werden auch in der “Camera Roll” gespeichert. Hat der Nutzer nun noch eingestellt dass das Bild automatisch zu Skydrive geladen wird, passiert dies ebenfalls. Die eigene Anwendung bekommt eine Kopie des Bildes. Wenn man also nur temporär das Bild benötigt, die Bilddaten nur innerhalb der Anwendung behalten möchte oder eine eigene (vll. bessere) UI bauen möchte, für den ist diese Variante eher nicht geeignet.</p>
<p><strong>Code:</strong></p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1802.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb956.png" width="568" height="359"></a> </p>
<p>Das Bild selbst zeige ich hinterher im Image Element namens “Result” an. In der Application Bar ist einfach ein Button der zur eigentlichen Camera App weiterleitet.</p>
<p><strong>Der Code ist hierbei denkbar einfach:</strong></p>
<p><a href="http://msdn.microsoft.com/en-us/library/windowsphone/develop/microsoft.phone.tasks.cameracapturetask(v=vs.105).aspx">CameraCaptureTask</a> definieren und auf Button-Click wird “Show” aufgerufen.</p>
<pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">    public partial class MainPage : PhoneApplicationPage
    {
        CameraCaptureTask cameraCaptureTask;

        // Constructor
        public MainPage()
        {
            InitializeComponent();

            cameraCaptureTask = new CameraCaptureTask();
            cameraCaptureTask.Completed += new EventHandler&lt;PhotoResult&gt;(cameraCaptureTask_Completed);
        }

        private void ApplicationBarIconButton_Click(object sender, EventArgs e)
        {
            cameraCaptureTask.Show();
        }

        private void cameraCaptureTask_Completed(object sender, PhotoResult e)
        {
            if(e.TaskResult == TaskResult.OK)
            {
                BitmapImage image = new BitmapImage();
                image.SetSource(e.ChosenPhoto);
                Result.Source = image;
            }
        }

        private void ApplicationBarIconButtonApi_Click(object sender, EventArgs e)
        {
            NavigationService.Navigate(new Uri("/CameraPreview.xaml", UriKind.Relative));
        }
    }</pre>
<p>Bei “<a href="http://msdn.microsoft.com/en-us/library/windowsphone/develop/microsoft.phone.tasks.cameracapturetask.show(v=vs.105).aspx">Show</a>” wird die Camera App gestartet:</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1803.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb957.png" width="155" height="240"></a> </p>
<p>Nachdem man das Foto gemacht hat kommt man in das “Complete”-Event. Wobei man aber hier noch prüfen muss ob wirklich ein Bild gemacht wurde oder nicht.</p>
<p>Fertig.</p>
<h2>Variante 2: Camera API</h2>
<p>Die <a href="http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj662940(v=vs.105).aspx">Camera API</a> ist wesentlich mächtiger – erfordert allerdings auch mehr Aufwand. In meinem Demo zeig ich nur das aktuelle Kamerabild an und kann dann ein Bild knipsen. </p>
<p><strong>Vorteil:</strong></p>
<p>Komplette Kontrolle, die Bilder bleiben in der App (bzw. kann ich es selbst entscheiden) und man kann die wildesten Sachen machen (vermutlich <img src='http://code-inside.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> )</p>
<p><strong>Nachteil:</strong></p>
<p>Man muss alles selber machen – Blitz, Kameraeinstellungen (wenn man die braucht), Preview-Bild darstellen etc. und die Anwendung braucht den Zugriff auf die Kamera:</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1804.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb958.png" width="583" height="266"></a> </p>
<p><strong>Code:</strong></p>
<p>Der Aufbau ist fast identisch – nur das ein Canvas-Element benutze um darin das Kamerabild anzuzeigen:</p>
<pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">        ...&lt;Grid x:Name="ContentPanel" Grid.Row="1"&gt;
            &lt;Canvas x:Name="VideoCanvas"&gt;
                &lt;Canvas.Background&gt;
                    &lt;VideoBrush x:Name="videoBrush"&gt;
                        &lt;VideoBrush.RelativeTransform&gt;
                            &lt;CompositeTransform x:Name="previewTransform"
                            CenterX=".5"
                            CenterY=".5" /&gt;
                        &lt;/VideoBrush.RelativeTransform&gt;
                    &lt;/VideoBrush&gt;
                &lt;/Canvas.Background&gt;
            &lt;/Canvas&gt;
            &lt;Image Visibility="Collapsed" x:Name="Result" /&gt;
        &lt;/Grid&gt;...</pre>
<p>Etwas sonderbar, aber ich hab es nicht anders hin bekommen: Das Bild über die API ist immer im Panorama-Mode – wenn ich es im Portrait-Mode anzeigen möchte muss ich das Bild drehen, daher die Transform. </p>
<pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">    public partial class CameraPreview : PhoneApplicationPage
    {
        private PhotoCamera cam;

        public CameraPreview()
        {
            InitializeComponent();
        }

        protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            VideoCanvas.Visibility = Visibility.Visible;
            Result.Visibility = Visibility.Collapsed;
            if (PhotoCamera.IsCameraTypeSupported(CameraType.Primary))
            {
                cam = new PhotoCamera(CameraType.Primary);
                cam.CaptureImageAvailable += new EventHandler&lt;Microsoft.Devices.ContentReadyEventArgs&gt;(cam_CaptureCompleted);
                videoBrush.SetSource(cam);
                previewTransform.Rotation = cam.Orientation;
            }
        }

        private void cam_CaptureCompleted(object sender, ContentReadyEventArgs e)
        {
            this.Dispatcher.BeginInvoke(() =&gt;
                                            {
                                                BitmapImage tempImage = new BitmapImage();
                                                tempImage.SetSource(RotateStream(e.ImageStream, Convert.ToInt32(cam.Orientation)));

                                                Result.Source = tempImage;
                                                Result.Visibility = Visibility.Visible;
                                                VideoCanvas.Visibility = Visibility.Collapsed;
                                            });

        }

        /// &lt;summary&gt;
        /// Picture needs to be rotated - dunno why (because of the ImageRotateTransform... sucks...)
        /// &lt;/summary&gt;
        /// &lt;param name="stream"&gt;&lt;/param&gt;
        /// &lt;param name="angle"&gt;&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        private Stream RotateStream(Stream stream, int angle)
        {
          ...
        }

        protected override void OnNavigatingFrom(System.Windows.Navigation.NavigatingCancelEventArgs e)
        {
            if (cam != null)
            {
                cam.Dispose();

                cam.CaptureImageAvailable -= cam_CaptureCompleted;
            }
        }

        private void like_Click(object sender, EventArgs e)
        {
            cam.CaptureImage();
        }

    }</pre>
<p>Beim Navigieren zu dieser Page prüfen wir ob das Phone überhaupt eine Kamera besitzt und initialisieren&nbsp; das “<a href="http://msdn.microsoft.com/en-US/library/windowsphone/develop/microsoft.devices.photocamera(v=vs.105).aspx">PhotoCamera</a>” Objekt und setzen einen Event-Handler. Dann muss ich noch das Camerabild richtig drehen (previewTransform.Rotation = cam.Orientation), ansonsten passiert dies:</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/wp_ss_20130402_0003.jpg"><img title="wp_ss_20130402_0003" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="wp_ss_20130402_0003" src="http://code-inside.de/blog/wp-content/uploads/wp_ss_20130402_0003_thumb.jpg" width="271" height="440"></a> </p>
<p>Irgendwie… schräg – daher haben wir auch die Rotation drin.</p>
<p>Wenn ich auf den Button drücke wird “CaptureImage” aufgerufen und es geht in den Event-Handler rein. Hierbei passiert fast dasselbe wie bei der ersten Variante, aber durch den Trick mit dem drehen ist jetzt auch das Bild gedreht (keine Ahnung warum… vielleicht kann mir ein XAML/Windows Phone Experte einen Tipp geben was ich falsch mache) und muss entweder “optisch” zurückgedreht werden oder wir drehen das gesamte “File”. Da ich auf Byte/Pixtel/Stream-Niveau eine ziemliche Niete bin und ich den <a href="http://timheuer.com/blog/archive/2010/09/23/working-with-pictures-in-camera-tasks-in-windows-phone-7-orientation-rotation.aspx">Blogpost von Tim Heuer</a> gefunden hab geb ich einfach den Source Code der Methode wieder ohne es zu kommentieren <img src='http://code-inside.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">/// &lt;summary&gt;
        /// Picture needs to be rotated - dunno why (because of the ImageRotateTransform... sucks...)
        /// Origin: http://timheuer.com/blog/archive/2010/09/23/working-with-pictures-in-camera-tasks-in-windows-phone-7-orientation-rotation.aspx
        /// &lt;/summary&gt;
        private Stream RotateStream(Stream stream, int angle)
        {
            stream.Position = 0;
            if (angle % 90 != 0 || angle &lt; 0) throw new ArgumentException();
            if (angle % 360 == 0) return stream;

            BitmapImage bitmap = new BitmapImage();
            bitmap.SetSource(stream);
            WriteableBitmap wbSource = new WriteableBitmap(bitmap);

            WriteableBitmap wbTarget = null;
            if (angle % 180 == 0)
            {
                wbTarget = new WriteableBitmap(wbSource.PixelWidth, wbSource.PixelHeight);
            }
            else
            {
                wbTarget = new WriteableBitmap(wbSource.PixelHeight, wbSource.PixelWidth);
            }

            for (int x = 0; x &lt; wbSource.PixelWidth; x++)
            {
                for (int y = 0; y &lt; wbSource.PixelHeight; y++)
                {
                    switch (angle % 360)
                    {
                        case 90:
                            wbTarget.Pixels[(wbSource.PixelHeight - y - 1) + x * wbTarget.PixelWidth] = wbSource.Pixels[x + y * wbSource.PixelWidth];
                            break;
                        case 180:
                            wbTarget.Pixels[(wbSource.PixelWidth - x - 1) + (wbSource.PixelHeight - y - 1) * wbSource.PixelWidth] = wbSource.Pixels[x + y * wbSource.PixelWidth];
                            break;
                        case 270:
                            wbTarget.Pixels[y + (wbSource.PixelWidth - x - 1) * wbTarget.PixelWidth] = wbSource.Pixels[x + y * wbSource.PixelWidth];
                            break;
                    }
                }
            }
            MemoryStream targetStream = new MemoryStream();
            wbTarget.SaveJpeg(targetStream, wbTarget.PixelWidth, wbTarget.PixelHeight, 0, 100);
            return targetStream;
        }</pre>
<p><strong>Fazit:</strong></p>
<p>Am “einfachsten” ist es vermutlich den Task zu nehmen – wenn der Anwendungsfall es zulässt. Die Sache mit der Rotation bei der Camera API ist mir etwas schleierhaft – vielleicht mach ich da auch etwas grundsätzlich falsch. Allerdings dauert es auch einige Sekunden bis man Pixel für Pixel den Stream umgebaut hat – daher würde ich das produktiv so nur “ungern” nehmen. Irgendwer eine Idee? <img src='http://code-inside.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>Weiterführende Links und Beispiele:</strong></p>
<p>Auf der Suche nach ein paar guten Beispielen und weiteren Informationen bin ich auf diese Links gestossen, wobei nicht alles geklappt hat – aber vielleicht nützt es dem einen oder anderen etwas:</p>
<p>EXIF Daten auslesen:</p>
<p><a href="http://www.codeproject.com/Articles/47486/Understanding-and-Reading-Exif-Data">Understanding and Reading Exif Data</a></p>
<p><a href="http://igrali.com/2011/11/01/reading-and-displaying-exif-photo-data-on-windows-phone/">Reading and displaying EXIF photo data on Windows Phone</a> (konnte ich nur teilweise auslesen…)</p>
<p><a href="http://stackoverflow.com/questions/13722898/read-exif-data-from-image-on-wp">Read Exif data from Image on WP</a>&nbsp;</p>
<p>Camera:</p>
<p><a href="http://msdn.microsoft.com/en-us/magazine/hh708750.aspx">MSDN: Using Cameras in Your Windows Phone Application</a></p>
<p><a href="http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh202956(v=vs.105).aspx">How to create a base camera app for Windows Phone</a></p>
<p><a href="http://blogs.msdn.com/b/swick/archive/2011/04/07/image-tips-for-windows-phone-7.aspx">Image Tips for Windows Phone 7</a></p>
<p><a href="http://timheuer.com/blog/archive/2010/09/23/working-with-pictures-in-camera-tasks-in-windows-phone-7-orientation-rotation.aspx">Handling picture orientation in CameraCaptureTask in Windows Phone 7</a> (Orientation scheint ziemlich “komplex” zu sein – die Exif Variante ging bei mir nicht)</p>
<p><a href="http://stackoverflow.com/questions/10330959/rotating-an-image-in-windows-phone">Rotating an Image in Windows Phone</a></p>
<p>UI:</p>
<p><a href="http://code.msdn.microsoft.com/wpapps/PhotoHub-Windows-Phone-8-fd7a1093">PhotoHub &#8211; Windows Phone 8 XAML LongListSelector Grid Layout sample</a></p>
<p>&nbsp;</p>
<h2></h2>
<h2>Sample Code @ GitHub</h2>
<p><strong></strong>&nbsp;</p>
<p><a href="https://github.com/Code-Inside/Samples/tree/master/2013/PhoneCamSample"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; margin-left: 0px; border-left: 0px; display: inline; margin-right: 0px" border="0" alt="image" align="left" src="http://code-inside.de/blog/wp-content/uploads/image1805.png" width="284" height="123"></a></p>
<img src="http://feeds.feedburner.com/~r/Code-insideBlog/~4/-Dzn32mgTOI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://code-inside.de/blog/2013/04/02/windows-phone-8-camera-api-camera-capture-task/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://code-inside.de/blog/2013/04/02/windows-phone-8-camera-api-camera-capture-task/</feedburner:origLink></item>
		<item>
		<title>ASP.NET Roadmap 2013</title>
		<link>http://feedproxy.google.com/~r/Code-insideBlog/~3/gAGdQT0q9YM/</link>
		<comments>http://code-inside.de/blog/2013/03/25/asp-net-roadmap-2013/#comments</comments>
		<pubDate>Mon, 25 Mar 2013 21:46:36 +0000</pubDate>
		<dc:creator>Robert Mühsig</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[ASP.NET]]></category>

		<guid isPermaLink="false">http://code-inside.de/blog/?p=5064</guid>
		<description><![CDATA[<div><img width="150" height="108" src="http://code-inside.de/blog/wp-content/uploads/image1800-150x108.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div>Das ASP.NET Team hat auf ihrer Codeplex Seite die Roadmap aktualisiert. Da die Punkte auf der Roadmap schon recht kurz gehalten sind, lohnt es sich jetzt nicht dies in meinen eigenen Worten wiederzugeben. Eine Sache die ich persönlich sehr Interessant finde ist jedoch OWIN mit dem Katanaproject – hier mal eine Präsentation über OWIN von ...]]></description>
			<content:encoded><![CDATA[<div><img width="150" height="108" src="http://code-inside.de/blog/wp-content/uploads/image1800-150x108.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div><p>Das ASP.NET Team hat auf ihrer <a href="http://aspnetwebstack.codeplex.com">Codeplex Seite</a> die <a href="http://aspnetwebstack.codeplex.com/wikipage?title=Roadmap"><strong>Roadmap</strong></a> aktualisiert.</p>
<p>Da die Punkte auf der Roadmap schon recht kurz gehalten sind, lohnt es sich jetzt nicht dies in meinen eigenen Worten wiederzugeben.</p>
<p>Eine Sache die ich persönlich sehr Interessant finde ist jedoch <a href="http://owin.org/">OWIN</a> mit dem <a href="http://katanaproject.codeplex.com">Katanaproject</a> – hier mal <a href="http://code-inside.de/blog/2012/11/04/owin-prsentation-auf-der-webnetconf/">eine Präsentation über OWIN von mir</a>.</p>
<p><strong>Feedback?</strong> </p>
<p>Wer Feedback dem ASP.NET Team geben möchte kann dies über ihre <a href="http://aspnet.uservoice.com/forums/41199-general-asp-net">UserVoice Seite</a> machen.</p>
<img src="http://feeds.feedburner.com/~r/Code-insideBlog/~4/gAGdQT0q9YM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://code-inside.de/blog/2013/03/25/asp-net-roadmap-2013/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://code-inside.de/blog/2013/03/25/asp-net-roadmap-2013/</feedburner:origLink></item>
		<item>
		<title>ComRegisterFunction &amp; ComUnregisterFunction debuggen</title>
		<link>http://feedproxy.google.com/~r/Code-insideBlog/~3/lAovF7RnRRc/</link>
		<comments>http://code-inside.de/blog/2013/03/25/comregisterfunction-comunregisterfunction-debuggen/#comments</comments>
		<pubDate>Mon, 25 Mar 2013 20:30:34 +0000</pubDate>
		<dc:creator>Robert Mühsig</dc:creator>
				<category><![CDATA[HowTo]]></category>
		<category><![CDATA[COM]]></category>

		<guid isPermaLink="false">http://code-inside.de/blog/?p=5051</guid>
		<description><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1794-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div>Der Post scheint wie aus einer vergangen Zeit (COM???), aber ich hatte erst kürzlich damit zutun. Ich hab ehrlich gesagt auch sehr wenig Ahnung was COM überhaupt macht, aber ich hatte die Aufgabe in einer bestehenden COM-Register-Function Code zu ändern. Ohne Debugging ist das allerdings etwas heiss. ComRegisterFunction &#38; ComUnregisterFunction Vereinfacht: Die Methode die mit ...]]></description>
			<content:encoded><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1794-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div><p>Der Post scheint wie aus einer vergangen Zeit (COM???), aber ich hatte erst kürzlich damit zutun. Ich hab ehrlich gesagt auch sehr wenig Ahnung was COM überhaupt macht, aber ich hatte die Aufgabe in einer bestehenden COM-Register-Function Code zu ändern. Ohne Debugging ist das allerdings etwas heiss.</p>
<p><strong>ComRegisterFunction &amp; ComUnregisterFunction</strong></p>
<p>Vereinfacht: Die Methode die mit den <a href="http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.comregisterfunctionattribute.aspx">Attributen</a> versehen ist, werden bei der jeweiligen Aktion aufgerufen.</p>
<pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">    [ComVisible(true)]
    [Guid("E041712F-D936-4B5B-A3F0-5DB66C4634B0"), ProgId("Foobar")]
    public class Foobar
    {
        [ComRegisterFunction]
        public static void RegisterFunction(Type type)
        {
            Console.WriteLine("Register of Foobar...");
        }

        [ComUnregisterFunction]
        public static void UnregisterFuntion(Type type)
        {
            Console.WriteLine("Unregister of Foobar...");
        }

        public string Buzz()
        {
            return Guid.NewGuid().ToString();
        }

    }</pre>
<p><strong>Das Registrieren übernimmt das Tool “<a href="http://msdn.microsoft.com/en-us/library/tzat5yw6(v=vs.71).aspx">RegAsm</a>”</strong></p>
<p>Das Tool befindet sich hier (bzw. im jeweiligen Framework Order):</p>
<p>C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe</p>
<p>Beim Aufruf des Tools + Angabe der Assembly wird auch unser Code ausgeführt:</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1795.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb949.png" width="543" height="104"></a> </p>
<p><strong>Zum Debugging</strong></p>
<p>Zum Debuggen muss man das Projekt nur auf das regasm.exe Tool lenken und den Output als Argument mit angeben:</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1796.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb950.png" width="530" height="299"></a> </p>
<p>&nbsp;</p>
<p>Damit sollte auch das Debugging funktionieren:</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1797.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb951.png" width="536" height="212"></a> </p>
<p>&nbsp;</p>
<p>Hoffentlich braucht ihr das nicht allzu oft <img src='http://code-inside.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1799.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb953.png" width="471" height="356"></a></p>
<img src="http://feeds.feedburner.com/~r/Code-insideBlog/~4/lAovF7RnRRc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://code-inside.de/blog/2013/03/25/comregisterfunction-comunregisterfunction-debuggen/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://code-inside.de/blog/2013/03/25/comregisterfunction-comunregisterfunction-debuggen/</feedburner:origLink></item>
		<item>
		<title>Architektenporno</title>
		<link>http://feedproxy.google.com/~r/Code-insideBlog/~3/-o3yZ6tvue8/</link>
		<comments>http://code-inside.de/blog/2013/03/22/architektenporno/#comments</comments>
		<pubDate>Fri, 22 Mar 2013 00:15:23 +0000</pubDate>
		<dc:creator>Robert Mühsig</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://code-inside.de/blog/?p=5039</guid>
		<description><![CDATA[Gestern war Dennis Traub bei der .NET User Group Konstanz/Kreuzlingen zu Gast und hat das spannende Thema CQRS vorgestellt. Ich kann jedem nur empfehlen sich mit dem Konzept näher auseinander zu setzen, allerdings geht es in diesem Blogpost nicht direkt darum. Während des Vortrags hat Dennis auch das wunderbare Wort “Architektenporno” eingeworfen als es um ...]]></description>
			<content:encoded><![CDATA[<p>Gestern war <a href="https://twitter.com/DTraub">Dennis Traub</a> bei der <a href="http://www.dotnetkk.de/de/Start/page39363.htm">.NET User Group Konstanz/Kreuzlingen</a> zu Gast und hat das spannende Thema <a href="http://en.wikipedia.org/wiki/Command%E2%80%93query_separation">CQRS</a> vorgestellt. Ich kann jedem nur empfehlen sich mit dem Konzept näher auseinander zu setzen, allerdings geht es in diesem Blogpost nicht direkt darum.</p>
<p>Während des Vortrags hat Dennis auch das wunderbare Wort “Architektenporno” eingeworfen als es um die Umsetzung des Konzeptes ging (mit Domain Models, Events, etc.) – was durchaus ein treffender Begriff für unsere Branche, die ständig nach neuen Methoden/Herangehensweisen sucht, ist.</p>
<p><strong>Architektenporno?</strong></p>
<p><a href="https://twitter.com/sharpcms">Jürgen Gutsch</a> (einer der Organisatoren der .NET User Group) hat den Begriff in <a href="https://twitter.com/sharpcms/status/314667981156270080">einem Tweet</a> recht gut zusammengefasst:</p>
<p><em>“eigentlich ist alles was man als Architekt geil findet und sofort umsetzen will”</em> (natürlich überspitzt formuliert)</p>
<p><strong>Super, oder? Wer kennt das Gefühl nicht? Aber vorher stellen wir uns natürlich ein paar Fragen…</strong></p>
<p>Neue Herangehensweisen, Frameworks und Methode werden ständig entwickelt und das ist auch super (und halte es da wie <a href="http://devtyr.norberteder.com/post/Gefahrliche-Experten-Tipps.aspx">Norbert Eder</a>). Wenn mir eine neue Herangehensweise (wie CQRS) über den Weg läuft, dann muss ich mir eine ganze Reihe von Frage stellen:</p>
<p>- Was sind die Vorteile davon?</p>
<p>- Was sind die Nachteile?</p>
<p>- Ist es für mein Team eine grosse Umstellung?</p>
<p>- Gibt es Alternativen?</p>
<p>- Gibt es Erfahrungswerte mit diesem Konzept?</p>
<p>- Kann ich das anderen Stackholdern (Betrieb/Kunde/Projekt-Management) erklären? </p>
<p>- Usw…</p>
<p>Je nachdem um was es sich handelt sind die Fragen natürlich anders, spätestens an dieser Stelle sollte man sich aber intensive Gedanken machen. </p>
<p>Aber der wichtigste Punkt – der vermutlich auch am schwersten zu beantworten ist:</p>
<p><strong>Ist <u>diese</u> Vorgehensweise das richtige für <u>mein</u> Projekt oder ist das nur <u>eine Wunschvorstellung die ich im Kopf</u> habe?</strong></p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1793.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; margin: 0px 10px 0px 0px; border-left: 0px; display: inline" border="0" alt="image" align="left" src="http://code-inside.de/blog/wp-content/uploads/image_thumb947.png" width="218" height="284"></a> </p>
<p>Wer sich über bestimmte neue Vorgehensweisen/ Frameworks/ … informiert, der kommt häufig zu “Experten-Blogs”, welche natürlich auch meist auf einem sehr hohen Niveau das Thema vorstellen – sprich: Es kann fürchterlich kompliziert wirken (“Alles Event-getrieben und asynchron!”) oder sehr radikal (“Testabdeckung von 100%!”). </p>
<p>Leider wird oft der Kontext (Projekt-/Kunden-/Teamstruktur etc.) nicht genannt in dem dieser Experte arbeitet, sodass man selber schwer absehen kann ob das <strong>der richtige Weg für mich </strong>überhaupt ist. </p>
<p>Kleines Beispiel: Nur weil “Big Data” mit Hadoop ein riesen Thema ist, würde ich jetzt nicht auf die Idee kommen eine kleine Blogsoftware mit diesem System umzusetzen. Auch wenn mein Architektenherz sagt “Klingt cool – machen!”</p>
<p>Stellt euch also ganz kritisch die Frage ob das wirklich passt. Oder ob man es nicht übertreibt. <strong>Nicht jeder baut das nächste Facebook. </strong></p>
<p><strong>Aber: Kenne die Werkzeuge die es gibt!</strong></p>
<p>Falls natürlich jemand am nächsten Facebook arbeitet, dann sollte er die Werkzeuge kennen – daher Augen auf und zur gegebenen Zeit das entsprechende Werkzeug einsetzen – ohne direkt fanatisch eine Richtung zu verfolgen, die sich als nicht passend rausstellt.</p>
<p>PS: Danke nochmal an Dennis für den hervorragenden Vortrag! </p>
<img src="http://feeds.feedburner.com/~r/Code-insideBlog/~4/-o3yZ6tvue8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://code-inside.de/blog/2013/03/22/architektenporno/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://code-inside.de/blog/2013/03/22/architektenporno/</feedburner:origLink></item>
		<item>
		<title>.NET 4.0 &amp; IIS6 mit WCF und REST</title>
		<link>http://feedproxy.google.com/~r/Code-insideBlog/~3/Ei1T3Ji0dGA/</link>
		<comments>http://code-inside.de/blog/2013/03/19/net-4-0-iis6-mit-wcf-und-rest/#comments</comments>
		<pubDate>Tue, 19 Mar 2013 22:10:41 +0000</pubDate>
		<dc:creator>Robert Mühsig</dc:creator>
				<category><![CDATA[HowTo]]></category>
		<category><![CDATA[IIS6]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[WCF]]></category>

		<guid isPermaLink="false">http://code-inside.de/blog/2013/03/19/net-4-0-iis6-mit-wcf-und-rest/</guid>
		<description><![CDATA[Seit Ewigkeiten hatte ich mal wieder einen IIS6 vor mir und hatte die Aufgabe unsere WCF und ASP.NET MVC App (basierend noch auf .NET 4.0) auf diesem System zu installieren. Da die Plattform doch schon etliche Jahre auf den Buckel hat gibt es hier jetzt nur die wichtigsten Knackpunkte (ohne auf die Unzulänglichkeiten des IIS6 ...]]></description>
			<content:encoded><![CDATA[<p>Seit Ewigkeiten hatte ich mal wieder einen IIS6 vor mir und hatte die Aufgabe unsere WCF und ASP.NET MVC App (basierend noch auf .NET 4.0) auf diesem System zu installieren. <br />Da die Plattform doch schon etliche Jahre auf den Buckel hat gibt es hier jetzt nur die wichtigsten Knackpunkte (ohne auf die Unzulänglichkeiten des IIS6 einzugehen), damit eure .NET 4.0 App auf dem IIS6 funktioniert:</p>
<p><strong>Checkliste:</strong></p>
<p>- .NET 4.0 installiert?</p>
<p>- aspnet_regiis.exe –i ausgeführt?</p>
<p>- ASP.NET 4.0 in den “web server extensions” aktiviert?</p>
<p>- Wildcard-Mapping (in der Website gibt es irgendwo ein “Configure” Button) auf aspnet_isapi.dll (und “Verify file exists” rausnehmen!)?</p>
<p>Dann lief es zumindest bei mir – mit ASP.NET 4.0, HTTP PUT/DELETE etc. und WCF.</p>
<p><strong>Das “Ende” ist absehbar</strong></p>
<p>Die (meiner Meinung nach) gute Nachricht zuerst: Das .NET 4.0 Framework ist das letzte Framework was für Windows Server 2003 (und Windows XP auf der Clientseite) zur Verfügung steht. Danach muss man wohl oder übel sich ein neueres Betriebssystem installieren. </p>
<p>Wer .NET 4.5 einsetzen möchte, der braucht mindestens Windows Server 2008!</p>
<p><strong>Weitere Hilfe benötigt?</strong></p>
<p>In <a href="http://forums.asp.net/post/4134821.aspx">diesem Post</a> stehen noch ein paar weitere Tipps (<a href="http://forums.asp.net/t/1551597.aspx/1?+NET+4+0+and+IIS+6+Deployment+problem">hier zum ganzen Foren-Thread</a>).</p>
<img src="http://feeds.feedburner.com/~r/Code-insideBlog/~4/Ei1T3Ji0dGA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://code-inside.de/blog/2013/03/19/net-4-0-iis6-mit-wcf-und-rest/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://code-inside.de/blog/2013/03/19/net-4-0-iis6-mit-wcf-und-rest/</feedburner:origLink></item>
		<item>
		<title>Guide zu Claims-Based Identity mit dem Access Control Service</title>
		<link>http://feedproxy.google.com/~r/Code-insideBlog/~3/ZbMF_jZbYL8/</link>
		<comments>http://code-inside.de/blog/2013/03/19/guide-zu-claims-based-identity-mit-dem-access-control-service/#comments</comments>
		<pubDate>Tue, 19 Mar 2013 21:44:15 +0000</pubDate>
		<dc:creator>Robert Mühsig</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[AAL]]></category>
		<category><![CDATA[Authentication]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[JWT]]></category>
		<category><![CDATA[OAuth]]></category>

		<guid isPermaLink="false">http://code-inside.de/blog/?p=5034</guid>
		<description><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1792-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div>Microsoft hat ein kostenloses PDF zum Thema Claim-based Identity, Access Control Service und wie man das mit der restlichen Microsoft Welt (Sharepoint, ADFS, Azure) in Zusammenspiel bringt herausgegeben: Download-Link bzw. MSDN Link Die Ankündigung hab ich heute auf Vittorio Bertoccis Blog gefunden. Mehr Informationen? Wer sich tiefer mit der Matiere auseinander setzen will, sollte definitiv ...]]></description>
			<content:encoded><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1792-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div><p>Microsoft hat ein kostenloses PDF zum Thema Claim-based Identity, Access Control Service und wie man das mit der restlichen Microsoft Welt (Sharepoint, ADFS, Azure) in Zusammenspiel bringt herausgegeben:</p>
<p><a href="http://www.microsoft.com/en-us/download/details.aspx?id=28362"><strong>Download-Link</strong></a> bzw.<strong> </strong><a href="http://msdn.microsoft.com/en-us/library/ff423674.aspx"><strong>MSDN Link</strong></a></p>
<p>Die Ankündigung hab ich heute auf <a href="http://www.cloudidentity.com/blog/2013/03/18/now-on-amazon-a-guide-to-claims-based-identity-and-access-control-2nd-edition/">Vittorio Bertoccis Blog</a> gefunden.</p>
<p><strong>Mehr Informationen?</strong></p>
<p>Wer sich tiefer mit der Matiere auseinander setzen will, sollte definitiv ein Blick auf den <a href="http://www.cloudidentity.com/blog/2013/03/18/now-on-amazon-a-guide-to-claims-based-identity-and-access-control-2nd-edition/"><strong>restlichen Blog von Vittorio</strong></a> werfen. Interessant zudem ist auch sein <a href="http://channel9.msdn.com/Events/Patterns-Practices-Symposium-Online/pattern-practices-symposium-2013/Windows-Azure-Active-Directory"><strong>Video zum Thema Window Azure Active Directory</strong></a>.</p>
<p><strong>Von SAML zu JWT</strong></p>
<p>Was im PDF nicht enthalten ist, wo sich allerdings ein Trent abzeichnet ist die Abkehr von SAML hin zu <a href="http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html"><strong>JWT</strong></a>. Auch hier empfehle ich wieder <a href="http://www.cloudidentity.com/blog/?s=JWT"><strong>Vittorios Blog</strong></a> und die <a href="http://msdn.microsoft.com/en-us/library/windowsazure/jj573266.aspx"><strong>Windows Azure Authentication Library</strong></a>.</p>
<p>Die Informationsvielfalt in dem Gebiet ist nicht besonders hoch und meist kommt man früher oder später auf Vittorios Blog hinaus – vielleicht findet jetzt jemand den Blog von ihm schneller <img src='http://code-inside.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<img src="http://feeds.feedburner.com/~r/Code-insideBlog/~4/ZbMF_jZbYL8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://code-inside.de/blog/2013/03/19/guide-zu-claims-based-identity-mit-dem-access-control-service/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://code-inside.de/blog/2013/03/19/guide-zu-claims-based-identity-mit-dem-access-control-service/</feedburner:origLink></item>
		<item>
		<title>IIS &amp; Powershell: New-Website failed with “Index was outside the bounds of the array”</title>
		<link>http://feedproxy.google.com/~r/Code-insideBlog/~3/XquZQq7EGBk/</link>
		<comments>http://code-inside.de/blog/2013/03/17/iis-powershell-new-website-failed-with-index-was-outside-the-bounds-of-the-array/#comments</comments>
		<pubDate>Sun, 17 Mar 2013 00:25:41 +0000</pubDate>
		<dc:creator>Robert Mühsig</dc:creator>
				<category><![CDATA[Fix]]></category>
		<category><![CDATA[IIS]]></category>
		<category><![CDATA[Powershell]]></category>

		<guid isPermaLink="false">http://code-inside.de/blog/2013/03/17/iis-powershell-new-website-failed-with-index-was-outside-the-bounds-of-the-array/</guid>
		<description><![CDATA[Wer ein Windows Server 2008 bzw. Windows Server 2008R2 nutzt, der kann den IIS über die Powershell relativ einfach administrieren, allerdings bin ich da über einen kleinen Fehler gestolpert, der auf Windows Server 2012 nicht auftritt: Wenn der IIS keine Seiten enthält und ich über New-WebSite eine Seite anlegen möchte, dann kommt der Fehler “Index ...]]></description>
			<content:encoded><![CDATA[<p>Wer ein Windows Server 2008 bzw. Windows Server 2008R2 nutzt, der kann den <a href="http://www.iis.net/learn/manage/powershell/powershell-snap-in-creating-web-sites-web-applications-virtual-directories-and-application-pools">IIS über die Powershell relativ einfach administrieren</a>, allerdings bin ich da über einen kleinen Fehler gestolpert, der auf Windows Server 2012 nicht auftritt:</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1791.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb945.png" width="574" height="76"></a> </p>
</p>
<p>Wenn der IIS keine Seiten enthält und ich über New-WebSite eine Seite anlegen möchte, dann kommt der Fehler “Index was outside the bounds of the array.”</p>
<p><strong>Fehlerbehebung: ID explizit mitgeben</strong></p>
<pre>New-Website -Name Foobar <strong>-Id 1</strong> -PhysicalPath C:\inetpub\wwwroot</pre>
<p>Auf einem Windows Server 2012 ist dies nicht nötig. </p>
<p>Gefunden habe ich diesen Tipp <a href="http://forums.iis.net/t/1159761.aspx/3/10">hier</a>.</p>
<img src="http://feeds.feedburner.com/~r/Code-insideBlog/~4/XquZQq7EGBk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://code-inside.de/blog/2013/03/17/iis-powershell-new-website-failed-with-index-was-outside-the-bounds-of-the-array/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://code-inside.de/blog/2013/03/17/iis-powershell-new-website-failed-with-index-was-outside-the-bounds-of-the-array/</feedburner:origLink></item>
		<item>
		<title>Damit sich der TFS TeamBuild so verhält wie ein lokales Visual Studio – das “OutDir” Property</title>
		<link>http://feedproxy.google.com/~r/Code-insideBlog/~3/cJGv666Z5-A/</link>
		<comments>http://code-inside.de/blog/2013/03/16/damit-sich-der-tfs-teambuild-so-verhlt-wie-ein-lokales-visual-studio-das-outdir-property/#comments</comments>
		<pubDate>Sat, 16 Mar 2013 10:16:16 +0000</pubDate>
		<dc:creator>Robert Mühsig</dc:creator>
				<category><![CDATA[HowTo]]></category>
		<category><![CDATA[TeamBuild]]></category>
		<category><![CDATA[TFS]]></category>

		<guid isPermaLink="false">http://code-inside.de/blog/?p=5027</guid>
		<description><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1790-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div>Wer die Teambuilds des TFS einsetzt kennt vermutlich das Problem, dass beim Bauen der Solution der TFS automatisch sämtlichen Projekt-“Output” in ein “Binaries” Verzeichnis umlenkt. Die Standard Templates gehen wohl davon aus, dass eine Solution nur einen Output hat, allerdings hab ich dies bislang nur selten so vorgefunden und selbst da find ich die Idee ...]]></description>
			<content:encoded><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1790-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div><p>Wer die Teambuilds des TFS einsetzt kennt vermutlich das <a href="http://social.msdn.microsoft.com/Forums/en-US/tfsbuild/thread/7126f1a3-9437-416a-88ed-2f63f84b2937">Problem</a>, dass beim Bauen der Solution der TFS automatisch sämtlichen Projekt-“Output” in ein “Binaries” Verzeichnis umlenkt. Die Standard Templates gehen wohl davon aus, dass eine Solution nur einen Output hat, allerdings hab ich dies bislang nur selten so vorgefunden und selbst da find ich die Idee nicht besonders clever.</p>
<p><strong>Build-Process Templates bearbeiten</strong></p>
<p>Damit der TFS die Solution genau so baut wie der normale Visual Studio Client muss man das Build-Process Template bearbeiten. Das Template ist eine .xaml Datei und ist ziemlich gross und auch nicht wirklich übersichtlich.</p>
<p><strong>Lösung</strong></p>
<p>Am einfachsten öffnet ihr die .xaml Datei mit einem Texteditor eurer Wahl und such die Zeile mit <strong>“&lt;mtbwa:MSBuild”</strong>. An dieser Stelle ruft der Prozess MSBuild auf. In den Standard-Templates ist das genau 2 mal der Fall (Build &amp; Clean).</p>
<p><strong>Löscht</strong> im mtbwa:MSBuild Tag <strong>das Attribute “OutDir” </strong>und der TFS lenkt den Output nicht mehr um.</p>
<p>Alternativ kann man sich im Prozess-Editor auch bis an die Stelle klicken:</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1790.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb944.png" width="240" height="216"></a> </p>
<p>Gefunden hab ich diese einfache Variante <a href="http://bartwullems.blogspot.ch/2012/07/tfs-build-output-build-results-to.html">hier</a>.</p>
<img src="http://feeds.feedburner.com/~r/Code-insideBlog/~4/cJGv666Z5-A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://code-inside.de/blog/2013/03/16/damit-sich-der-tfs-teambuild-so-verhlt-wie-ein-lokales-visual-studio-das-outdir-property/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://code-inside.de/blog/2013/03/16/damit-sich-der-tfs-teambuild-so-verhlt-wie-ein-lokales-visual-studio-das-outdir-property/</feedburner:origLink></item>
		<item>
		<title>Claims in .NET 4.5 – Definiert in mehreren Namenspaces?</title>
		<link>http://feedproxy.google.com/~r/Code-insideBlog/~3/beBCXGxpm-U/</link>
		<comments>http://code-inside.de/blog/2013/03/14/claims-in-net-4-5-definiert-in-mehreren-namenspaces/#comments</comments>
		<pubDate>Thu, 14 Mar 2013 00:03:42 +0000</pubDate>
		<dc:creator>Robert Mühsig</dc:creator>
				<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Claims]]></category>

		<guid isPermaLink="false">http://code-inside.de/blog/?p=5023</guid>
		<description><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1789-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div>Bei einer Umstellung von einer .NET 4.0 Anwendung, welche unter anderem auch die Windows Identity Foundation benutzt, auf .NET 4.5 ist mir aufgefallen dass der Typ “Claim” unter Umständen in drei Namespaces definiert sein kann: Die 3 Namespaces mit den Claim Seit .NET 4.5 gibt es Claims in diesen zwei Namenspaces: System.Security.Claims.Claim System.IdentityModel.Claims.Claim Unter umständen ...]]></description>
			<content:encoded><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1789-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div><p>Bei einer Umstellung von einer .NET 4.0 Anwendung, welche unter anderem auch die <a href="http://msdn.microsoft.com/en-us/security/aa570351.aspx">Windows Identity Foundation</a> benutzt, auf .NET 4.5 ist mir aufgefallen dass der Typ “Claim” unter Umständen in drei Namespaces definiert sein kann:</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1789.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb943.png" width="524" height="155"></a> </p>
<p><strong>Die 3 Namespaces mit den Claim</strong></p>
<p>Seit .NET 4.5 gibt es Claims in diesen zwei Namenspaces:</p>
<p><a href="http://msdn.microsoft.com/en-us/library/system.security.claims.claim.aspx">System.Security.Claims.Claim</a></p>
<p><a href="http://msdn.microsoft.com/en-us/library/ms572956(v=vs.110)">System.IdentityModel.Claims.Claim</a></p>
<p>Unter umständen (wenn die Referenz Microsoft.IdentityModel.dll noch im Projekt ist) hat man noch dies zur Auswahl:</p>
<p><a href="http://msdn.microsoft.com/en-us/library/microsoft.identitymodel.claims.claim.aspx">Microsoft.IdentityModel.Claims</a></p>
<p><strong>Erkläuterung:</strong></p>
<p>Das <a href="http://en.wikipedia.org/wiki/Claims-based_identity">Konzept der Claims</a> wurde mit .NET 4.5 direkt ins Framework eingebunden. Daher gibt es auch einige Interfaces, wie z.B. IClaimsIdentity, nicht mehr. Der Artikel “<a href="http://msdn.microsoft.com/en-us/library/hh873305.aspx">What’s New in Windows Identity Foundation 4.5</a>” listet alles genauer auf. Die <u>Microsoft.IdentityModel.*</u> Namespaces sind damit <u>veraltet</u>. </p>
<p>Wichtigste Parts meiner Meinung nach:</p>
<p><em><strong>WIF Is Now Part of the .NET Framework</strong></em></p>
<p><em>W</em><em>IF classes are now spread across several assemblies, the main ones being mscorlib, System.IdentityModel, System.IdentityModel.Services, and System.ServiceModel. Likewise, the WIF classes are spread across several namespaces: </em><a href="http://msdn.microsoft.com/en-us/library/system.security.claims.aspx"><em>System.Security.Claims</em></a><em>, several </em><a href="http://go.microsoft.com/fwlink/?LinkId=272004"><em>System.IdentityModel</em></a><em> namespaces, and </em><a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.security.aspx"><em>System.ServiceModel.Security</em></a><em>. The</em><a href="http://msdn.microsoft.com/en-us/library/system.security.claims.aspx"><em>System.Security.Claims</em></a><em> namespace contains the new </em><a href="http://msdn.microsoft.com/en-us/library/system.security.claims.claimsprincipal.aspx"><em>ClaimsPrincipal</em></a><em> and </em><a href="http://msdn.microsoft.com/en-us/library/system.security.claims.claimsidentity.aspx"><em>ClaimsIdentity</em></a><em> classes (see below). All principals in .NET now derive from </em><a href="http://msdn.microsoft.com/en-us/library/system.security.claims.claimsprincipal.aspx"><em>ClaimsPrincipal</em></a><em>. For more detailed information about the WIF namespaces and the kinds of classes that they contain, see </em><a href="http://msdn.microsoft.com/en-us/library/jj729788.aspx"><em>WIF API Reference</em></a><em>. For information about how namespaces map between WIF 3.5 and WIF 4.5, see </em><a href="http://msdn.microsoft.com/en-us/library/jj157091.aspx"><em>Namespace Mapping between WIF 3.5 and WIF 4.5</em></a><em>.</em></p>
<blockquote><p><font color="#545454" face="Lucida Sans Unicode"><em><strong>New Claims Model and Principal Object</strong></em></font></p>
</blockquote>
<p><em>Claims are at the very core of the .NET Framework 4.5. The base claim classes (Claim, ClaimsIdentity, ClaimsPrincipal, ClaimTypes, and ClaimValueTypes) all live directly in mscorlib in the System.Security.Claims namespace. It is no longer necessary to use interfaces in order to plug claims into the .NET identity system: WindowsPrincipal, GenericPrincipal, and RolePrincipal now inherit from ClaimsPrincipal; and WindowsIdentity, GenericIdentity, and FormsIdentity now inherit from ClaimsIdentity. In short, every principal class will now serve claims. The WIF 3.5 integration classes and interfaces (WindowsClaimsIdentity, WindowsClaimsPrincipal, IClaimsPrincipal, IClaimsIdentity) have thus been removed. In addition, the ClaimsIdentity class now exposes methods which make it easier to query the identity’s claims collection.</em></p>
<p><strong>Migration auf Windows Identity Foundation 4.5</strong></p>
<p>Wer eine Anwendung migriert, der schaut am besten in der <a href="http://msdn.microsoft.com/en-us/library/jj157091.aspx">Mapping Tabelle</a> nach. </p>
<p>Wenn im Code diese Klassen “WindowsClaimsIdentity, WindowsClaimsPrincipal, IClaimsPrincipal,IClaimsIdentity” vorkommen, dann kann man es meist sehr einfach mit ClaimsPrinciple bzw. ClaimsIdentity austauschen.</p>
<p>Ansonsten ist die hauptsächliche Claim-Definition im <a href="http://msdn.microsoft.com/en-us/library/system.security.claims.claim.aspx">System.Security.Claims</a> Namespace! </p>
<img src="http://feeds.feedburner.com/~r/Code-insideBlog/~4/beBCXGxpm-U" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://code-inside.de/blog/2013/03/14/claims-in-net-4-5-definiert-in-mehreren-namenspaces/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://code-inside.de/blog/2013/03/14/claims-in-net-4-5-definiert-in-mehreren-namenspaces/</feedburner:origLink></item>
		<item>
		<title>Windows Azure Websites – Logging &amp; ErrorHandling</title>
		<link>http://feedproxy.google.com/~r/Code-insideBlog/~3/EYuqeAQi6pU/</link>
		<comments>http://code-inside.de/blog/2013/03/12/windows-azure-websites-logging-errorhandling/#comments</comments>
		<pubDate>Tue, 12 Mar 2013 21:30:06 +0000</pubDate>
		<dc:creator>Robert Mühsig</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[Elmah]]></category>
		<category><![CDATA[Websites]]></category>

		<guid isPermaLink="false">http://code-inside.de/blog/?p=5018</guid>
		<description><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1783-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div>Die Azure Websites sind in der Handhabung sehr simpel, dennoch kann man leicht neue Instanzen dazuschalten. Doch was macht man, wenn ein Fehler passiert? Azure Website Konfiguration Unter den Einstellungen der Azure Websites kann man 3 Diagnose-Tools anschalten: Detailed Error Logging – Turn on detailed error logging to capture all errors generated by your web ...]]></description>
			<content:encoded><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1783-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div><p>Die <a href="http://code-inside.de/blog/2013/03/02/windows-azure-websites-git-hosting-deployment-leicht-gemacht/">Azure Websites</a> sind in der Handhabung sehr simpel, dennoch kann man leicht neue Instanzen dazuschalten. Doch was macht man, wenn ein Fehler passiert?</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1783.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb937.png" width="575" height="239"></a> </p>
<p><strong>Azure Website Konfiguration</strong></p>
<p>Unter den Einstellungen der Azure Websites kann man 3 Diagnose-Tools anschalten:</p>
<ul>
<li><strong>Detailed Error Logging</strong> – Turn on detailed error logging to capture all errors generated by your web site.
<li><strong>Failed Request Tracing</strong> – Turn on failed request tracing to capture information for failed client requests.
<li><strong>Web Server Logging</strong> – Turn on Web Server logging to save web site logs using the W3C extended log file format.</li>
<li></li>
</ul>
<p><a href="http://www.windowsazure.com/en-us/manage/services/web-sites/how-to-monitor-websites/">Quelle: How to monitore web sites</a></p>
<p>&nbsp;</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1784.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb938.png" width="622" height="415"></a> </p>
<p><strong>Wo werden diese Logs gespeichert?</strong></p>
<p>Die Logs werden in einem Verzeichnis auf der Maschine abgelegt, welches über <strong>FTP</strong> zugänglich ist. Dafür in das “<strong>Dashboard</strong>” wechseln und dort nach “FTP DIAGNOSTIC LOGS” suchen. Der <strong>Deployment-User</strong> (der auch das Git-Deployment übernimmt) wird dort als Login gebraucht!</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1785.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb939.png" width="398" height="164"></a> </p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1786.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb940.png" width="395" height="333"></a> </p>
<p><strong>Ich benötige weitere Logging- / Exception-Informationen</strong></p>
<p>Leider sind die Error-Pages nicht wirklich immer zielführend, daher kommt man relativ schnell zu dem Punkt an dem man ein Logging Framework benötigt. </p>
<p>ELMAH to the rescue!</p>
<p>Ich hatte mich schnell für ELMAH entschieden, samt der zusätzlichen <a href="https://github.com/alexanderbeletsky/elmah.mvc">ASP.NET MVC Integration</a>:</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1787.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb941.png" width="458" height="313"></a>&nbsp;</p>
<p>Dann noch den XmlFile-Provider einhängen in der web.config:</p>
<p><em>&lt;elmah&gt;<br />&nbsp; &lt;errorLog type=&#8221;Elmah.XmlFileErrorLog, Elmah&#8221; logPath=&#8221;~/App_Data&#8221; /&gt;<br />&lt;/elmah&gt;</em>
<p>Dann kann man auch via der FTP Seite sich bis zur Seite und dem App_Data Verzeichnis navigieren:</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1788.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb942.png" width="457" height="146"></a>&nbsp;</p>
<p>Natürlich würde auch Log4Net oder <a href="http://code-inside.de/blog/2013/01/20/logging-mit-nlog/">NLog</a> funktionieren.</p>
<p>Damit sollte es auch mit dem Debugging klappen <img src='http://code-inside.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>Fazit:</strong></p>
<p>Die Azure Websites verhalten sich sehr ähnlich wie eine normale Web-Anwendung auf einem normalen IIS, daher gelten hier fast die selben Bedingungen. Hier ist kein völlig anderes Vorgehen wie bei den Cloud Services (mit den Table Storage und den Diagnostics) von nöten.</p>
<img src="http://feeds.feedburner.com/~r/Code-insideBlog/~4/EYuqeAQi6pU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://code-inside.de/blog/2013/03/12/windows-azure-websites-logging-errorhandling/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://code-inside.de/blog/2013/03/12/windows-azure-websites-logging-errorhandling/</feedburner:origLink></item>
		<item>
		<title>Windows Azure IP Ranges – für Firewall-Freischaltungen etc.</title>
		<link>http://feedproxy.google.com/~r/Code-insideBlog/~3/0Ba4Hy3nwxM/</link>
		<comments>http://code-inside.de/blog/2013/03/11/windows-azure-ip-ranges-fr-firewall-freischaltungen-etc/#comments</comments>
		<pubDate>Mon, 11 Mar 2013 21:33:57 +0000</pubDate>
		<dc:creator>Robert Mühsig</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[Firewall]]></category>

		<guid isPermaLink="false">http://code-inside.de/blog/2013/03/11/windows-azure-ip-ranges-fr-firewall-freischaltungen-etc/</guid>
		<description><![CDATA[Wichtig zu verstehen: Geht man in die Azure-Cloud, spielen feste IP-Adressen eigentlich nicht mehr die Rolle. Alles wird über DNS Einträge gelöst und Microsoft kümmert sich den darunterliegenden Stack. Wer nur in der Wolke arbeitet: Alles super. Firmen-IT &#38; die Cloud – manchmal muss es die IP-Adresse sein Schwieriger wird der Fall wenn man ein ...]]></description>
			<content:encoded><![CDATA[<p><strong>Wichtig zu verstehen:</strong> Geht man in die Azure-Cloud, spielen feste IP-Adressen eigentlich nicht mehr die Rolle. Alles wird über DNS Einträge gelöst und Microsoft kümmert sich den darunterliegenden Stack. Wer nur in der Wolke arbeitet: Alles super.</p>
<p><strong>Firmen-IT &amp; die Cloud – manchmal muss es die IP-Adresse sein</strong></p>
<p>Schwieriger wird der Fall wenn man ein Hybrid-Betrieb fahren möchte: Wer SQL Azure nutzen möchte, aber die Anwendung läuft im Firmen-Netz braucht oftmals eine interne Firewall-Freischaltung auf Basis von IP-Adressen bzw. IP-Adressbereichen.</p>
<h3>IP-Adress Ranges von Azure (Stand Oktober 2011!)</h3>
<p>Leider habe ich keine offiziellen Angaben dazu gefunden, sondern nur durch zufall mit einem Kollegen diese <a href="http://msdn.microsoft.com/en-us/library/windowsazure/hh508976.aspx">Seite</a> entdeckt, welche die IP-Ranges von Oktober 2011 auflistet:</p>
<p><strong>United States (South/Central)</strong>
<p>65.55.80.0/20, 65.54.48.0/21, 65.55.64.0/20, 70.37.48.0/20, 70.37.64.0/18, 65.52.32.0/21, 70.37.160.0/21, 157.55.103.48/28, 157.55.176.0/20, 157.55.103.32/28, 157.55.192.0/22<br />
<h5></h5>
<p><strong>United States (North/Central)</strong>
<p>207.46.192.0/20, 65.52.0.0/19, 65.52.48.0/20, 65.52.192.0/19, 209.240.220.0/23, 157.55.136.0/21, 157.55.60.224/28, 157.55.160.0/20<br />
<h5></h5>
<p><strong>Europe (North)</strong>
<p>213.199.128.0/20, 213.199.160.0/20, 213.199.184.0/21, 94.245.112.0/20, 94.245.88.0/21, 94.245.104.0/21, 65.52.64.0/20, 65.52.224.0/19<br />
<h5></h5>
<p><strong>Europe (West)</strong>
<p>94.245.97.0/24, 65.52.128.0/19<br />
<h5></h5>
<p><strong>Asia (Southeast)</strong>
<p>207.46.48.0/20, 111.221.16.0/21, 111.221.80.0/20<br />
<h5></h5>
<p><strong>Asia (East)</strong>
<p>11.221.64.0/22, 65.52.160.0/19
<p><strong>Benutzung auf eigene Gefahr – hat aber bei mir funktioniert und der Admin war glücklich <img src='http://code-inside.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </strong></p>
<img src="http://feeds.feedburner.com/~r/Code-insideBlog/~4/0Ba4Hy3nwxM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://code-inside.de/blog/2013/03/11/windows-azure-ip-ranges-fr-firewall-freischaltungen-etc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://code-inside.de/blog/2013/03/11/windows-azure-ip-ranges-fr-firewall-freischaltungen-etc/</feedburner:origLink></item>
		<item>
		<title>Details definieren eure App</title>
		<link>http://feedproxy.google.com/~r/Code-insideBlog/~3/A_9I0WUNuhU/</link>
		<comments>http://code-inside.de/blog/2013/03/07/details-definieren-eure-app/#comments</comments>
		<pubDate>Thu, 07 Mar 2013 20:32:26 +0000</pubDate>
		<dc:creator>Robert Mühsig</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[App]]></category>
		<category><![CDATA[Details]]></category>
		<category><![CDATA[User Experience]]></category>

		<guid isPermaLink="false">http://code-inside.de/blog/?p=5002</guid>
		<description><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1780-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div>Was macht eine gute Applikation aus? Ein möglichst grosses Feature-Sets? Eine technisch einwandfreie Software? Ein tolles Design? Die Antwort liegt (für mich) irgendwo in der Mitte bzw. eher auf einem anderen Level: Für den Anwender sind es meist die kleinen Details die eure App definieren.&#160; Banale Dinge, wie z.B. ein DropDown können “begeistern” Der Artikel ...]]></description>
			<content:encoded><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1780-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div><p>Was macht eine gute Applikation aus? Ein möglichst grosses Feature-Sets? Eine technisch einwandfreie Software? Ein tolles Design? Die Antwort liegt (für mich) irgendwo in der Mitte bzw. eher auf einem anderen Level: Für den Anwender sind es meist die kleinen Details die eure App definieren.&nbsp; </p>
<p><strong>Banale Dinge, wie z.B. ein DropDown können “begeistern”</strong></p>
<p>Der Artikel um den Nachbau des “<a href="http://bjk5.com/post/44698559168/breaking-down-amazons-mega-dropdown">Amazon Dropdown-Menüs</a>” ging durch die Twitter-Webdesign-Welt. Auf den ersten Blick eigentlich total banal und unspannend – ein Drop-Down. Super. Auf der anderen Seite ein nettes Detail (und schon ziemlich cool).</p>
<p>Anderseits macht Amazon natürlich nicht durch das Drop-Down mehr Umsatz – aber mit sowas hebt man sich von der Masse ab (wobei Amazon natürlich schon längst auf einer völlig anderen Ebene ist) und das ist insbesondere am Anfang für viele wichtig um beim Nutzer zu punkten.</p>
<p><strong>Technisch perfekt, aber völlig lieblos designed</strong></p>
<p>Wer Benutzer (damit sind nicht nur Consumer gemeint, sondern vielleicht auch der normale Büroangestellte, oder auch der Entwickler, der eure API nutzen möchte) überzeugen will, sollte seine <strong>Applikation</strong> <strong>mit Liebe entwickeln</strong>. Sich auch in den Anwender reinversetzen. Frustrierende Tools, die lieblos gestaltet wurden, gibt es schon mehr als genug. Selbst Business-Software geht diesen Weg, oder warum sonst kann man lustige Brote als Hintergrund in Outlook setzen?</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1781.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb935.png" width="583" height="473"></a>&nbsp; </p>
<p><strong>Details ja, aber nicht verloren in der Detailliebe und auch nicht kitschig</strong></p>
<p>Hier kommt vermutlich das kniffligste: Die Balance zu finden zwischen “funktionstüchtige, kalte Software” und “soooo viele Details, aber warum geht das nicht?”. <strong>Die Erwartungshaltung des Anwenders an die Software soll erfüllt werden</strong> – aber wenn er dabei eine schönes Nutzererlebnis hat, dann her damit!</p>
<p><strong>Ich hab keine Zeit für Details – braucht sowieso kein Mensch! </strong></p>
<p>Der Gedanke, dass man an Details nur Zeit verschwendet ist für einen Techniker naheliegend (und vielleicht sogar “typisch deutsch”), aber grundsätzlich verkehrt.</p>
<p>Wie bereits Mr. Coding-Horror gut zusammengefasst hat: <a href="http://www.codinghorror.com/blog/2012/05/this-is-all-your-app-is-a-collection-of-tiny-details.html"><strong>This is all your app is: a collection of tiny details.</strong></a></p>
<p>Selbst eine API kann mit Liebe designed werden. Für die <a href="http://api.stackexchange.com/docs/tags-by-name#order=desc&amp;sort=popular&amp;tags=RavenDb&amp;filter=default&amp;site=stackoverflow&amp;run=true">StackExchange-Leute war es auch nicht nötig ein Webtool zum Testen ihrer API bereitzustellen</a> – gibt ja Fiddler, oder? Aber trotzdem ist das ein nettes Details, was die Nutzererfahrung runder macht:</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1782.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb936.png" width="603" height="468"></a>&nbsp;</p>
<p><strong>100% Test-Abdeckung, aber…</strong></p>
<p>Viele Software-Entwickler lieben Statistiken und natürlich will jeder eine toll geteste Software haben – 80 oder mehr % sind doch ein gutes Ziel, oder? Für mich auch der verkehrte Ansatz – wenn die Applikation hohes Frustrations-Potenzial hat, weil das Nutzererlebnis einfach vollständig fehlt, dann würde ich da lieber meine Zeit investieren. </p>
<p><strong>Also liebe Software Kollgen: Liebe und Begeisterung durch Software verbreiten – yay!</strong></p>
<img src="http://feeds.feedburner.com/~r/Code-insideBlog/~4/A_9I0WUNuhU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://code-inside.de/blog/2013/03/07/details-definieren-eure-app/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://code-inside.de/blog/2013/03/07/details-definieren-eure-app/</feedburner:origLink></item>
		<item>
		<title>Windows Azure Websites &amp; Git: Hosting &amp; Deployment leicht gemacht</title>
		<link>http://feedproxy.google.com/~r/Code-insideBlog/~3/_Oo8u14z62M/</link>
		<comments>http://code-inside.de/blog/2013/03/02/windows-azure-websites-git-hosting-deployment-leicht-gemacht/#comments</comments>
		<pubDate>Sat, 02 Mar 2013 17:28:25 +0000</pubDate>
		<dc:creator>Robert Mühsig</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[GIT]]></category>

		<guid isPermaLink="false">http://code-inside.de/blog/?p=4992</guid>
		<description><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1777-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div>Wer heute noch auf der Suche nach einem “billigen” Hoster für seine ASP.NET Website ist, der sollte sich unbedingt das Website-Feature von Windows Azure genauer anschauen. Bereits mitte letzten Jahres von Scott Guthrie unter dem Titel “Meet the new Windows Azure” vorgestellt habe ich es nun doch letztendlich mal selbst ausprobiert (und nicht nur auf ...]]></description>
			<content:encoded><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1777-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div><p>Wer heute noch auf der Suche nach einem “billigen” Hoster für seine ASP.NET Website ist, der sollte sich unbedingt das <a href="http://www.windowsazure.com/en-us/manage/services/web-sites/">Website-Feature von Windows Azure</a> genauer anschauen. Bereits mitte letzten Jahres von Scott Guthrie unter dem Titel “<a href="http://weblogs.asp.net/scottgu/archive/2012/06/07/meet-the-new-windows-azure.aspx">Meet the new Windows Azure</a>” vorgestellt habe ich es nun doch letztendlich mal selbst ausprobiert (und nicht nur auf Videos und Konferenzen gesehen <img src='http://code-inside.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ) und bin mehr als begeistert.</p>
<p><strong>Windows Azure Websites</strong> </p>
<p>Die Websites sind ein wesentlich leichtgewichtiges Modell als die “Cloud Services” und sind momentan noch im Preview Status – d.h. man muss es aktuell noch explizit freischalten.</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1773.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb927.png" width="581" height="288"></a> </p>
<p>Nach dem Anlegen kann man entweder das “Publish profil” runterladen und via WebDeploy das Deployment erledigen oder man wählt die Option via TFS oder Git zu deployen:</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1774.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb928.png" width="582" height="461"></a> </p>
<p>Als Quelle können diverse Git-Provider dienen oder auch der <a href="http://tfs.visualstudio.com/">Team Foundation Service</a>:</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1775.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb929.png" width="420" height="302"></a> </p>
<p>In meinem Fall habe ich mich für GitHub entschieden und kann direkt danach mein Repository auswählen:</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1776.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb930.png" width="426" height="315"></a> </p>
<p>Danach wird versucht ein Deployment durchzuführen, d.h. </p>
<p>Wenn alles gut geht wird die Website im Repository gebaut und deployed:</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1777.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb931.png" width="460" height="232"></a> </p>
<p>Randnotiz: Man kann auch wieder auch ältere Deployments zurückgreifen wenn man möchte.</p>
<p><strong>Fazit:</strong> </p>
<p>Eine kleine ASP.NET Seite zu hosten war nie einfacher und billiger als heute. Die Gewissheit die kleine Seite auch ohne große Probleme hinterher auf mehrere Maschinen skalieren zu lassen ist eine der Stärken von Azure.</p>
<p><strong>Was passiert wenn mehrere ASP.NET Projekte in einem Repository sind? </strong></p>
<p>Aktuell <a href="http://social.msdn.microsoft.com/Forums/pl-PL/azuregit/thread/95eaf2fc-9875-4c14-b100-d2f331f4078a">scheint es</a> so als ob das automatische Deployment nur eine Solution mit einem Webprojekt unterstützt wird – allerdings kann man natürlich selbst zu Azure “pushen”.</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1778.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb932.png" width="490" height="182"></a> </p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1779.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb933.png" width="508" height="163"></a> </p>
<p><strong>Was kostet es?</strong></p>
<p>10 Seiten gibt es kostenlos – wobei eine Traffic und CPU Limitierung vorliegt. Wer eine Custom-Domain haben möchte, muss zudem auch einen kleinen Betrag zahlen. Mehr Informationen gibt es auf der <a href="http://www.windowsazure.com/en-us/pricing/calculator/?scenario=web">Pricing Seite</a>.</p>
<p><strong>Kann man das Git-Deployment für seinen eigenen IIS nutzen?</strong></p>
<p>Ja! Das Git-Deployment auf Azure wird von “Kudu” gemanaged, welches auf <a href="https://github.com/projectkudu/kudu">GitHub zur Verfügung steht</a> – samt einem recht großen <a href="https://github.com/projectkudu/kudu/wiki">Wiki</a>.</p>
<img src="http://feeds.feedburner.com/~r/Code-insideBlog/~4/_Oo8u14z62M" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://code-inside.de/blog/2013/03/02/windows-azure-websites-git-hosting-deployment-leicht-gemacht/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://code-inside.de/blog/2013/03/02/windows-azure-websites-git-hosting-deployment-leicht-gemacht/</feedburner:origLink></item>
		<item>
		<title>Visual Studio Tools in der PowerShell nutzen</title>
		<link>http://feedproxy.google.com/~r/Code-insideBlog/~3/pT1znFxP4Og/</link>
		<comments>http://code-inside.de/blog/2013/02/11/visual-studio-tools-in-der-powershell-nutzen/#comments</comments>
		<pubDate>Mon, 11 Feb 2013 21:17:35 +0000</pubDate>
		<dc:creator>Robert Mühsig</dc:creator>
				<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Powershell]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://code-inside.de/blog/?p=4976</guid>
		<description><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1772-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div>Da ich in lezter Zeit immer häufiger auf die Powershell zugegriffen hab und es mich immer gestört hat, dass die Visual Studio Tools wie sn.exe oder msbuild.exe nur über die “Developer Command Prompt” aufrufbar waren (ohne den kompletten Pfad anzugeben) habe ich mal nach der Lösung gegoogelt. Was macht die Developer Command Prompt? Der Shortcut ...]]></description>
			<content:encoded><![CDATA[<div><img width="150" height="150" src="http://code-inside.de/blog/wp-content/uploads/image1772-150x150.png" class="attachment-thumbnail wp-post-image" alt="image.png" title="image.png" style="margin-bottom: 15px;" /></div><p>Da ich in lezter Zeit immer häufiger auf die Powershell zugegriffen hab und es mich immer gestört hat, dass die Visual Studio Tools wie sn.exe oder msbuild.exe nur über die “Developer Command Prompt” aufrufbar waren (ohne den kompletten Pfad anzugeben) habe ich mal nach der Lösung gegoogelt.</p>
<p><strong>Was macht die Developer Command Prompt?</strong></p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1771.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb925.png" width="432" height="171"></a>Der Shortcut ruft eigentlich die Batch Datei “VsDevCmd.bat” auf, welche diverse Umgebungsvariablen setzt.</p>
<p>Die Datei ist unter diesem Pfad zu finden:</p>
<p><em>C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools</em></p>
<p><strong>Ein Profile.ps1 anlegen</strong></p>
<p>Um in jeder Powershell Session auf diese Funktionalität zuzugreifen kann man ein <a href="http://technet.microsoft.com/en-us/library/ee692764.aspx">Profil anlegen.</a>&nbsp;</p>
<p>Dazu legt man einen “WindowsPowershell” Ordner hier an:</p>
<p><em>C:\Users\USERNAME\Documents</em></p>
<p>Im WindowsPowershell Ordner legt man eine Profile.ps1 Datei an. Diese wird ab sofort bei jeder Powershell Session automatisch ausgeführt</p>
<p><strong>Visual Studio Tools in der Powershell registrieren (und noch mehr)</strong></p>
<p>Durch ein Link von dem <a href="http://stackoverflow.com/questions/138144/whats-in-your-powershell-profile-ps1file">Stackoverflow Threads</a> bin ich auf diesen <a href="http://www.tavaresstudios.com/Blog/post/The-last-vsvars32ps1-Ill-ever-need.aspx">Blog</a> gekommen. Zudem habe ich noch ein paar <a href="http://thomasfreudenberg.com/">Anregungen von Thomas Freudenberg</a> übernommen, da <a href="https://gist.github.com/thoemmi/3720721">er sein Powershell Profile hier veröffentlicht</a> hat. Heraus gekommen ist dies:</p>
<pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">###############################################################################
# Profile PS1 based on this samples:
# http://stackoverflow.com/questions/138144/whats-in-your-powershell-profile-ps1file
# http://www.tavaresstudios.com/Blog/post/The-last-vsvars32ps1-Ill-ever-need.aspx
# Place this file in: C:\Users\ACCNAME\Documents\WindowsPowerShell\profile.ps1
# https://gist.github.com/thoemmi/3720721
###############################################################################
# red background if running elevated
###############################################################################

&amp; {
 $wid=[System.Security.Principal.WindowsIdentity]::GetCurrent()
 $prp=new-object System.Security.Principal.WindowsPrincipal($wid)
 $adm=[System.Security.Principal.WindowsBuiltInRole]::Administrator
 $IsAdmin=$prp.IsInRole($adm)
 if ($IsAdmin)
 {
  (get-host).UI.RawUI.Backgroundcolor="DarkRed"
  clear-host
 }
}

###############################################################################
# Exposes the environment vars in a batch and sets them in this PS session
###############################################################################
function Get-Batchfile($file)
{
    $theCmd = "`"$file`" &amp; set"
    cmd /c $theCmd | Foreach-Object {
        $thePath, $theValue = $_.split('=')
        Set-Item -path env:$thePath -value $theValue
    }
}

###############################################################################
# Sets the VS variables for this PS session to use (for VS 2012)
###############################################################################
function VsVars32($version = "11.0")
{
	# 64bit Key in Registry
    $theKey = "HKLM:SOFTWARE\Wow6432Node\Microsoft\VisualStudio\" + $version
    $theVsKey = get-ItemProperty $theKey
    $theVsInstallPath = [System.IO.Path]::GetDirectoryName($theVsKey.InstallDir)
    $theVsToolsDir = [System.IO.Path]::GetDirectoryName($theVsInstallPath)
    $theVsToolsDir = [System.IO.Path]::Combine($theVsToolsDir, "Tools")
    $theBatchFile = [System.IO.Path]::Combine($theVsToolsDir, "vsvars32.bat")
    Get-Batchfile $theBatchFile
    [System.Console]::Title = "Visual Studio " + $version + " Windows Powershell"

	Write-Host "[Profile.ps1] Visual Studio 2012 CMD Commands set" -Foreground Green
}

function SetupPowershellHistory() {
	$profileFolder = split-path $profile

	# save last 100 history items on exit
	$historyPath = Join-Path $profileFolder history.clixml

	# hook powershell's exiting event &amp; hide the registration with -supportevent.
	Register-EngineEvent -SourceIdentifier powershell.exiting -SupportEvent -Action {
		Get-History -Count 100 | Export-Clixml (Join-Path (split-path $profile) history.clixml) }

	# load previous history, if it exists
	if ((Test-Path $historyPath)) {
		Import-Clixml $historyPath | ? {$count++;$true} | Add-History
		Write-Host "[Profile.ps1] Loaded $count history item(s)" -Foreground Green
	}
}

###############################################################################
# Execute
###############################################################################
Write-Host "[Custom Profile.ps1 invoked]"

# VS
VsVars32

# History
SetupPowershellHistory

Write-Host "[Custom Profile.ps1 finished]"</pre>
<p>Damit habe ich in jeder Powershell Session die Visual Studio Tools dabei sowie die letzten 100 Befehle die ich eingetippt hab (was ziemlich cool ist).</p>
<p><a href="http://code-inside.de/blog/wp-content/uploads/image1772.png"><img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://code-inside.de/blog/wp-content/uploads/image_thumb926.png" width="591" height="440"></a> </p>
<p><strong>Was ist der Unteschied zwischen Profile.ps1 und Microsoft.Powershell_Profile.ps1?</strong></p>
<p>Wer nur ein “Profile.ps1” ablegt, der hat die Funktionalität in allen Powershell Hosts zur Verfügung – d.h. auch z.B. im NuGet Package Manager. Wer es nur von der Windows Powershell benötigt, der kann ein Microsoft.Powershell_profile.ps1 anlegen.</p>
<p><strong>Sourcen</strong></p>
<p>Das ganze ist natürlich <a href="https://github.com/Code-Inside/Configs/blob/master/profile.ps1">auch auf GitHub zu finden</a>. Wer noch Anregung hat, kann gern auch ein Pull Request machen <img src='http://code-inside.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<img src="http://feeds.feedburner.com/~r/Code-insideBlog/~4/pT1znFxP4Og" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://code-inside.de/blog/2013/02/11/visual-studio-tools-in-der-powershell-nutzen/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://code-inside.de/blog/2013/02/11/visual-studio-tools-in-der-powershell-nutzen/</feedburner:origLink></item>
	</channel>
</rss>
