<?xml version="1.0" encoding="ISO-8859-1"?>
<?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:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Scott Seely's Blog</title>
    <description>Scott is a developer and an architect. This blog chronicles the shiny baubles in the development world that have his attention right now.</description>
    <link>http://www.scottseely.com/Blog.aspx</link>
    <docs>http://backend.userland.com/rss</docs>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/ScottSeelysBlog" /><feedburner:info uri="scottseelysblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>42.410687</geo:lat><geo:long>-88.054626</geo:long><creativeCommons:license>http://creativecommons.org/licenses/by-nd/2.0/</creativeCommons:license><item>
      <title>Validating a WRAP ACS token in node.js</title>
      <description>&lt;p&gt;A few friends and I are building a system for home automation. Specifically, it is an application that opens and closes a garage door. One of the design decisions was to write the server side in node.js but to use Azure when it made sense. One of the Azure features we are using is the Access Control Service. When a client presents a token, you need to make sure that the signature on that token is valid. That turns out to be fairly interesting if you are new to node.js and have never used it before. I fit that model well. After a lot of tinkering and learning, I was able to write a function that validated a wrap_access_token using node.js and some associated, standard libraries. Here is the code, in its entirety. I include some 'test' code as well to allow others to verify results. I've already rotated the ACS signing key so that I don't breach security too badly&lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://www.scottseely.com/Libraries/MetaBlogLib/Windows-Live-Writer-wlEmoticon-smile_2.sflb" /&gt; This whole thing works surprisingly well.&lt;/p&gt;  &lt;p&gt;In case you can't read the code too well, here is what it does:&lt;/p&gt;  &lt;p&gt;1. Parse the token into it's constituent parts.&lt;/p&gt;  &lt;p&gt;2. Pass the wrap_access_token to the function, along with the associated key.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Within the function:&lt;/p&gt;  &lt;p&gt;1. Remove the signature part from the token since we need to verify that we generate the same signature. Since the signature is generated based on the bytes that precede it, the signature can't be part of itself (this part is obvious when you think of it; the hard part is remembering to think of it!)&lt;/p&gt;  &lt;p&gt;2. Unescape the signature and remember the base64 version of the signature, which is really just a byte array.&lt;/p&gt;  &lt;p&gt;3. Generate the SHA256 HMAC signature using the shared secret/key.&lt;/p&gt;  &lt;p&gt;4. Verify that the base64 encoding of the digest that we generated matches the one that was sent it.&lt;/p&gt;  &lt;p&gt;5. If the signature passed in matches the one we generated, then the other entity knows the secret and can be trusted to have signed the tokens. &lt;/p&gt;  &lt;p&gt;6. Party on, because the claims are valid. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;The code would next need to split out the claims. The claims are just form-encoded key value pairs within the wrap_access_token. That step is left as an exercise for the reader.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;var crypto = require('crypto');   &lt;br /&gt;var util = require('util');    &lt;br /&gt;var querystring = require('querystring');    &lt;br /&gt;var buffer = require('buffer');&lt;/p&gt;  &lt;p&gt;function ValidateToken(token, key){   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; var hmacToken = &amp;quot;&amp;amp;HMACSHA256=&amp;quot;;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; var indexOfToken = token.indexOf(hmacToken) + hmacToken.length;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; var swtSignature = querystring.unescape(token.substr(indexOfToken, token.length - indexOfToken));    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; var signedPiece = token.substr(0, indexOfToken - hmacToken.length);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; var buffer = new Buffer(key, encoding=&amp;quot;base64&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; var hmac = crypto.createHmac(&amp;quot;sha256&amp;quot;, buffer);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; hmac.update(signedPiece);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; var digest = hmac.digest(encoding=&amp;quot;base64&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; return digest == swtSignature;    &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;var theToken = &amp;quot;wrap_access_token=developersmackdown.garage%3dOpenClose%26http%253a%252f%252fschemas.microsoft.com%252faccesscontrolservice%252f2010%252f07%252fclaims%252fidentityprovider%3dhttps%253a%252f%252ffriseton.accesscontrol.windows.net%252f%26Audience%3dhttp%253a%252f%252fcontosocontacts%252f%26ExpiresOn%3d1325287532%26Issuer%3dhttps%253a%252f%252ffriseton.accesscontrol.windows.net%252f%26HMACSHA256%3dSrgqXJv9pkxjweT2Lr%252bIV%252fGAncqIc34SnbrHdbr3VOQ%253d&amp;amp;wrap_access_token_expires_in=5999&amp;quot;;   &lt;br /&gt;var theData = querystring.parse(theToken, sep='&amp;amp;', eq='=');    &lt;br /&gt;var theKey = &amp;quot;Bn7TfLML5wK+R5TAa2VrO/9JANwuk3lzt/ykc4no+h0=&amp;quot;;&lt;/p&gt;  &lt;p&gt;util.puts(ValidateToken(theData.wrap_access_token, theKey));&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/IbrbYCIWqbgFiRmkpI5xLlDEp-s/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IbrbYCIWqbgFiRmkpI5xLlDEp-s/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/IbrbYCIWqbgFiRmkpI5xLlDEp-s/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IbrbYCIWqbgFiRmkpI5xLlDEp-s/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=aimHb4Xi828:25iV7CTWqNU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=aimHb4Xi828:25iV7CTWqNU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=aimHb4Xi828:25iV7CTWqNU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=aimHb4Xi828:25iV7CTWqNU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=aimHb4Xi828:25iV7CTWqNU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=aimHb4Xi828:25iV7CTWqNU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=aimHb4Xi828:25iV7CTWqNU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=aimHb4Xi828:25iV7CTWqNU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=aimHb4Xi828:25iV7CTWqNU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottSeelysBlog/~4/aimHb4Xi828" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ScottSeelysBlog/~3/aimHb4Xi828/Validating_a_WRAP_ACS_token_in_node_js.aspx</link>
      <author>scott.seely@friseton.com (Scott Seely)</author>
      <comments>http://www.scottseely.com/Blog/12-01-02/Validating_a_WRAP_ACS_token_in_node_js.aspx</comments>
      <guid isPermaLink="false">3ea0cc10-79ac-4fea-913e-c9657f66db23</guid>
      <pubDate>Mon, 02 Jan 2012 20:00:48 GMT</pubDate>
    <feedburner:origLink>http://www.scottseely.com/Blog/12-01-02/Validating_a_WRAP_ACS_token_in_node_js.aspx</feedburner:origLink></item>
    <item>
      <title>REST Presentation at Chicago Software Development Community in Oakbrook</title>
      <description>&lt;p&gt;Thanks again to everyone who showed up for my presentation on REST at the Microsoft Store in Oakbrook. I've posted the slides and demos &lt;a href="https://friseton.blob.core.windows.net/downloads/ChicagoUserGroup2011-11-06.zip"&gt;here&lt;/a&gt;. It was a great time. I've never presented in a store, never had a component of the "audience" that was just shopping either. It was an interesting, unique experience to say the least! I also enjoyed the conversations afterwards.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/CjyKQUfuFNOND2Swn3qdZaCvoZ8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CjyKQUfuFNOND2Swn3qdZaCvoZ8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/CjyKQUfuFNOND2Swn3qdZaCvoZ8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CjyKQUfuFNOND2Swn3qdZaCvoZ8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=0xx3_p7kbKA:9XI6BqK5VHw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=0xx3_p7kbKA:9XI6BqK5VHw:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=0xx3_p7kbKA:9XI6BqK5VHw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=0xx3_p7kbKA:9XI6BqK5VHw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=0xx3_p7kbKA:9XI6BqK5VHw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=0xx3_p7kbKA:9XI6BqK5VHw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=0xx3_p7kbKA:9XI6BqK5VHw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=0xx3_p7kbKA:9XI6BqK5VHw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=0xx3_p7kbKA:9XI6BqK5VHw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottSeelysBlog/~4/0xx3_p7kbKA" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ScottSeelysBlog/~3/0xx3_p7kbKA/REST_Presentation_at_Chicago_Software_Development_Community_in_Oakbrook.aspx</link>
      <author>scott.seely@friseton.com (Scott Seely)</author>
      <comments>http://www.scottseely.com/Blog/11-11-07/REST_Presentation_at_Chicago_Software_Development_Community_in_Oakbrook.aspx</comments>
      <guid isPermaLink="false">44f3c106-d139-44e2-8de4-b21eaa21b26b</guid>
      <pubDate>Mon, 07 Nov 2011 08:53:16 GMT</pubDate>
    <feedburner:origLink>http://www.scottseely.com/Blog/11-11-07/REST_Presentation_at_Chicago_Software_Development_Community_in_Oakbrook.aspx</feedburner:origLink></item>
    <item>
      <title>My Windows Azure Caching Service talk from DevConnections</title>
      <description>&lt;p&gt;I just presented my Windows Azure Caching Service talk. Thanks to everyone who attended. The audience was small, but I love that you all asked so many great questions. Here are the slides and demos from the talk. I'll be giving this talk again at the Midwest Cloud Computing User Group in the Chicago area on November 15. You can register for it at &lt;a title="http://www.communitymegaphone.com/ShowEvent.aspx?EventID=4709" href="http://www.communitymegaphone.com/ShowEvent.aspx?EventID=4709"&gt;http://www.communitymegaphone.com/ShowEvent.aspx?EventID=4709&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;The slides and demos from the content at DevConnections is &lt;a href="https://friseton.blob.core.windows.net/downloads/AzureConnections.zip"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xPK3Hexi4dvFKH1paN-pYNCcb5E/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xPK3Hexi4dvFKH1paN-pYNCcb5E/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/xPK3Hexi4dvFKH1paN-pYNCcb5E/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xPK3Hexi4dvFKH1paN-pYNCcb5E/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=C2r4RhNQzlA:-4MtesPUzX4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=C2r4RhNQzlA:-4MtesPUzX4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=C2r4RhNQzlA:-4MtesPUzX4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=C2r4RhNQzlA:-4MtesPUzX4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=C2r4RhNQzlA:-4MtesPUzX4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=C2r4RhNQzlA:-4MtesPUzX4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=C2r4RhNQzlA:-4MtesPUzX4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=C2r4RhNQzlA:-4MtesPUzX4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=C2r4RhNQzlA:-4MtesPUzX4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottSeelysBlog/~4/C2r4RhNQzlA" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ScottSeelysBlog/~3/C2r4RhNQzlA/My_Windows_Azure_Caching_Service_talk_from_DevConnections.aspx</link>
      <author>scott.seely@friseton.com (Scott Seely)</author>
      <comments>http://www.scottseely.com/Blog/11-11-02/My_Windows_Azure_Caching_Service_talk_from_DevConnections.aspx</comments>
      <guid isPermaLink="false">16607a62-e8ed-403f-9661-4e9b351d2be9</guid>
      <pubDate>Wed, 02 Nov 2011 20:30:43 GMT</pubDate>
    <feedburner:origLink>http://www.scottseely.com/Blog/11-11-02/My_Windows_Azure_Caching_Service_talk_from_DevConnections.aspx</feedburner:origLink></item>
    <item>
      <title>Talk and demos from CNUG, AppFabric Talk</title>
      <description>&lt;p&gt;Last night I had a chance to speak about Windows Azure AppFabric at the &lt;a shape="rect" href="http://www.cnug.org"&gt;Chicago .NET Users' Group&lt;/a&gt;. Thanks to everyone who came out! I had a great time. A few of you really wanted the slides ASAP. I've cleaned out my keys and namespaces from the demos, so they don't run at the moment (but they will build!). You can get them here: &lt;a shape="rect" href="https://friseton.blob.core.windows.net/downloads/CNUG-AppFabric-2011-07-20.zip"&gt;https://friseton.blob.core.windows.net/downloads/CNUG-AppFabric-2011-07-20.zip&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;You'll need to install a few things and create a few accounts if you want to run any of the demos:&lt;/p&gt; &lt;p&gt;Tools:&lt;/p&gt; &lt;p&gt;1. Getting started links for Windows Azure: &lt;a shape="rect" href="http://www.microsoft.com/windowsazure/learn/getstarted/" originalPath="http://www.microsoft.com/windowsazure/learn/getstarted/" originalAttribute="href"&gt;http://www.microsoft.com/windowsazure/learn/getstarted/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;2. Windows Azure AppFabric SDK 1.0: &lt;a shape="rect" href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=19925"&gt;http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=19925&lt;/a&gt; (for production AppFabric)&lt;/p&gt; &lt;p&gt;3. Windows Azure AppFabric SDK 2.0: &lt;a shape="rect" href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=17691"&gt;http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=17691&lt;/a&gt; (for the CTP bits: queues, topics, etc.)&lt;/p&gt; &lt;p&gt;4. More training on Windows Azure: &lt;a shape="rect" href="https://www.pluralsight-training.net/microsoft/OLT/subscribe/Subscribe1.aspx?freetrial=true&amp;amp;planHint=Monthly"&gt;https://www.pluralsight-training.net/microsoft/OLT/subscribe/Subscribe1.aspx?freetrial=true&amp;amp;planHint=Monthly&lt;/a&gt; (10 day free trial-- totally worth it, but I am an instructor there too;) )&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/KmKVNDfOnETnQ_YZtCrITC2lRek/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KmKVNDfOnETnQ_YZtCrITC2lRek/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/KmKVNDfOnETnQ_YZtCrITC2lRek/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KmKVNDfOnETnQ_YZtCrITC2lRek/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=zTC30bgd49c:aM8Sz8OrxmM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=zTC30bgd49c:aM8Sz8OrxmM:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=zTC30bgd49c:aM8Sz8OrxmM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=zTC30bgd49c:aM8Sz8OrxmM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=zTC30bgd49c:aM8Sz8OrxmM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=zTC30bgd49c:aM8Sz8OrxmM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=zTC30bgd49c:aM8Sz8OrxmM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=zTC30bgd49c:aM8Sz8OrxmM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=zTC30bgd49c:aM8Sz8OrxmM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottSeelysBlog/~4/zTC30bgd49c" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ScottSeelysBlog/~3/zTC30bgd49c/Talk_and_demos_from_CNUG_AppFabric_Talk.aspx</link>
      <author>scott.seely@friseton.com (Scott Seely)</author>
      <comments>http://www.scottseely.com/Blog/11-07-21/Talk_and_demos_from_CNUG_AppFabric_Talk.aspx</comments>
      <guid isPermaLink="false">a6c4974b-caff-4acd-a100-6c16ed6c62ba</guid>
      <pubDate>Thu, 21 Jul 2011 09:22:48 GMT</pubDate>
    <feedburner:origLink>http://www.scottseely.com/Blog/11-07-21/Talk_and_demos_from_CNUG_AppFabric_Talk.aspx</feedburner:origLink></item>
    <item>
      <title>AppFabricLabs and the ServiceBus</title>
      <description>&lt;p&gt;This week, the Windows Azure AppFabricLabs was updated. The major updates are that the Service Bus labs environment now uses v2 of the Access Control Service and topics/queues have been created. This pushes the number of queueing solutions on Azure to 3:&lt;/p&gt;  &lt;p&gt;* Queue Storage&lt;/p&gt;  &lt;p&gt;* Message Buffer&lt;/p&gt;  &lt;p&gt;* Queues&lt;/p&gt;  &lt;p&gt;The main difference between the types of storage relates to size and usage patterns. Queue storage allows for messages up to 8 KB in size and is primarily intended for applications running on Azure. The service only accepts one type of credentials, and you probably don't want to share those.&lt;/p&gt;  &lt;p&gt;The Message Buffer stores messages of up to 60KB for about a minute. It is great for volatile queues as a short lived rendezvous point for exchanging messages. This service lives on the Service Bus and allows for authentication with the Access Control Service.&lt;/p&gt;  &lt;p&gt;The Queues implementation in the Service Bus allows for larger messages (up to 256 KB) which can last for a longer period of time. Interacting with the queue feature is pretty simple. Go to the &lt;a href="https://portal.appfabriclabs.com"&gt;https://portal.appfabriclabs.com&lt;/a&gt; page and allocate a Service Bus namespace. The 'Hello, World' for the queue looks like this:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;static void &lt;/span&gt;Main(&lt;span style="color: blue"&gt;string&lt;/span&gt;[] args)
{
  &lt;span style="color: blue"&gt;var &lt;/span&gt;sbNamespace = &lt;span style="color: #a31515"&gt;&amp;quot;your namespace&amp;quot;&lt;/span&gt;;
  &lt;span style="color: blue"&gt;var &lt;/span&gt;credential = &lt;span style="color: #2b91af"&gt;TransportClientCredentialBase&lt;/span&gt;.&lt;/pre&gt;

&lt;pre class="code"&gt;    CreateSharedSecretCredential(&lt;span style="color: #a31515"&gt;&amp;quot;owner&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;[your key]&amp;quot;&lt;/span&gt;);
  &lt;span style="color: blue"&gt;var &lt;/span&gt;uri = &lt;span style="color: #2b91af"&gt;ServiceBusEnvironment&lt;/span&gt;.CreateServiceUri(&lt;span style="color: #a31515"&gt;&amp;quot;https&amp;quot;&lt;/span&gt;, sbNamespace, &lt;/pre&gt;

&lt;pre class="code"&gt;    &lt;span style="color: blue"&gt;string&lt;/span&gt;.Empty);
  &lt;span style="color: blue"&gt;var &lt;/span&gt;client = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ServiceBusNamespaceClient&lt;/span&gt;(uri, credential);
  &lt;span style="color: blue"&gt;var &lt;/span&gt;messagingFactory =
    &lt;span style="color: #2b91af"&gt;MessagingFactory&lt;/span&gt;.Create(&lt;span style="color: #2b91af"&gt;ServiceBusEnvironment&lt;/span&gt;.CreateServiceUri(&lt;span style="color: #a31515"&gt;&amp;quot;sb&amp;quot;&lt;/span&gt;, &lt;/pre&gt;

&lt;pre class="code"&gt;    sbNamespace, &lt;span style="color: blue"&gt;string&lt;/span&gt;.Empty), credential);
  &lt;span style="color: blue"&gt;var &lt;/span&gt;queue = client.CreateQueue(&lt;span style="color: #a31515"&gt;&amp;quot;demo&amp;quot;&lt;/span&gt;);
  &lt;span style="color: blue"&gt;var &lt;/span&gt;queueClient = messagingFactory.CreateQueueClient(queue);
  &lt;span style="color: blue"&gt;var &lt;/span&gt;sender = queueClient.CreateSender();
  sender.Open();
  sender.Send(&lt;span style="color: #2b91af"&gt;BrokeredMessage&lt;/span&gt;.CreateMessage(&lt;span style="color: #a31515"&gt;&amp;quot;test&amp;quot;&lt;/span&gt;));
  sender.Close();
  &lt;span style="color: blue"&gt;var &lt;/span&gt;receiver = queueClient.CreateReceiver();
  receiver.Open();
  &lt;span style="color: blue"&gt;var &lt;/span&gt;message = receiver.Receive();
  receiver.Close();
  &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(message.GetBody&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;());
}&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/H9hY6634Au9KtydPqGMAysrIT88/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/H9hY6634Au9KtydPqGMAysrIT88/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/H9hY6634Au9KtydPqGMAysrIT88/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/H9hY6634Au9KtydPqGMAysrIT88/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=1Keo_sf1lTs:0kDnb2QwvrU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=1Keo_sf1lTs:0kDnb2QwvrU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=1Keo_sf1lTs:0kDnb2QwvrU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=1Keo_sf1lTs:0kDnb2QwvrU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=1Keo_sf1lTs:0kDnb2QwvrU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=1Keo_sf1lTs:0kDnb2QwvrU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=1Keo_sf1lTs:0kDnb2QwvrU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=1Keo_sf1lTs:0kDnb2QwvrU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=1Keo_sf1lTs:0kDnb2QwvrU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottSeelysBlog/~4/1Keo_sf1lTs" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ScottSeelysBlog/~3/1Keo_sf1lTs/AppFabricLabs_and_the_ServiceBus.aspx</link>
      <author>scott.seely@friseton.com (Scott Seely)</author>
      <comments>http://www.scottseely.com/Blog/11-05-20/AppFabricLabs_and_the_ServiceBus.aspx</comments>
      <guid isPermaLink="false">2d9a00a0-da50-460b-a02d-1478d68939e7</guid>
      <pubDate>Fri, 20 May 2011 05:00:00 GMT</pubDate>
    <feedburner:origLink>http://www.scottseely.com/Blog/11-05-20/AppFabricLabs_and_the_ServiceBus.aspx</feedburner:origLink></item>
    <item>
      <title>Integrating with the Camera in WP7</title>
      <description>&lt;p&gt;There has been a small white lie that many people tell when looking at whether or not a WP7 application can directly interact with the camera. The fib looks like this:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;You can only access the camera through the CaptureCameraTask. Direct access is not allowed.&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;It didn't seem right when I heard that, so I did some digging around, looking for ways to find out what is really contained in the phone. Some information is out there, and if you assemble the parts, you wind up with a better view into what managed code can do on the phone. I wrote a post &lt;a href="http://www.scottseely.com/blog/11-05-08/Adding_the_lsquo_other_rsquo_WP7_Libraries_to_your_VS_2010.aspx"&gt;earlier&lt;/a&gt; that showed what you need to do in order to make your development environment work better. As a result of that effort, you are going to be able to use the camera in your Windows Phone 7 applications today. &lt;/p&gt;    &lt;p&gt;Adding live support for a phone is actually pretty easy. You just need to add some references to the right assemblies, add a little markup to your page, and then write a few lines of code.&lt;/p&gt;    &lt;h3&gt;References&lt;/h3&gt;    &lt;p&gt;Go ahead and create a WP7 XAML app. Once you do that, you need to add references to two assemblies that aren't standard issue:&lt;/p&gt;    &lt;p&gt;* Microsoft.Phone.InteropServices&lt;/p&gt;    &lt;p&gt;* Microsoft.Phone.Media.Extended&lt;/p&gt;    &lt;p&gt;Why two assemblies? The first one allows you to work with the second one-nothing more. &lt;/p&gt;    &lt;h3&gt;Add some markup to display the camera&lt;/h3&gt;    &lt;p&gt;To work with the camera, live, here is what you do:&lt;/p&gt;    &lt;p&gt;1. Add a reference to the Microsoft.Phone.Media.Extended to the page you want to display the camera output to. For example, add the following to the PhoneApplicationPage element:&lt;/p&gt;    &lt;pre class="code"&gt;&lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;media&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;quot;clr-namespace:Microsoft.Phone;assembly=Microsoft.Phone.Media.Extended&amp;quot;
&lt;/span&gt;&lt;/pre&gt;

  

  &lt;p&gt;2. With that in place, you can then put a CameraVisualizer on to your page. A CameraVisualizer displays the content of a camera on to a surface. &lt;/p&gt;

  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;media&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;CameraVisualizer &lt;/span&gt;&lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;cameraVisualizer&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;Visibility&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Visible&amp;quot; &lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;    &lt;/span&gt;&lt;span style="color: red"&gt;Margin&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;64,4,99,26&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;Height&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;426&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;Width&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;593&amp;quot; /&amp;gt;
&lt;/span&gt;&lt;/pre&gt;

  &lt;h3&gt;Hook up the Camera to the Page&lt;/h3&gt;

  &lt;p&gt;In your page's code behind, add a Microsoft.Phone.PhotoCamera and attach it to the CameraVisualizer. You do that by calling SetSource on the visualizer. The code looks like this:&lt;/p&gt;

  &lt;pre&gt;cameraVisualizer.SetSource(_camera);&lt;/pre&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;h3&gt;Doing something with the Camera&lt;/h3&gt;

  &lt;p&gt;From there, you can access methods telling you what is going on with the camera:&lt;/p&gt;

  &lt;p&gt;* ShutterPressed: Fires when someone presses the camera button.&lt;/p&gt;

  &lt;p&gt;* ImageSavedToDisk: Fires when the image you just took is saved to disk, passing along the path to the file.&lt;/p&gt;

  &lt;p&gt;* ThumbnailSavedToDisk: Fires when the thumbnail is saved. This one also has the image path.&lt;/p&gt;

  &lt;p&gt;When the shutter is pressed, you still need to tell the camera to take the picture. To do this, fire the CaptureImage method on the PhotoCamera instance. You can also do some cool things like set the flash setting, zoom level, and auto focus.&lt;/p&gt;

  &lt;p&gt;There are a few gotchas with the camera that do make it difficult to work with and show why it wasn't available to all of us when the phone launched. First off, any time you use the control just a little bit 'incorrectly', you will see a COM exception. Second, any time that the visualizer goes off screen then back again, you need to detach any events, then hook them back up again or you will have a bad experience for your users. If you do not handle the pictures being taken in quick succession, you will have issues. &lt;/p&gt;

  &lt;p&gt;I invite you to play with the camera but be warned-it is a nasty beast to work with and you will spend quite a few cycles fixing weird little bugs. Microsoft never made a general release of this code because the code needed more QA before burning any cycles documenting the feature. They've already announced it will be in better shape for Mango, but if you want to use it now, I've given you enough rope. Have some fun (and don't hang yourself)!!!&lt;/p&gt;

  &lt;p&gt;Thanks to &lt;a href="http://www.wintellect.com/cs/blogs/jprosise/default.aspx"&gt;Jeff Prosise&lt;/a&gt; for encouraging me to talk about this. We were chatting in late April at a conference when I was having some fun with a WP7 camera app I had written and he said he wanted to know how I did that.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/o0muzskEBmANEFf5nkRuZ4FTfdY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/o0muzskEBmANEFf5nkRuZ4FTfdY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/o0muzskEBmANEFf5nkRuZ4FTfdY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/o0muzskEBmANEFf5nkRuZ4FTfdY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=cLKmKR4MXPI:mbAK3m0UOk0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=cLKmKR4MXPI:mbAK3m0UOk0:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=cLKmKR4MXPI:mbAK3m0UOk0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=cLKmKR4MXPI:mbAK3m0UOk0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=cLKmKR4MXPI:mbAK3m0UOk0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=cLKmKR4MXPI:mbAK3m0UOk0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=cLKmKR4MXPI:mbAK3m0UOk0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=cLKmKR4MXPI:mbAK3m0UOk0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=cLKmKR4MXPI:mbAK3m0UOk0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottSeelysBlog/~4/cLKmKR4MXPI" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ScottSeelysBlog/~3/cLKmKR4MXPI/Integrating_with_the_Camera_in_WP7.aspx</link>
      <author>scott.seely@friseton.com (Scott Seely)</author>
      <comments>http://www.scottseely.com/Blog/11-05-16/Integrating_with_the_Camera_in_WP7.aspx</comments>
      <guid isPermaLink="false">585eb978-c165-4cc5-8fa4-da2e688e45ac</guid>
      <pubDate>Mon, 16 May 2011 22:06:42 GMT</pubDate>
    <feedburner:origLink>http://www.scottseely.com/Blog/11-05-16/Integrating_with_the_Camera_in_WP7.aspx</feedburner:origLink></item>
    <item>
      <title>The Windows Azure AppFabric CTP For May has Shipped</title>
      <description>&lt;p&gt;The May 2011 AppFabric updates have shipped. You can get them all from here: &lt;a title="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=d89640fc-c552-446e-aead-b1e0d940f31b" href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=d89640fc-c552-446e-aead-b1e0d940f31b"&gt;http://www.microsoft.com/downloads/en/details.aspx?FamilyID=d89640fc-c552-446e-aead-b1e0d940f31b&lt;/a&gt;. Coverage is exploding over at TechEd, Clemens Vasters can finally talk about topics, and it's a grand day. So, many of you will be digging into the source and will want a CHM file that works. The that you download will be blocked from showing Internet content and when you open it, you will see something like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.scottseely.com/Libraries/MetaBlogLib/Windows-Live-Writer-The-Windows-Azure-AppFabric-CTP-For-May-_117EA-image_2.sflb"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.scottseely.com/Libraries/MetaBlogLib/Windows-Live-Writer-The-Windows-Azure-AppFabric-CTP-For-May-_117EA-image_thumb.sflb" width="500" height="409" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;If you do see that 'Navigation to the webpage.' message, here is what you'll need to do. &lt;/p&gt;  &lt;p&gt;1. Right-click on the CHM file and select 'properties'.&lt;/p&gt;  &lt;p&gt;2. On the General tab, there is a button WAAAAAAYYYYYYY at the bottom labeled &lt;em&gt;Unblock&lt;/em&gt;. Click that button so that the content from the Internet will display just fine on your PC.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.scottseely.com/Libraries/MetaBlogLib/Windows-Live-Writer-The-Windows-Azure-AppFabric-CTP-For-May-_117EA-SNAGHTML24f3d3a.sflb"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="SNAGHTML24f3d3a" border="0" alt="SNAGHTML24f3d3a" src="http://www.scottseely.com/Libraries/MetaBlogLib/Windows-Live-Writer-The-Windows-Azure-AppFabric-CTP-For-May-_117EA-SNAGHTML24f3d3a_thumb.sflb" width="328" height="445" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;3. Reopen the CHM and you'll be able to actually view things. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/3nK792uB4nW6UcPtpJ05pXl_E2M/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3nK792uB4nW6UcPtpJ05pXl_E2M/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/3nK792uB4nW6UcPtpJ05pXl_E2M/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3nK792uB4nW6UcPtpJ05pXl_E2M/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=XgJHV940f_4:C-UrRoxCJtU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=XgJHV940f_4:C-UrRoxCJtU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=XgJHV940f_4:C-UrRoxCJtU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=XgJHV940f_4:C-UrRoxCJtU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=XgJHV940f_4:C-UrRoxCJtU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=XgJHV940f_4:C-UrRoxCJtU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=XgJHV940f_4:C-UrRoxCJtU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=XgJHV940f_4:C-UrRoxCJtU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=XgJHV940f_4:C-UrRoxCJtU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottSeelysBlog/~4/XgJHV940f_4" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ScottSeelysBlog/~3/XgJHV940f_4/The_Windows_Azure_AppFabric_CTP_For_May_has_Shipped.aspx</link>
      <author>scott.seely@friseton.com (Scott Seely)</author>
      <comments>http://www.scottseely.com/Blog/11-05-16/The_Windows_Azure_AppFabric_CTP_For_May_has_Shipped.aspx</comments>
      <guid isPermaLink="false">db47c3b8-d467-4d0d-8606-92cbf20fd15f</guid>
      <pubDate>Mon, 16 May 2011 21:01:10 GMT</pubDate>
    <feedburner:origLink>http://www.scottseely.com/Blog/11-05-16/The_Windows_Azure_AppFabric_CTP_For_May_has_Shipped.aspx</feedburner:origLink></item>
    <item>
      <title>Adding the &amp;lsquo;other&amp;rsquo; WP7 Libraries to your VS 2010</title>
      <description>&lt;p&gt;&lt;font color="#ff0000" size="5"&gt;WARNING: Everything I'm sharing with you is unsupported. You may or may not be able to publish WP7 applications to the Marketplace using these features. The point behind this is to satisfy hackers. This does NOT modify your phone in any way-it just makes it easier to dig into what WP7 already does. If you use these undocumented features, Microsoft may later change these APIs your applications when they choose to document these features or remove them from a future image of your WP7 phone. Microsoft does not promise to keep these APIs alive between WP7 updates. Got it?&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;I was curious what goodies were on the phone but not available to everyone else. I knew that people had grabbed the OS image and pulled apart the files on it already, so I figured someone had probably hacked that part already. After some searching, I found this: &lt;a title="http://thounsell.co.uk/2010/11/avoiding-reflection-adding-the-interopservices-library-to-the-wp7-sdk/" href="http://thounsell.co.uk/2010/11/avoiding-reflection-adding-the-interopservices-library-to-the-wp7-sdk/"&gt;http://thounsell.co.uk/2010/11/avoiding-reflection-adding-the-interopservices-library-to-the-wp7-sdk/&lt;/a&gt;. The handy thing here is that Thomas Hounsell also dumped out all the libraries and gave a hint as to how to include these in our own applications. In there, you will find all sorts of goodies. The binaries he provides include EVERYTHING- documented and undocumented. I didn't see complete details on how to wire up the additional, undocumented bits. Here are my extra instructions:&lt;/p&gt;  &lt;p&gt;1. Unpack the binaries from &lt;a title="here" href="http://thounsell.co.uk/wp7/rtm-dotnet.7z"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;2. Copy the dlls to C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\Silverlight\v4.0    &lt;br /&gt;\Profile\WindowsPhone&lt;/p&gt;  &lt;p&gt;3. Run the following commands from a VS 2010 command prompt, running as administrator (line breaks are in the right place, so copy and paste from here should work):&lt;/p&gt; &lt;code&gt;move GAC_CustomMarshalers_v3_7_0_0_cneutral_1.dll CustomMarshalers.dll&lt;/code&gt;   &lt;br /&gt;&lt;code&gt;move GAC_Microsoft.Phone.InteropServices_v7_0_0_0_cneutral_1.dll Microsoft.Phone.InteropServices.dll&lt;/code&gt;   &lt;br /&gt;&lt;code&gt;move GAC_Microsoft.Phone.Media.Extended_v7_0_0_0_cneutral_1.dll Microsoft.Phone.Media.Extended.dll&lt;/code&gt;   &lt;br /&gt;&lt;code&gt;move GAC_Microsoft.ServiceModel.Channels.Mail.WindowsMobile_v3_7_0_0_cneutral_1.dll Microsoft.ServiceModel.Channels.Mail.WindowsMobile.dll&lt;/code&gt;   &lt;br /&gt;&lt;code&gt;move GAC_Microsoft.ServiceModel.Channels.Mail_v3_7_0_0_cneutral_1.dll Microsoft.ServiceModel.Channels.Mail.dll&lt;/code&gt;   &lt;br /&gt;&lt;code&gt;move GAC_Microsoft.VisualBasic.SR_v8_1_1_0_cneutral_1.dll Microsoft.VisualBasic.SR.dll&lt;/code&gt;   &lt;br /&gt;&lt;code&gt;move GAC_Microsoft.VisualBasic_v8_1_1_0_cneutral_1.dll Microsoft.VisualBasic.dll&lt;/code&gt;   &lt;br /&gt;&lt;code&gt;move GAC_System.Data.DataSetExtensions_v3_7_0_0_cneutral_1.dll System.Data.DataSetExtensions.dll&lt;/code&gt;   &lt;br /&gt;&lt;code&gt;move GAC_System.Data_v3_7_0_0_cneutral_1.dll System.Data.dll&lt;/code&gt;   &lt;br /&gt;&lt;code&gt;move GAC_System.Messaging_v3_7_0_0_cneutral_1.dll System.Messaging.dll&lt;/code&gt;   &lt;br /&gt;&lt;code&gt;move GAC_System.Net.IrDA_v3_7_0_0_cneutral_1.dll System.Net.IrDA.dll&lt;/code&gt;   &lt;br /&gt;&lt;code&gt;move GAC_System.SR_v3_7_0_0_cneutral_1.dll System.SR.dll&lt;/code&gt;   &lt;br /&gt;&lt;code&gt;move GAC_System.Web.Services_v3_7_0_0_cneutral_1.dll System.Web.Services.dll&lt;/code&gt;   &lt;br /&gt;&lt;code&gt;move GAC_System.Windows.debug.resources_v2_0_5_0_cen-US_1.dll System.Windows.debug.resources.dll&lt;/code&gt;   &lt;br /&gt;&lt;code&gt;move GAC_System.Windows.RuntimeHost_v2_0_5_0_cneutral_1.dll System.Windows.RuntimeHost.dll&lt;/code&gt;   &lt;br /&gt;&lt;code&gt;sn -Vr CustomMarshalers.dll&lt;/code&gt;   &lt;br /&gt;&lt;code&gt;sn -Vr Microsoft.Phone.Interop.dll&lt;/code&gt;   &lt;br /&gt;&lt;code&gt;sn -Vr Microsoft.Phone.InteropServices.dll&lt;/code&gt;   &lt;br /&gt;&lt;code&gt;sn -Vr Microsoft.Phone.Media.Extended.dll&lt;/code&gt;   &lt;br /&gt;&lt;code&gt;sn -Vr Microsoft.ServiceModel.Channels.Mail.dll&lt;/code&gt;   &lt;br /&gt;&lt;code&gt;sn -Vr Microsoft.ServiceModel.Channels.Mail.WindowsMobile.dll&lt;/code&gt;   &lt;br /&gt;&lt;code&gt;sn -Vr Microsoft.VisualBasic.dll&lt;/code&gt;   &lt;br /&gt;&lt;code&gt;sn -Vr Microsoft.VisualBasic.SR.dll&lt;/code&gt;   &lt;br /&gt;&lt;code&gt;sn -Vr System.Data.DataSetExtensions.dll&lt;/code&gt;   &lt;br /&gt;&lt;code&gt;sn -Vr System.Data.dll&lt;/code&gt;   &lt;br /&gt;&lt;code&gt;sn -Vr System.Messaging.dll&lt;/code&gt;   &lt;br /&gt;&lt;code&gt;sn -Vr System.Net.IrDA.dll&lt;/code&gt;   &lt;br /&gt;&lt;code&gt;sn -Vr System.SR.dll&lt;/code&gt;   &lt;br /&gt;&lt;code&gt;sn -Vr System.Web.Services.dll&lt;/code&gt;   &lt;br /&gt;&lt;code&gt;sn -Vr System.Windows.RuntimeHost.dll&lt;/code&gt;   &lt;br /&gt;&lt;code&gt;del GAC_*.dll&lt;/code&gt;   &lt;br /&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;4. From that administrative window, use notepad to open up &lt;/p&gt;  &lt;p&gt;C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\Silverlight\v4.0\Profile\WindowsPhone\RedistList\FrameworkList.xml &lt;/p&gt;  &lt;p&gt;5. Within the XML add the following lines before the closing tag in the document (and save the file!):&lt;/p&gt;  &lt;pre&gt;&amp;#160; &amp;lt;File AssemblyName=&amp;quot;Microsoft.Phone.InteropServices&amp;quot; Version=&amp;quot;7.0.0.0&amp;quot; Culture=&amp;quot;neutral&amp;quot; PublicKeyToken=&amp;quot;24eec0d8c86cda1e&amp;quot; ProcessorArchitecture=&amp;quot;MSIL&amp;quot; InGac=&amp;quot;false&amp;quot; /&amp;gt;&lt;/pre&gt;

&lt;pre&gt;&amp;#160;&amp;#160; &amp;lt;File AssemblyName=&amp;quot;Microsoft.Phone.Media.Extended&amp;quot; Version=&amp;quot;7.0.0.0&amp;quot; Culture=&amp;quot;neutral&amp;quot; PublicKeyToken=&amp;quot;24eec0d8c86cda1e&amp;quot; ProcessorArchitecture=&amp;quot;MSIL&amp;quot; InGac=&amp;quot;false&amp;quot; /&amp;gt;&lt;/pre&gt;

&lt;pre&gt;&amp;#160;&amp;#160; &amp;lt;File AssemblyName=&amp;quot;CustomMarshalers&amp;quot; Version=&amp;quot;3.7.0.0&amp;quot; Culture=&amp;quot;neutral&amp;quot; PublicKeyToken=&amp;quot;969db8053d3322ac&amp;quot; ProcessorArchitecture=&amp;quot;MSIL&amp;quot; InGac=&amp;quot;false&amp;quot; /&amp;gt;&lt;/pre&gt;

&lt;pre&gt;&amp;#160;&amp;#160; &amp;lt;File AssemblyName=&amp;quot;System.Data&amp;quot; Version=&amp;quot;3.7.0.0&amp;quot; Culture=&amp;quot;neutral&amp;quot; PublicKeyToken=&amp;quot;969db8053d3322ac&amp;quot; ProcessorArchitecture=&amp;quot;MSIL&amp;quot; InGac=&amp;quot;false&amp;quot; /&amp;gt;&lt;/pre&gt;

&lt;pre&gt;&amp;#160;&amp;#160; &amp;lt;File AssemblyName=&amp;quot;Microsoft.ServiceModel.Channels.Mail.WindowsMobile&amp;quot; Version=&amp;quot;3.7.0.0&amp;quot; Culture=&amp;quot;neutral&amp;quot; PublicKeyToken=&amp;quot;969db8053d3322ac&amp;quot; ProcessorArchitecture=&amp;quot;MSIL&amp;quot; InGac=&amp;quot;false&amp;quot; /&amp;gt;&lt;/pre&gt;

&lt;pre&gt;&amp;#160;&amp;#160; &amp;lt;File AssemblyName=&amp;quot;Microsoft.ServiceModel.Channels.Mail&amp;quot; Version=&amp;quot;3.7.0.0&amp;quot; Culture=&amp;quot;neutral&amp;quot; PublicKeyToken=&amp;quot;969db8053d3322ac&amp;quot; ProcessorArchitecture=&amp;quot;MSIL&amp;quot; InGac=&amp;quot;false&amp;quot; /&amp;gt;&lt;/pre&gt;

&lt;pre&gt;&amp;#160;&amp;#160; &amp;lt;File AssemblyName=&amp;quot;Microsoft.VisualBasic&amp;quot; Version=&amp;quot;8.1.1.0&amp;quot; Culture=&amp;quot;neutral&amp;quot; PublicKeyToken=&amp;quot;969db8053d3322ac&amp;quot; ProcessorArchitecture=&amp;quot;MSIL&amp;quot; InGac=&amp;quot;false&amp;quot; /&amp;gt;&lt;/pre&gt;

&lt;pre&gt;&amp;#160;&amp;#160; &amp;lt;File AssemblyName=&amp;quot;Microsoft.VisualBasic.SR&amp;quot; Version=&amp;quot;8.1.1.0&amp;quot; Culture=&amp;quot;neutral&amp;quot; PublicKeyToken=&amp;quot;969db8053d3322ac&amp;quot; ProcessorArchitecture=&amp;quot;MSIL&amp;quot; InGac=&amp;quot;false&amp;quot; /&amp;gt;&lt;/pre&gt;

&lt;pre&gt;&amp;#160;&amp;#160; &amp;lt;File AssemblyName=&amp;quot;System.Data.DataSetExtensions&amp;quot; Version=&amp;quot;3.7.0.0&amp;quot; Culture=&amp;quot;neutral&amp;quot; PublicKeyToken=&amp;quot;969db8053d3322ac&amp;quot; ProcessorArchitecture=&amp;quot;MSIL&amp;quot; InGac=&amp;quot;false&amp;quot; /&amp;gt;&lt;/pre&gt;

&lt;pre&gt;&amp;#160;&amp;#160; &amp;lt;File AssemblyName=&amp;quot;System.Data&amp;quot; Version=&amp;quot;3.7.0.0&amp;quot; Culture=&amp;quot;neutral&amp;quot; PublicKeyToken=&amp;quot;969db8053d3322ac&amp;quot; ProcessorArchitecture=&amp;quot;MSIL&amp;quot; InGac=&amp;quot;false&amp;quot; /&amp;gt;&lt;/pre&gt;

&lt;pre&gt;&amp;#160;&amp;#160; &amp;lt;File AssemblyName=&amp;quot;System.Messaging&amp;quot; Version=&amp;quot;3.7.0.0&amp;quot; Culture=&amp;quot;neutral&amp;quot; PublicKeyToken=&amp;quot;969db8053d3322ac&amp;quot; ProcessorArchitecture=&amp;quot;MSIL&amp;quot; InGac=&amp;quot;false&amp;quot; /&amp;gt;&lt;/pre&gt;

&lt;pre&gt;&amp;#160;&amp;#160; &amp;lt;File AssemblyName=&amp;quot;System.Net.IrDA&amp;quot; Version=&amp;quot;3.7.0.0&amp;quot; Culture=&amp;quot;neutral&amp;quot; PublicKeyToken=&amp;quot;969db8053d3322ac&amp;quot; ProcessorArchitecture=&amp;quot;MSIL&amp;quot; InGac=&amp;quot;false&amp;quot; /&amp;gt;&lt;/pre&gt;

&lt;pre&gt;&amp;#160;&amp;#160; &amp;lt;File AssemblyName=&amp;quot;System.SR&amp;quot; Version=&amp;quot;3.7.0.0&amp;quot; Culture=&amp;quot;neutral&amp;quot; PublicKeyToken=&amp;quot;969db8053d3322ac&amp;quot; ProcessorArchitecture=&amp;quot;MSIL&amp;quot; InGac=&amp;quot;false&amp;quot; /&amp;gt;&lt;/pre&gt;

&lt;pre&gt;&amp;#160;&amp;#160; &amp;lt;File AssemblyName=&amp;quot;System.Web.Services&amp;quot; Version=&amp;quot;3.7.0.0&amp;quot; Culture=&amp;quot;neutral&amp;quot; PublicKeyToken=&amp;quot;969db8053d3322ac&amp;quot; ProcessorArchitecture=&amp;quot;MSIL&amp;quot; InGac=&amp;quot;false&amp;quot; /&amp;gt;&lt;/pre&gt;

&lt;pre&gt;&amp;#160;&amp;#160; &amp;lt;File AssemblyName=&amp;quot;System.Windows.RuntimeHost&amp;quot; Version=&amp;quot;2.0.5.0&amp;quot; Culture=&amp;quot;neutral&amp;quot; PublicKeyToken=&amp;quot;31bf3856ad364e35&amp;quot; ProcessorArchitecture=&amp;quot;MSIL&amp;quot; InGac=&amp;quot;false&amp;quot; /&amp;gt;&lt;/pre&gt;

&lt;p&gt;And that's pretty much all you need to do in order to get access to the other DLLs within VS 2010.&lt;file assemblyname="CustomMarshalers" version="3.7.0.0" culture="neutral" publickeytoken="969db8053d3322ac" processorarchitecture="MSIL" ingac="false" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/PlqL7Fq9_W8pvfv19ugQ8yIwfA4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PlqL7Fq9_W8pvfv19ugQ8yIwfA4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/PlqL7Fq9_W8pvfv19ugQ8yIwfA4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PlqL7Fq9_W8pvfv19ugQ8yIwfA4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=5x1ikCmLwuU:fBQy2BC5mHM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=5x1ikCmLwuU:fBQy2BC5mHM:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=5x1ikCmLwuU:fBQy2BC5mHM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=5x1ikCmLwuU:fBQy2BC5mHM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=5x1ikCmLwuU:fBQy2BC5mHM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=5x1ikCmLwuU:fBQy2BC5mHM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=5x1ikCmLwuU:fBQy2BC5mHM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=5x1ikCmLwuU:fBQy2BC5mHM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=5x1ikCmLwuU:fBQy2BC5mHM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottSeelysBlog/~4/5x1ikCmLwuU" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ScottSeelysBlog/~3/5x1ikCmLwuU/Adding_the_lsquo_other_rsquo_WP7_Libraries_to_your_VS_2010.aspx</link>
      <author>scott.seely@friseton.com (Scott Seely)</author>
      <comments>http://www.scottseely.com/Blog/11-05-08/Adding_the_lsquo_other_rsquo_WP7_Libraries_to_your_VS_2010.aspx</comments>
      <guid isPermaLink="false">a84dc6f6-763a-46c9-ac9f-4ddc16cb7f28</guid>
      <pubDate>Sun, 08 May 2011 09:46:51 GMT</pubDate>
    <feedburner:origLink>http://www.scottseely.com/Blog/11-05-08/Adding_the_lsquo_other_rsquo_WP7_Libraries_to_your_VS_2010.aspx</feedburner:origLink></item>
    <item>
      <title>Rumors of WPF's Death are Greatly Exaggerated</title>
      <description>&lt;p style="margin: 0in 0in 0pt;"&gt;&lt;span style="color: rgb(31, 73, 125); font-family: &amp;quot;calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 11pt;"&gt;It seems that, over the last several months, people have become convinced that WPF is dead. Having seen the pace of change in previous desktop UX technologies, I think this concern is unfounded. Has the talk about WPF declined since it launched? Of course. Adoption is no longer a concern. Anyone who needs a desktop application knows WPF exists, books and training are available, and the knowledge is out there. Microsoft doesn't really need to work hard here at this point in time. So, why the angst around WPF?&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0in 0in 0pt;"&gt;&lt;span style="color: rgb(31, 73, 125); font-family: &amp;quot;calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 11pt;"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0in 0in 0pt;"&gt;&lt;span style="color: rgb(31, 73, 125); font-family: &amp;quot;calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 11pt;"&gt;It seems that the fundamental concern is around the fact that many vendors have stopped fighting for the desktop and have resumed the fight at the browser, saying &lt;i&gt;my HTML5 is better than theirs&lt;/i&gt;. The desktop war has gone quiet again and Microsoft still owns that platform, so they've visibly shifted investment from the desktop to where the battle is: in browsers and HTML5. That doesn't mean that they've stopped building WPF, or WinForms, or WebForms, or MFC. But, Microsoft has visibly reduced its investment in those areas. The current set of big bets has been expensive: Azure, WP7, XBox, and Bing. A large part of the Azure investment involves moving server platforms to the cloud. That investment is particularly expensive because now everything has to work on premises and in Azure. Microsoft has limited resources and trying to get significantly more desktop functionality in the next several years just doesn't make sense from a fiduciary point of view. The WPF team still lives, it's just smaller than in 2005.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0in 0in 0pt;"&gt;&lt;span style="color: rgb(31, 73, 125); font-family: &amp;quot;calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 11pt;"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(31, 73, 125); font-family: &amp;quot;calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 11pt;"&gt;To appreciate the pace of innovation in WPF, take a look at this ScottGu post from 2009: &lt;/span&gt;&lt;span style="color: rgb(31, 73, 125); font-family: &amp;quot;calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 11pt;"&gt;&lt;a shape="rect" href="http://weblogs.asp.net/scottgu/archive/2009/10/26/wpf-4-vs-2010-and-net-4-0-series.aspx"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;http://weblogs.asp.net/scottgu/archive/2009/10/26/wpf-4-vs-2010-and-net-4-0-series.aspx&lt;/span&gt;&lt;/a&gt;.  I expect a similar amount of forward momentum in .NET 5 to add Windows 8 features for WPF developers. WPF is now a mature, stable, technology. Like other libraries in .NET, innovation is no longer around building the perfect class library but instead on enhancing the library's usability and utility. The same things are happening in WCF, System.Transactions, System.Net, System.Security, and other namespaces that we never hear about but that we know haven't been abandoned. &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(31, 73, 125); font-family: &amp;quot;calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 11pt;"&gt;As .NET developers, we need to articulate these facts to project sponsors. When they say "I hear WPF is dead" have them look at WPF and how it has grown. Look at what it does. Explain that the investment in WPF has declined because the amount of work to get done today is incremental-- support video cards better, add support to match Windows Shell innovation, improve drawing. The library is still being enhanced. &lt;span style="color: rgb(31, 73, 125); font-family: &amp;quot;calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 11pt; mso-fareast-font-family: calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa;"&gt;&lt;a shape="rect" href="http://dotnet.uservoice.com/forums/40583-wpf-feature-suggestions/topics/41002-i-suggest-you-/filter/hot"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;http://dotnet.uservoice.com/forums/40583-wpf-feature-suggestions/topics/41002-i-suggest-you-/filter/hot&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; tells the story of what people want and what is being accepted into the next version of WPF. &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(31, 73, 125); font-family: &amp;quot;calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 11pt;"&gt;If that's not enough, remind the naysayer that even MFC is still being enhanced. &lt;/span&gt;&lt;/p&gt; &lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/sReiIE_iBFG0CAtnG8MjUblgRg8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sReiIE_iBFG0CAtnG8MjUblgRg8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/sReiIE_iBFG0CAtnG8MjUblgRg8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sReiIE_iBFG0CAtnG8MjUblgRg8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=fAkfCx5k7_U:YjQrZyxNE8E:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=fAkfCx5k7_U:YjQrZyxNE8E:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=fAkfCx5k7_U:YjQrZyxNE8E:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=fAkfCx5k7_U:YjQrZyxNE8E:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=fAkfCx5k7_U:YjQrZyxNE8E:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=fAkfCx5k7_U:YjQrZyxNE8E:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=fAkfCx5k7_U:YjQrZyxNE8E:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=fAkfCx5k7_U:YjQrZyxNE8E:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=fAkfCx5k7_U:YjQrZyxNE8E:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottSeelysBlog/~4/fAkfCx5k7_U" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ScottSeelysBlog/~3/fAkfCx5k7_U/Rumors_of_WPF_s_Death_are_Greatly_Exaggerated.aspx</link>
      <author>scott.seely@friseton.com (Scott Seely)</author>
      <comments>http://www.scottseely.com/Blog/11-05-02/Rumors_of_WPF_s_Death_are_Greatly_Exaggerated.aspx</comments>
      <guid isPermaLink="false">d2d3668e-4912-47cd-a3ba-ab405433d753</guid>
      <pubDate>Mon, 02 May 2011 22:15:32 GMT</pubDate>
    <feedburner:origLink>http://www.scottseely.com/Blog/11-05-02/Rumors_of_WPF_s_Death_are_Greatly_Exaggerated.aspx</feedburner:origLink></item>
    <item>
      <title>Houston TechFest 2010: Code and Samples from my WCF/RIA Talk</title>
      <description>&lt;p&gt;I had a great time talking to the folks at the Houston TechFest. Much thanks also to Addison-Wesley for sponsoring my trip to Houston. If you are interested in becoming an technical author, let me know and I can put you in contact with the editors at Addison-Wesley (&lt;a href="mailto:scott@scottseely.com"&gt;scott@scottseely.com&lt;/a&gt;). &lt;/p&gt;  &lt;p&gt;As promised, my slides and code are online: &lt;a href="http://www.scottseely.com/downloads/HoustonTechFest-Seely-WCFRIA.zip"&gt;www.scottseely.com/downloads/HoustonTechFest-Seely-WCFRIA.zip&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Let me know if you have any questions about the code, the presentation, or life as an author.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/DxJ_sbW88igSeTkJHBSazC2mSoA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DxJ_sbW88igSeTkJHBSazC2mSoA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/DxJ_sbW88igSeTkJHBSazC2mSoA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DxJ_sbW88igSeTkJHBSazC2mSoA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=_2ajsP93-kw:TOXmm_z23VA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=_2ajsP93-kw:TOXmm_z23VA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=_2ajsP93-kw:TOXmm_z23VA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=_2ajsP93-kw:TOXmm_z23VA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=_2ajsP93-kw:TOXmm_z23VA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=_2ajsP93-kw:TOXmm_z23VA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=_2ajsP93-kw:TOXmm_z23VA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=_2ajsP93-kw:TOXmm_z23VA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=_2ajsP93-kw:TOXmm_z23VA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottSeelysBlog/~4/_2ajsP93-kw" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ScottSeelysBlog/~3/_2ajsP93-kw/Houston_TechFest_2010_Code_and_Samples_from_my_WCF_RIA_Talk.aspx</link>
      <author>scott.seely@friseton.com (Scott Seely)</author>
      <comments>http://www.scottseely.com/Blog/10-10-09/Houston_TechFest_2010_Code_and_Samples_from_my_WCF_RIA_Talk.aspx</comments>
      <guid isPermaLink="false">a522640a-459f-4728-a617-52ae34ab604d</guid>
      <pubDate>Sat, 09 Oct 2010 15:50:01 GMT</pubDate>
    <feedburner:origLink>http://www.scottseely.com/Blog/10-10-09/Houston_TechFest_2010_Code_and_Samples_from_my_WCF_RIA_Talk.aspx</feedburner:origLink></item>
    <item>
      <title>Clean paths with WCF Hosted Workflows</title>
      <description>&lt;p&gt;I am a big fan of the things added to WCF 4.0. One of those things is the deep integration with ASP.NET routes. Today, I was writing a service in WF and hosting the workflow with WCF. I really didn't like the service URL-yeah, I'm a picky developer who doesn't like exposing implementation details in the URL. &lt;/p&gt; &lt;p&gt;I knew a few things:&lt;/p&gt; &lt;p&gt;1. WF/WCF integration provides a ServiceHostFactory named WorkflowServiceHostFactory for hosting XAMLX files in WCF.&lt;/p&gt; &lt;p&gt;2. WorfklowServiceHostFactory will see CreateServiceHost called with some constructorString plus a bunch of baseAddresses.&lt;/p&gt; &lt;p&gt;3. I wanted the host to work on HTTP only-I don't care about goofy URLs for net.tcp.&lt;/p&gt; &lt;p&gt;4. XAMLX services do not have a runtime defined type- they exist only in XAML.&lt;/p&gt; &lt;p&gt;My goal was to create a new route type, like ServiceRoute, that allowed me to pass in the desired path and the path to the XAMLX to instantiate. After a few minutes of thinking and hacking, I had the following:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;WorkflowServiceRoute &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;ServiceRoute
&lt;/span&gt;{
  &lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;HostedWorkflowServiceHostFactory &lt;/span&gt;: &lt;/pre&gt;&lt;pre class="code"&gt;    &lt;span style="color: #2b91af"&gt;WorkflowServiceHostFactory
  &lt;/span&gt;{
    &lt;span style="color: blue"&gt;public &lt;/span&gt;HostedWorkflowServiceHostFactory(&lt;span style="color: blue"&gt;string &lt;/span&gt;xamlxPath)
    {
      XamlxPath = xamlxPath;
    }

    &lt;span style="color: blue"&gt;string &lt;/span&gt;XamlxPath { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }

    &lt;span style="color: blue"&gt;public override &lt;/span&gt;System.ServiceModel.&lt;span style="color: #2b91af"&gt;ServiceHostBase &lt;/span&gt;CreateServiceHost(
      &lt;span style="color: blue"&gt;string &lt;/span&gt;constructorString, &lt;span style="color: #2b91af"&gt;Uri&lt;/span&gt;[] baseAddresses)
    {
      &lt;span style="color: blue"&gt;return base&lt;/span&gt;.CreateServiceHost(XamlxPath, baseAddresses);
    }
  }

  &lt;span style="color: blue"&gt;public &lt;/span&gt;WorkflowServiceRoute(&lt;span style="color: blue"&gt;string &lt;/span&gt;routePrefix, &lt;span style="color: blue"&gt;string &lt;/span&gt;xamlxPath)
    : &lt;span style="color: blue"&gt;base&lt;/span&gt;(routePrefix, &lt;/pre&gt;&lt;pre class="code"&gt;           &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;HostedWorkflowServiceHostFactory&lt;/span&gt;(xamlxPath), &lt;/pre&gt;&lt;pre class="code"&gt;           &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: blue"&gt;object&lt;/span&gt;))
  {
  }
}&lt;/pre&gt;
&lt;p&gt;I'm pretty happy with the succinctness of the class and the fact that it works on the few use cases I have at hand. Requests are directed to the correct locations and integration seems to be just fine. Use of the WorkflowServiceRoute is just:&lt;/p&gt;&lt;pre class="code"&gt;routes.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;WorkflowServiceRoute&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"helloWorld"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"SimpleWorkflow.xamlx"&lt;/span&gt;));&lt;/pre&gt;
&lt;p&gt;Frankly, this is the first implementation I thought to write, and it works. The code size is small. I don't like a few things about it, but I'll live. Things I don't like:&lt;/p&gt;
&lt;p&gt;1. Passing typeof(object) to the base constructor from the route seems wrong. The receiver code thinks it needs a reference to the service type at all times. I'm just lying to the ServiceRoute so that I can take advantage of everything good about it.&lt;/p&gt;
&lt;p&gt;2. Custom ServiceHost just so the code can remember the path to the XAMLX. This bothers me until I think that this is the same thing that happens with each .SVC or other XAMLX file. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;As a benefit, I get URLs that look like this:&lt;/p&gt;&lt;pre&gt;http://scottseely-xps/WfHostApp/helloWorld&lt;br&gt;&lt;font size="3" face="Arial"&gt;instead of:&lt;/font&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;http://scottseely-xps/WfHostApp/SimpleWorkflow.xamlx&lt;/pre&gt;&lt;pre&gt;&lt;br&gt;&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;This serves as yet another example of how good it is that WCF is super extensible and what a great design decision it was to build WCF on top of the extensibility points instead of along side them.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/EfsR71Szedvcwr7ijh-TUdWejO8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EfsR71Szedvcwr7ijh-TUdWejO8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/EfsR71Szedvcwr7ijh-TUdWejO8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EfsR71Szedvcwr7ijh-TUdWejO8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=MIncobmQFZg:j0uW4OU-TH0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=MIncobmQFZg:j0uW4OU-TH0:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=MIncobmQFZg:j0uW4OU-TH0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=MIncobmQFZg:j0uW4OU-TH0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=MIncobmQFZg:j0uW4OU-TH0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=MIncobmQFZg:j0uW4OU-TH0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=MIncobmQFZg:j0uW4OU-TH0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=MIncobmQFZg:j0uW4OU-TH0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=MIncobmQFZg:j0uW4OU-TH0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottSeelysBlog/~4/MIncobmQFZg" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ScottSeelysBlog/~3/MIncobmQFZg/Clean_paths_with_WCF_Hosted_Workflows.aspx</link>
      <author>scott.seely@friseton.com (Scott Seely)</author>
      <comments>http://www.scottseely.com/Blog/10-09-08/Clean_paths_with_WCF_Hosted_Workflows.aspx</comments>
      <guid isPermaLink="false">312b99c1-b0d8-4cab-99f3-073f7f23deed</guid>
      <pubDate>Wed, 08 Sep 2010 18:19:39 GMT</pubDate>
    <feedburner:origLink>http://www.scottseely.com/Blog/10-09-08/Clean_paths_with_WCF_Hosted_Workflows.aspx</feedburner:origLink></item>
    <item>
      <title>How JSONP works (and some bits about implementing it in WCF)</title>
      <description>&lt;p&gt;In the world of the web, we have lots of security concerns. One of the concerns lies with cross site scripting, XSS. From a high level, XSS is any occasion where data is sent from code on a page from one site to another site. The code is usually via JavaScript, though flash and Silverlight are included in the terminology and mitigations. One way around this that is generally viewed as safe is JSON with Padding, aka JSONP. The way JSONP works is this: you pass an HTTP GET request to retrieve a resource from another site which you do not control. The request contains two pieces of information: &lt;/p&gt;  &lt;p&gt;1. The resource you want to retrieve.&lt;/p&gt;  &lt;p&gt;2. The callback function that should be executed when the resource is returned.&lt;/p&gt;  &lt;p&gt;What makes this safe? The callback function is always something that you control. It is assumed that if your callback does bad things, so be it; that problem existed without involving JSONP. &lt;/p&gt;  &lt;p&gt;There is a convention around JSONP. The URL that you call needs to understand a querystring parameter named &lt;em&gt;callback&lt;/em&gt;, which identifies the function to call when the method returns. How does this work? Assume we have a resource that, when no callback is specified, returns the following when requesting the resource at &lt;/p&gt;  &lt;p&gt;http://localhost/WcfJsonp/jsonp/names:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;[{&amp;quot;FirstName&amp;quot;:&amp;quot;Scott&amp;quot;,&amp;quot;LastName&amp;quot;:&amp;quot;Seely&amp;quot;},&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt; {&amp;quot;FirstName&amp;quot;:&amp;quot;Aaron&amp;quot;,&amp;quot;LastName&amp;quot;:&amp;quot;Skonnard&amp;quot;},&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt; {&amp;quot;FirstName&amp;quot;:&amp;quot;Matt&amp;quot;,&amp;quot;LastName&amp;quot;:&amp;quot;Milner&amp;quot;}]&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;With JSONP, we would like a GET of the above data to execute a function on our page named &lt;em&gt;updatePeople&lt;/em&gt;. JSONP indicates that we do this with a request for the resource at http://localhost/WcfJsonp/jsonp/names?callback=updatePeople. In so doing, the resource is now returned as:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;updatePeople(&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt; [{&amp;quot;FirstName&amp;quot;:&amp;quot;Scott&amp;quot;,&amp;quot;LastName&amp;quot;:&amp;quot;Seely&amp;quot;},&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160; {&amp;quot;FirstName&amp;quot;:&amp;quot;Aaron&amp;quot;,&amp;quot;LastName&amp;quot;:&amp;quot;Skonnard&amp;quot;},&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160; {&amp;quot;FirstName&amp;quot;:&amp;quot;Matt&amp;quot;,&amp;quot;LastName&amp;quot;:&amp;quot;Milner&amp;quot;}]);&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;This causes the function, updatePeople, to be called as soon as the resource is retrieved. &lt;/p&gt;  &lt;p&gt;How does this work? Most of us will use jQuery to get the job done and not think about things. But, without jQuery, JSONP is still possible. I'll first show you how this works by hand, then with jQuery. jQuery eliminates a number of potential bugs, so I recommend reading the by hand portion solely to understand things-don't implement it in production code!&lt;/p&gt;  &lt;p&gt;Assume you have the following HTML body:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;body&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;input &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;button&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;onclick&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;getPeopleJsonp();&amp;quot; &lt;/span&gt;&lt;/pre&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;             &lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Get people&amp;quot; /&amp;gt;  
    &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div &lt;/span&gt;&lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;people&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;script &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;text/javascript&amp;quot; &lt;/span&gt;&lt;/pre&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;      &lt;/span&gt;&lt;span style="color: red"&gt;src&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;/wcfjsonp/Scripts/jquery-1.4.1.min.js&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;script&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;script &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;text/javascript&amp;quot;&amp;gt;
&lt;/span&gt;        &lt;span style="color: blue"&gt;function &lt;/span&gt;updatePeople(data) {
          &lt;span style="color: blue"&gt;var &lt;/span&gt;innerHtml = &lt;span style="color: maroon"&gt;&amp;quot;&amp;quot;&lt;/span&gt;;
          &lt;span style="color: blue"&gt;for &lt;/span&gt;(i = 0; i &amp;lt; data.length; ++i) {
            innerHtml += data[i].FirstName + &lt;span style="color: maroon"&gt;' ' &lt;/span&gt;+ &lt;/pre&gt;

&lt;pre class="code"&gt;                         data[i].LastName + &lt;span style="color: maroon"&gt;'&amp;lt;br/&amp;gt;'&lt;/span&gt;;
          }
          $(&lt;span style="color: maroon"&gt;&amp;quot;#people&amp;quot;&lt;/span&gt;).html(innerHtml);
        }

        &lt;span style="color: blue"&gt;function &lt;/span&gt;getPeopleJsonp() {
          &lt;span style="color: blue"&gt;var &lt;/span&gt;innerHtml = &lt;span style="color: maroon"&gt;&amp;quot;&amp;lt;script type='text/javascript' &amp;quot; &lt;/span&gt;+ &lt;/pre&gt;

&lt;pre class="code"&gt;                          &lt;span style="color: maroon"&gt;&amp;quot;src='http://scottseely-xps/wcfjsonp/&amp;quot; &lt;font color="#000000"&gt;+&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre class="code"&gt;&lt;span style="color: maroon"&gt;                          &lt;span style="color: maroon"&gt;&amp;quot;&lt;/span&gt;jsonp/names?callback=updatePeople'&amp;gt;&amp;lt;\/script&amp;gt;&amp;quot;&lt;/span&gt;;
          $(&lt;span style="color: maroon"&gt;&amp;quot;#inject&amp;quot;&lt;/span&gt;).html(innerHtml);
        }
    &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;script&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div &lt;/span&gt;&lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;inject&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;body&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;What is happening here? When someone clicks on the button, the page calls getPeopleJsonp. That code updates the content of the div whose id is &lt;em&gt;inject&lt;/em&gt; to contain a script tag. The script tag points to a JSONP endpoint and passes the callback parameter indicating to call the function updatePeople upon success. That script is then evaluated, executes a local JavaScript function, and returns. Every time that same script is reinjected, the same behavior occurs. 

  &lt;br /&gt;&lt;/p&gt;

&lt;p&gt;Now, jQuery provides a more succinct mechanism for doing the same thing. Instead of having the previous two functions and updating the DOM ourselves, we would write this:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;function &lt;/span&gt;getPeopleJquery() {
  $.ajax({
    dataType: &lt;span style="color: maroon"&gt;'jsonp'&lt;/span&gt;,
    url: &lt;span style="color: maroon"&gt;&amp;quot;http://scottseely-xps/WcfJsonp/jsonp/names&amp;quot;&lt;/span&gt;,
    success: &lt;span style="color: blue"&gt;function &lt;/span&gt;(data) {
      &lt;span style="color: blue"&gt;var &lt;/span&gt;innerHtml = &lt;span style="color: maroon"&gt;&amp;quot;&amp;quot;&lt;/span&gt;;
      &lt;span style="color: blue"&gt;for &lt;/span&gt;(i = 0; i &amp;lt; data.length; ++i) {
        innerHtml += data[i].FirstName + &lt;span style="color: maroon"&gt;' ' &lt;/span&gt;+ data[i].LastName + &lt;span style="color: maroon"&gt;'&amp;lt;br/&amp;gt;'&lt;/span&gt;;
      }
      $(&lt;span style="color: maroon"&gt;&amp;quot;#people&amp;quot;&lt;/span&gt;).html(innerHtml);
    }
  });
}&lt;/pre&gt;

&lt;p&gt;The code to inject information into the DOM still occurs, as does the creation of a callback function. What jQuery does is it adds script tag to the DOM only until the callback (success function) is done executing. The tag is added to the header. It also adds a function to the window object which is called on return. The URL jQuery constructs looks like http://localhost/WcfJsonp/jsonp/names?callback=jsonp1283609644773. What it actually does is add the following:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.scottseely.com/Libraries/MetaBlogLib/WindowsLiveWriter-JSONPinWCF_7994-blog-tagadded_6.sflb"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="blog-tagadded" border="0" alt="blog-tagadded" src="http://www.scottseely.com/Libraries/MetaBlogLib/WindowsLiveWriter-JSONPinWCF_7994-blog-tagadded_thumb_2.sflb" width="583" height="195" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Within the window object, a new function is added:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.scottseely.com/Libraries/MetaBlogLib/WindowsLiveWriter-JSONPinWCF_7994-expandos_2.sflb"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="expandos" border="0" alt="expandos" src="http://www.scottseely.com/Libraries/MetaBlogLib/WindowsLiveWriter-JSONPinWCF_7994-expandos_thumb.sflb" width="589" height="194" /&gt;&lt;/a&gt;&lt;/p&gt;





&lt;p&gt;jsonp1283609644773 is just an object living on the window object and is a dynamically added function. When the function is done executing, it will remove itself from the window object, leaving a slot by the same name with a value of &lt;em&gt;undefined&lt;/em&gt;. What does the function look like when it is alive? &lt;/p&gt;

&lt;p&gt;&lt;font size="2" face="Courier New"&gt;function(q){n=q;b();d();z[i]=v;try{delete z[i]}catch(p){}A&amp;amp;&amp;amp;A.removeChild(B)}&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;So, yeah, not too intelligible, but it does appear to handle things just fine. b(), d(), and the other functions are all part of the minified jQuery library, meaning that it all makes sense in the context of the containing object. The call to b() is contains code to call the success function. Everything else is cleanup code (at least from what it looked like to me.). To make this whole thing work in WCF, you need to do a couple simple things:&lt;/p&gt;

&lt;p&gt;1. Only use WebGet to fetch resources.&lt;/p&gt;

&lt;p&gt;2. Make sure the resource is hard-coded to respond in JSON. Otherwise, the response will appear as XML and the callback code won't execute.&lt;/p&gt;

&lt;p&gt;3. Make sure your binding supports JSONP. &lt;/p&gt;

&lt;p&gt;4. Make sure your service requires ASP.NET compatibility.&lt;/p&gt;

&lt;p&gt;For example, to get the names, I have the following WCF code:&lt;/p&gt;

&lt;pre class="code"&gt;[&lt;span style="color: #2b91af"&gt;ServiceContract&lt;/span&gt;]
[&lt;span style="color: #2b91af"&gt;AspNetCompatibilityRequirements&lt;/span&gt;(
  RequirementsMode = &lt;span style="color: #2b91af"&gt;AspNetCompatibilityRequirementsMode&lt;/span&gt;.Required)]
&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;JsonpDemo
&lt;/span&gt;{
  [&lt;span style="color: #2b91af"&gt;OperationContract&lt;/span&gt;]
  [&lt;span style="color: #2b91af"&gt;WebGet&lt;/span&gt;(UriTemplate = &lt;span style="color: #a31515"&gt;&amp;quot;names&amp;quot;&lt;/span&gt;, ResponseFormat = &lt;span style="color: #2b91af"&gt;WebMessageFormat&lt;/span&gt;.Json)]
  &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;PersonName&lt;/span&gt;[] GetNames()
  {
    &lt;span style="color: blue"&gt;return new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;PersonName&lt;/span&gt;[]
              {
                &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;PersonName &lt;/span&gt;{FirstName = &lt;span style="color: #a31515"&gt;&amp;quot;Scott&amp;quot;&lt;/span&gt;, LastName = &lt;span style="color: #a31515"&gt;&amp;quot;Seely&amp;quot;&lt;/span&gt;},
                &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;PersonName &lt;/span&gt;{FirstName = &lt;span style="color: #a31515"&gt;&amp;quot;Aaron&amp;quot;&lt;/span&gt;, LastName = &lt;span style="color: #a31515"&gt;&amp;quot;Skonnard&amp;quot;&lt;/span&gt;},
                &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;PersonName &lt;/span&gt;{FirstName = &lt;span style="color: #a31515"&gt;&amp;quot;Matt&amp;quot;&lt;/span&gt;, LastName = &lt;span style="color: #a31515"&gt;&amp;quot;Milner&amp;quot;&lt;/span&gt;}
              };
  }
}&lt;/pre&gt;

&lt;p&gt;Configuration has:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;serviceHostingEnvironment &lt;/span&gt;&lt;span style="color: red"&gt;aspNetCompatibilityEnabled&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;true&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;standardEndpoints&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;webHttpEndpoint&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;standardEndpoint &lt;/span&gt;&lt;span style="color: red"&gt;crossDomainScriptAccessEnabled&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;true&lt;/span&gt;&amp;quot; 
                        &lt;span style="color: red"&gt;automaticFormatSelectionEnabled&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;true&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;webHttpEndpoint&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;standardEndpoints&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;The crossDomainScriptAccessEnabled flag turns on the ability to correctly parse and respond to the presence of the callback parameter in the query string.&lt;/p&gt;

&lt;p&gt;Finally, I added a route to handle the service within my Global.asax:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;factory = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;WebServiceHostFactory&lt;/span&gt;();
routes.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ServiceRoute&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;jsonp&amp;quot;&lt;/span&gt;, factory, &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;JsonpDemo&lt;/span&gt;)));&lt;/pre&gt;

&lt;p&gt;I was looking at the technology only to evaluate how to use it and to understand, a bit more deeply, how JSONP actually works. I found myself looking for a post that explains the magic, but most of the information I found just said "use jQuery." Handy-sure. But that didn't help me understand all the magic goodness that jQuery was doing for me.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/x1-qf0XsEHDCRWmVcu0nwiBhfto/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/x1-qf0XsEHDCRWmVcu0nwiBhfto/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/x1-qf0XsEHDCRWmVcu0nwiBhfto/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/x1-qf0XsEHDCRWmVcu0nwiBhfto/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=pz9QRgfUpoQ:azd0iWevL4o:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=pz9QRgfUpoQ:azd0iWevL4o:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=pz9QRgfUpoQ:azd0iWevL4o:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=pz9QRgfUpoQ:azd0iWevL4o:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=pz9QRgfUpoQ:azd0iWevL4o:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=pz9QRgfUpoQ:azd0iWevL4o:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=pz9QRgfUpoQ:azd0iWevL4o:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=pz9QRgfUpoQ:azd0iWevL4o:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=pz9QRgfUpoQ:azd0iWevL4o:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottSeelysBlog/~4/pz9QRgfUpoQ" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ScottSeelysBlog/~3/pz9QRgfUpoQ/How_JSONP_works_and_some_bits_about_implementing_it_in_WCF.aspx</link>
      <author>scott.seely@friseton.com (Scott Seely)</author>
      <comments>http://www.scottseely.com/Blog/10-09-04/How_JSONP_works_and_some_bits_about_implementing_it_in_WCF.aspx</comments>
      <guid isPermaLink="false">0c9c4bce-8d0a-4147-ab90-89c65f9c2292</guid>
      <pubDate>Sat, 04 Sep 2010 10:49:13 GMT</pubDate>
    <feedburner:origLink>http://www.scottseely.com/Blog/10-09-04/How_JSONP_works_and_some_bits_about_implementing_it_in_WCF.aspx</feedburner:origLink></item>
    <item>
      <title>Talking about REST</title>
      <description>&lt;p&gt;Mark and Clark over at &lt;a href="http://developersmackdown.com" target="_blank"&gt;developersmackdown.com&lt;/a&gt; just published 'my' show: &lt;a title="http://developersmackdown.com/archives/SingleShow/30" href="http://developersmackdown.com/archives/SingleShow/30"&gt;http://developersmackdown.com/archives/SingleShow/30&lt;/a&gt;. We spent time talking about REST and SOAP as well as a number of other topics related to REST. One of the things that I don't think was made clear enough was that REST and SOAP are not competing service techniques. Each technology/interface type has an appropriate use case. When integrating applications within an enterprise, the development team needs to worry about:&lt;/p&gt;  &lt;p&gt;- Security&lt;/p&gt;  &lt;p&gt;- Transactions&lt;/p&gt;  &lt;p&gt;- Reliable delivery of messages&lt;/p&gt;  &lt;p&gt;- Integration with tooling for other developers&lt;/p&gt;  &lt;p&gt;In the enterprise case, WCF + SOAP/WS-* can make integration between systems pretty simple. Yes, the teams may struggle with getting the security setup just right between domains, but overall, things will go well, especially if the setup requires communicating between different WS-* implementations. Finally, enterprise integrations typically happen for applications running on the same network/VPN. The infrastructure for an enterprise is different than that for the web. It's important to build your applications for their environment.&lt;/p&gt;  &lt;p&gt;When integrating applications over the Internet, sometimes WS-* adds too much complexity. For extensive integration across partners who are connected via the Internet, there is some benefit to understanding REST. REST will allow your application to scale using the HTTP architecture. Features such as caching, proxy servers, and the general uniform interface exposed by HTTP helps make things work better on the global network.&lt;/p&gt;  &lt;p&gt;Because of my point of view here, when asked "do you prefer SOAP or REST?", I am forced to answer "For what scenario?" I'm not popular in either circle, but understanding both helps me get stuff done.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VKq-rDSiuW-OSbEhrDp59NDeZH8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VKq-rDSiuW-OSbEhrDp59NDeZH8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VKq-rDSiuW-OSbEhrDp59NDeZH8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VKq-rDSiuW-OSbEhrDp59NDeZH8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=TKDRRfQAGDs:cw4hiPuqbzU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=TKDRRfQAGDs:cw4hiPuqbzU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=TKDRRfQAGDs:cw4hiPuqbzU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=TKDRRfQAGDs:cw4hiPuqbzU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=TKDRRfQAGDs:cw4hiPuqbzU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=TKDRRfQAGDs:cw4hiPuqbzU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=TKDRRfQAGDs:cw4hiPuqbzU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=TKDRRfQAGDs:cw4hiPuqbzU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=TKDRRfQAGDs:cw4hiPuqbzU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottSeelysBlog/~4/TKDRRfQAGDs" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ScottSeelysBlog/~3/TKDRRfQAGDs/Talking_about_REST.aspx</link>
      <author>scott.seely@friseton.com (Scott Seely)</author>
      <comments>http://www.scottseely.com/Blog/10-09-02/Talking_about_REST.aspx</comments>
      <guid isPermaLink="false">7636ee42-ba68-4e4b-9224-1291f12d7cae</guid>
      <pubDate>Thu, 02 Sep 2010 10:55:30 GMT</pubDate>
    <feedburner:origLink>http://www.scottseely.com/Blog/10-09-02/Talking_about_REST.aspx</feedburner:origLink></item>
    <item>
      <title>Grand Rapids Day of .NET is Looking for You!</title>
      <description>&lt;p&gt;Planning is in full swing for the Fall 2010 Day of .NET (DODN) conference in Grand Rapids on Saturday October 23rd, 2010 at Calvin College. &lt;/p&gt;  &lt;p&gt;The theme for this year is &amp;quot;Open to the Future&amp;quot;. The theme combines two important trends in developing with .NET - &amp;quot;open&amp;quot; and the &amp;quot;future&amp;quot;. On the &amp;quot;open&amp;quot; side there has been a lot of activity in opening up the platform, creating open source projects and libraries, enabling projects to work well in a mixed-IT environment, and opening up data to diverse applications. On the &amp;quot;future&amp;quot; side we see .NET 4.0 and Visual Studio 2010 which brings many new capabilities to the platform.&lt;/p&gt;  &lt;p&gt;What this means for potential speakers is that there is a huge range of topics for you to consider. While this event is a &amp;quot;Day of .NET&amp;quot;, speakers are encouraged to submit talks that span the spectrum of technologies being used in active development today.&lt;/p&gt;  &lt;p&gt;This event is a great opportunity for new speakers and local speakers to get a chance to participate in the larger development community - come share what you have been learning and network with other speakers and participants.&lt;/p&gt;  &lt;p&gt;In addition to having a set of planned ~1 hour talks, there is room available for open sessions. These can be from a 5-minute &amp;quot;lightening talk&amp;quot; to something longer that is of interest to an ad-hoc presenter and group. So if you have an idea for a session to be put on the schedule and promoted, please send it along ASAP. But if you also have something smaller, or that develops between now and then, please bring it along to the event and the organizers have a forum to share it.&lt;/p&gt;  &lt;p&gt;Speaker submissions will be accepted between August 25 and September 18 and will have the sessions and schedule completed by the end of September for the event on October 23.&lt;/p&gt;  &lt;p&gt;In a brief e-mail to &lt;a href="mailto:grdodn10@live.com"&gt;grdodn10@live.com&lt;/a&gt; please provide your:&lt;/p&gt;  &lt;p&gt; - Name &lt;/p&gt;  &lt;p&gt; - Email &lt;/p&gt;  &lt;p&gt; - Phone Number &lt;/p&gt;  &lt;p&gt; - Twitter &lt;/p&gt;  &lt;p&gt; - URL (Blog/Personal/Company) &lt;/p&gt;  &lt;p&gt; - Brief Bio &lt;/p&gt;  &lt;p&gt; - Session Abstract &lt;/p&gt;  &lt;p&gt; - Session Level (e.g. 100,200,Advanced) &lt;/p&gt;  &lt;p&gt; - Notes/Info (new presentation, done before?) &lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/2Q4yBh0-icEeFjaoQ8kGbzP9a3s/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2Q4yBh0-icEeFjaoQ8kGbzP9a3s/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/2Q4yBh0-icEeFjaoQ8kGbzP9a3s/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2Q4yBh0-icEeFjaoQ8kGbzP9a3s/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=IhugPElGwP8:lNniozL9ubg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=IhugPElGwP8:lNniozL9ubg:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=IhugPElGwP8:lNniozL9ubg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=IhugPElGwP8:lNniozL9ubg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=IhugPElGwP8:lNniozL9ubg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=IhugPElGwP8:lNniozL9ubg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=IhugPElGwP8:lNniozL9ubg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=IhugPElGwP8:lNniozL9ubg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=IhugPElGwP8:lNniozL9ubg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottSeelysBlog/~4/IhugPElGwP8" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ScottSeelysBlog/~3/IhugPElGwP8/Grand_Rapids_Day_of_NET_is_Looking_for_You.aspx</link>
      <author>scott.seely@friseton.com (Scott Seely)</author>
      <comments>http://www.scottseely.com/Blog/10-08-28/Grand_Rapids_Day_of_NET_is_Looking_for_You.aspx</comments>
      <guid isPermaLink="false">e594e018-e6c8-41b2-878c-2b21e6ccd5bf</guid>
      <pubDate>Sat, 28 Aug 2010 13:48:03 GMT</pubDate>
    <feedburner:origLink>http://www.scottseely.com/Blog/10-08-28/Grand_Rapids_Day_of_NET_is_Looking_for_You.aspx</feedburner:origLink></item>
    <item>
      <title>Project Phoenix</title>
      <description>&lt;p&gt;The current economic condition is hitting everyone pretty hard, even developers. For developers, part of the challenge in finding that next job is having the right, up to date skills. To help folks get those skills, &lt;a href="http://sqlblog.com/blogs/arnie_rowland/" target="_blank"&gt;Arnie Rowland&lt;/a&gt; and a number of other MVPs got together to pool MSDN subscriptions. This year, every MVP gets 3 MSDN Universal Subscriptions- 1 to use and 2 to give to worthy recipients. To pick a worthy recipient, an unemployed or underemployed developer needs to propose a software project for a non-profit agency, school, or church to be assisted by &lt;a href="http://sqlblog.com/blogs/arnie_rowland/archive/2010/07/30/like-a-phoenix-rising-from-the-ashes.aspx" target="_blank"&gt;Project Phoenix&lt;/a&gt;. Arnie and his associates will then pick at least one project week to 'fund' with the MSDN Universal Subscription. A number of other companies joined in to offer more resources to help the selected developers make the most of this opportunity. Publishers have donated books and software companies have donated tools. I'm very proud that Pluralsight has donated a subscription to their .NET Training Library. I have created content for that library and am thrilled that an organization I am involved with is helping developers get back up to speed with current technology. &lt;/p&gt;  &lt;p&gt;Project Phoenix is not a 'free lunch.' It supports the developers' efforts so that they can gain from the work they do. I do recommend that you visit &lt;a href="http://sqlblog.com/blogs/arnie_rowland/archive/2010/07/30/like-a-phoenix-rising-from-the-ashes.aspx" target="_blank"&gt;Arnie's site&lt;/a&gt; to read all the details! &lt;/p&gt;  &lt;p&gt;Here is the an example of one project that was funded:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Feed My Sheep&lt;/strong&gt;: We are a community feeding program, that originally started as a 3 month summer project, one night a week we would provide a free meal for anyone who wanted to attend. We are in desperate need of a website in which we could post updates, have a calendar of volunteers and groups that will be serving each month and list special events.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HfG1lMBatdGBogTlOKMvHlfdYuY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HfG1lMBatdGBogTlOKMvHlfdYuY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HfG1lMBatdGBogTlOKMvHlfdYuY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HfG1lMBatdGBogTlOKMvHlfdYuY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=_viUbslSNRw:q6VhA7JrKKo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=_viUbslSNRw:q6VhA7JrKKo:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=_viUbslSNRw:q6VhA7JrKKo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=_viUbslSNRw:q6VhA7JrKKo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=_viUbslSNRw:q6VhA7JrKKo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=_viUbslSNRw:q6VhA7JrKKo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=_viUbslSNRw:q6VhA7JrKKo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottSeelysBlog?a=_viUbslSNRw:q6VhA7JrKKo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottSeelysBlog?i=_viUbslSNRw:q6VhA7JrKKo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottSeelysBlog/~4/_viUbslSNRw" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ScottSeelysBlog/~3/_viUbslSNRw/Project_Phoenix.aspx</link>
      <author>scott.seely@friseton.com (Scott Seely)</author>
      <comments>http://www.scottseely.com/Blog/10-08-19/Project_Phoenix.aspx</comments>
      <guid isPermaLink="false">eb1b8e38-280b-470d-abda-f30d071701cb</guid>
      <pubDate>Thu, 19 Aug 2010 07:55:31 GMT</pubDate>
    <feedburner:origLink>http://www.scottseely.com/Blog/10-08-19/Project_Phoenix.aspx</feedburner:origLink></item>
  </channel>
</rss>

