<?xml version="1.0" encoding="utf-8"?><rss version="2.0"><channel><title>&lt;ChristophDotNet </title><link>https://weblogs.asp.net:443/cschittko/</link><description>desc="My angle on brackets" /&gt;</description><item><title>Fault Domains, private registries and node setup scripts. My DC/OS acs-engine forks</title><link>https://weblogs.asp.net:443/cschittko/fd-acr-node-setup-dcos-acs-engine</link><description>&lt;p&gt;Customers of mine have asked for some additional capabilities for DC/OS clusters created by acs-engine:&lt;/p&gt;
&lt;p&gt;1.&amp;nbsp;&lt;a href="https://msdn.microsoft.com/en-us/magazine/mt422582.aspx"&gt;Make Azure Fault Domain and Upgrade Domains&lt;/a&gt; available to allow deployments to be FD/UD aware and lower risk of outages and data loss. The fork attaches attributes to each node that reflect the fault domain and the update domain the agent node is in: &lt;a href="https://github.com/xtophs/acs-engine/tree/xtoph-faultdomain"&gt;xtoph/fault-domain fork&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2. &lt;a href="https://dcos.io/docs/1.10/deploying-services/private-docker-registry/"&gt;Enable DC/OS to pull containers from private container registries &lt;/a&gt;or the &lt;a href="https://docs.microsoft.com/en-us/azure/container-registry/container-registry-intro"&gt;Azure Container Registry&lt;/a&gt;&lt;span&gt;:&amp;nbsp;&lt;a href="https://github.com/xtophs/acs-engine/tree/xtoph-registry"&gt;xtoph-registry fork&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;3. Run configuration scripts on agent nodes as part of the provisioning process:&amp;nbsp;&lt;a href="https://github.com/xtophs/acs-engine/tree/agentscript"&gt;agentscript fork&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Te specify registry credentials see &lt;a href="https://github.com/xtophs/acs-engine/tree/xtoph-registry/examples/private-registry"&gt;the docs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To add a custom script:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clone the repo: git clone &lt;a href="https://github.com/xtophs/acs-engine.git"&gt;https://github.com/xtophs/acs-engine.git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;cd acs-engine&lt;/li&gt;
&lt;li&gt;switch to the agentscript fork: git checkout agentscript&lt;/li&gt;
&lt;li&gt;edit parts/dcosagentcustomscript.sh to perform the configuration tasks you require on each agent node&lt;/li&gt;
&lt;li&gt;re-build acs-engine. For example launch the dev environment container using scripts/devenv.sh and then run make build&lt;/li&gt;
&lt;li&gt;edit examples/dcos.json to customize your DNS names and your SSH public key. Perform other edits to customize your cluster architecture.&lt;/li&gt;
&lt;li&gt;run ./bin/acs-engine generate examples/dcos.json to create the ARM templates. The generated templates are in _output/&amp;lt;masterDNSPrefix&amp;gt;&lt;/li&gt;
&lt;li&gt;provision the DC/OS cluster: az group deployment create -g &amp;lt;yourRG&amp;gt; --template-file _output/&amp;lt;masterDNSPrefix&amp;gt;/azuredeploy.json --parameters @_output/&amp;lt;masterDNSPrefix&amp;gt;/azuredeploy.parameters.json.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;HTH&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;</description><pubDate>Mon, 14 Aug 2017 15:16:00 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/cschittko/fd-acr-node-setup-dcos-acs-engine</guid><category>azure</category><category>container</category><category>acs-engine</category><category>dcos</category><category>azure container service</category><category>fault domain</category><category>azure container registry</category><category>acr</category></item><item><title>Legacy ASP.NET 2.0 on IIS and SQL Express in a Windows Container</title><link>https://weblogs.asp.net:443/cschittko/windowscontainer-iis-aspnet20</link><description>&lt;p style="margin: 0in; font-family: Calibri; font-size: 11.0pt;"&gt;Looking for a demo of containerizing a legacy application (ASP.NET 2.0 WebForms can safely be called legacy, right?) into a Windows Server VM with IIS and SQL Express?&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11.0pt;"&gt;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11.0pt;"&gt;Take a look at&amp;nbsp;&lt;a href="https://github.com/xtophs/windows-container-webforms-sqlexpress"&gt;my repo&lt;/a&gt; to build a&amp;nbsp;&lt;a href="https://msdn.microsoft.com/en-us/library/dd184075.aspx"&gt;Windows Server Core&lt;/a&gt;&amp;nbsp;&lt;a href="https://docs.microsoft.com/en-us/virtualization/windowscontainers/about/faq"&gt;container&lt;/a&gt; running the &lt;a href="https://www.asp.net/downloads/starter-kits/the-beer-house"&gt;ASP.NET BeerHouse Starter Kit &lt;/a&gt;to get you started. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;UPDATE: &lt;/strong&gt;The repo now also contains files to deploy the container into a&amp;nbsp;&lt;a href="https://github.com/xtophs/windows-container-webforms-sqlexpress/tree/master/service-fabric"&gt;Service Fabric&lt;/a&gt; or a&amp;nbsp;&lt;a href="https://github.com/xtophs/windows-container-webforms-sqlexpress/tree/master/kubernetes"&gt;kubernetes&lt;/a&gt; cluster to demostrate running a legacy app on a modern application platform.&lt;/p&gt;</description><pubDate>Wed, 26 Jul 2017 20:16:00 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/cschittko/windowscontainer-iis-aspnet20</guid><category>docker</category><category>containers</category><category>aspnet20</category><category>windowsservercore</category><category>sqlexpress</category><category>windowscontainer</category><category>servicefabric</category><category>kubernetes</category></item><item><title>Building kubernetes on Windows 10</title><link>https://weblogs.asp.net:443/cschittko/building-kubernetes-on-windows-10</link><description>&lt;p&gt;Cool find of the day - thanks to @brendandburns.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;You can build kubernetes from scratch in bash on Windows 10, provided you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install docker and make it&amp;nbsp;&lt;a href="https://github.com/xtophs/docker-bash-on-windows"&gt;accessible from bash on Windows 10&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;build from a folder backed by an lxfs volume, i.e. not the c drive mounted as drvfs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;If you try from your User directory, e.g. C:\Users\joe\code\kubernetes, the build will fail because WSL cannot create folders with a ':' in the path during the build process.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/mnt/c/Users/cschittk/repos/kubernetes$ ./hack/dev-push-hyperkube.sh&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;+++ [0530 15:13:25] Verifying Prerequisites....&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mkdir: cannot create directory &amp;acirc;&amp;euro;&amp;tilde;/mnt/c/Users/cschittk/repos/kubernetes/_output/images/kube-build:build-731ef7ee24-5-v1.8.3-1&amp;acirc;&amp;euro;&amp;trade;: Invalid argument&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;!!! [0530 15:13:39] Call tree:&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;!!! [0530 15:13:39]&amp;nbsp; 1: ./hack/dev-push-hyperkube.sh:44 kube::build::build_image(...)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;!!! Error in ./hack/../build/common.sh:411&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;nbsp; Error in ./hack/../build/common.sh:411. '((i&amp;lt;3-1))' exited with status 1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Call stack:&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;nbsp; 1: ./hack/../build/common.sh:411 kube::build::build_image(...)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;nbsp; 2: ./hack/dev-push-hyperkube.sh:44 main(...)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Exiting with status 1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;That's because /mnt/c is a FAT or NTFS backed file system mounted as drivefs, which has a&amp;nbsp;&lt;a href="https://blogs.msdn.microsoft.com/wsl/2017/04/18/file-system-improvements-to-the-windows-subsystem-for-linux/"&gt;few limitations inherent to the underlying file system&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;However, the bash's drive is not enitrely drvfs, even though it lives on the same underlying file system. When you take a closer look, you'll see that / and other folders are mounted using the &lt;a href="https://blogs.msdn.microsoft.com/wsl/2016/06/15/wsl-file-system-support/"&gt;bash's VolFS&lt;/a&gt;, which is much closer to the Linux file system:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$ mount&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;rootfs on / type lxfs (rw,noatime)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;data on /data type lxfs (rw,noatime)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;C: on /mnt/c type drvfs (rw,noatime)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;root on /root type lxfs (rw,noatime)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;home on /home type lxfs (rw,noatime)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img width="503" height="469" src="http://github.com/xtophs/images/raw/master/rootfs.png" /&gt;&lt;/p&gt;
&lt;p&gt;Even though rootfs lives&amp;nbsp;on your NTFS drive at %LocalAppData%\lxss\rootfs, WSL can create those paths:&lt;/p&gt;
&lt;p&gt;&lt;img width="518" height="90" src="http://github.com/xtophs/images/raw/master/kubefolder.png" /&gt;&lt;/p&gt;
&lt;p&gt;and the kubernetes build will succeed in bash on Windows 10&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;</description><pubDate>Wed, 31 May 2017 17:50:10 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/cschittko/building-kubernetes-on-windows-10</guid><category>kubernetes</category><category>containers</category><category>docker</category><category>windows10</category><category>bash</category><category>WSL</category></item><item><title>How many assigned users do i have? The Graph API has the answer</title><link>https://weblogs.asp.net:443/cschittko/how-many-assigned-users-do-i-have-the-graph-api-has-the-answer</link><description>&lt;div style="font-size: 12px;"&gt;
&lt;p&gt;My last post about Azure AD was about enabling &lt;a href="http://weblogs.asp.net/cschittko/setting-up-web-app-multitenant-azure-ad-sample"&gt;single sign-on by letting your customers provision your application into their Azure AD tenant&lt;/a&gt;. SSO is important to make the end user login experience seamless. Who likes to put in credentials all the time.&lt;/p&gt;
&lt;p&gt;As a service provider, you have other interests as well. Quite importantly, you may want to charge for the service your offering. How do you do that when you allow user provisioning in your customers' tenants? You can't simply query your own identity store for how many users are registered because you allowed your customers to administer access in their directory.&lt;/p&gt;
&lt;p&gt;Fortunately, we have the &lt;a href="https://msdn.microsoft.com/en-us/library/azure/dn132599.aspx"&gt;Consent Framework&lt;/a&gt; when we allow a customer to provision an application into their tenant. The customers administrator has to agree to the level of access that the application will have to their directory. In the SSO scenario, the application only needs access to user profiles in the directory to authenticate and read user profile information.&lt;/p&gt;
&lt;p&gt;We can, however, request additional permissions when the app is provisioned to gain access to data that will allow us to report on users with access to the application in each tenant.&lt;/p&gt;
&lt;p&gt;First, we configure the application to require Directory Read Access.&lt;/p&gt;
&lt;p&gt;&lt;img width="910" height="231" alt="" src="https://aspblogs.blob.core.windows.net:443/media/cschittko/Media/Fetcher/fetcher-perms.png" /&gt;&lt;/p&gt;
&lt;p&gt;Now when an administrator provisions the application, it requires consent for read access to the directory in order to get provisioned.&lt;/p&gt;
&lt;p&gt;&lt;img width="903" height="425" alt="" src="https://aspblogs.blob.core.windows.net:443/media/cschittko/Media/Fetcher/fetcher-consent.png" /&gt;&lt;/p&gt;
&lt;p&gt;Now that we have consent to access to the directory we can query the directory with the Graph API. Let's see how that works.&lt;/p&gt;
&lt;p&gt;First, we find the application's &lt;a href="http://www.cloudidentity.com/blog/2013/04/16/the-windows-azure-ad-application-model/"&gt;ServicePrincipal&lt;/a&gt; in the directory. The ServicePrincipal represents the application in the directory and is the entity to which users access grants are assigned to.&lt;/p&gt;
&lt;p&gt;&lt;img width="893" height="296" alt="" src="https://aspblogs.blob.core.windows.net:443/media/cschittko/Media/Fetcher/fetcher-sp.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.cloudidentity.com/blog/2013/04/16/the-windows-azure-ad-application-model/"&gt;Details about the ServicePrincipal&lt;/a&gt;&amp;nbsp;on Vittorio's blog.&lt;/p&gt;
&lt;p&gt;Note that the ServicePrincipal in the customer's directory kept the same displayName and that the appId is the Client ID from the directory where the application was originally published.&lt;/p&gt;
&lt;p&gt;&lt;img width="647" height="169" alt="" src="https://aspblogs.blob.core.windows.net:443/media/cschittko/Media/Fetcher/fetcher-mt.png" /&gt;&lt;/p&gt;
&lt;p&gt;With that knowledge, we can query the graph for the ServicePrincipal, for example with code like this:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ActiveDirectoryClient activeDirectoryClient = new ActiveDirectoryClient(serviceRoot,&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp; () =&amp;gt; AuthenticationHelper.GetTokenFromRefreshTokenAsync(&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cred.RefreshToken));&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;var principals = activeDirectoryClient.ServicePrincipals&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp; .Where(principal =&amp;gt; principal.AppId.Equals("59f88d84-651c-4444-b33c-c587f6812b8f"))&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp; .ExecuteAsync().Result.CurrentPage.ToList();&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The ActiveDirectoryClient class comes from the &lt;a href="http://blogs.msdn.com/b/aadgraphteam/archive/2014/12/12/announcing-azure-ad-graph-api-client-library-2-0.aspx"&gt;Active Directory Graph Client Library&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;From the ServicePrincipal we can query the appRoleAssignedTo navigation property to get the users that are assigned access to that app.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;var sp = principals.FirstOrDefault();&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;var userAssignments = (sp as IServicePrincipalFetcher).AppRoleAssignedTo.ExecuteAsync().Result;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;It's worth pointing out that in order to get the AppRoleAssignments, we have to query via an IServicePrincipalFetcher. The IPagedCollection of AppRoleAssignment property sp.AppRoleAssignedTo is empty when you access it from the ServicePrincipal directly.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;If we're putting all this together, we can issue Graph API queries to all tenants that provisioned the application to build a report on authorized users in each of those tenants. I've built a little page to show me the users from various tenants that have access to my application.&lt;/p&gt;
&lt;p&gt;Btw., the same pattern with the Fetcher also applies to other navigation properties, e.g. in order to get the oauth2PermissionGrants, you'd again query using an IServicePrincipalFetcher:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;var fetcher = sp as IServicePrincipalFetcher;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;IPagedCollection&amp;lt;IOAuth2PermissionGrant&amp;gt; grants = fetcher.Oauth2PermissionGrants.ExecuteAsync().Result;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Now you can query and report on the users in tenants that use your applications without having to build your own tracking system. That's quite essential when you're looking to bill for your service.&lt;/p&gt;
&lt;/div&gt;</description><pubDate>Wed, 02 Sep 2015 18:02:17 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/cschittko/how-many-assigned-users-do-i-have-the-graph-api-has-the-answer</guid><category>azure</category><category>azure ad</category><category>aad</category><category>multitenant</category><category>graph api</category></item><item><title>Managing Azure Machine Learning Service with API Management</title><link>https://weblogs.asp.net:443/cschittko/managing-azure-machine-learning-service-with-api-management</link><description>&lt;div style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;
&lt;p&gt;&lt;a href="http://azure.microsoft.com/en-us/services/machine-learning/"&gt;Azure's Machine Learning service&lt;/a&gt; is one of my favorite examples how the cloud makes things easy, that would be really hard to do on premises. You get an idea of the mind boggling things you can build with pattern recognition, sentiment analysis, image processing, etc. when you browse the &lt;a href="https://gallery.azureml.net/"&gt;ML Gallery&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;However, once you've built and &lt;a href="https://azure.microsoft.com/en-us/documentation/articles/machine-learning-publish-web-service-to-azure-marketplace/"&gt;published your ML Web Service in Azure&lt;/a&gt;, then what?&lt;/p&gt;
&lt;p&gt;Of course you can integrate your new algorithm in your own applications. But what if you also want to publish an API to monetize your unique algorithm through an additional channel?&lt;/p&gt;
&lt;p&gt;Publishing an API takes more than making your service available through a URL.&lt;/p&gt;
&lt;p&gt;There are a few additional considerations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Restrict access you paying customers.&lt;/li&gt;
&lt;li&gt;Offering a trial version with a limited number of API calls to win new customers.&lt;/li&gt;
&lt;li&gt;Reporting how your API is used and by who to improve your API&lt;/li&gt;
&lt;li&gt;Reportng for billing.&lt;/li&gt;
&lt;li&gt;Limiting the call volume on the service to ensure all customers have a consistent experience&lt;/li&gt;
&lt;li&gt;Tracking usage for capacity planning.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That's a pretty long TODO list. The good news is that Azure API Management already provides all that functionality. You just need to front end your Azure ML Web Service with an API Management endpoint, configure the service and voila, you're up an running.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s take a closer look how this works. We start with a published Machine Learning Web Service. This one is based on the &lt;a href="https://gallery.azureml.net/Experiment/1d18eae422f24185bc0844d5d8d6eec9?share=1"&gt;Credit Risk Prediction sample&lt;/a&gt; from the gallery:&lt;/p&gt;
&lt;p&gt;&lt;img width="933" height="515" alt="" src="https://aspblogs.blob.core.windows.net:443/media/cschittko/Media/apim-ml-web%20service.png" /&gt;&lt;/p&gt;
&lt;p&gt;The service already comes with some API documentation, similar to what's available in&amp;nbsp;the API Management &lt;a href="https://azure.microsoft.com/en-us/documentation/articles/api-management-customize-portal/"&gt;Developer Portal&lt;/a&gt;. It provides the minimum necessary documentation to call the service, but it doesn't come with the rich analytics the access control capabilities or the policy engine offered by API Management.&lt;/p&gt;
&lt;p&gt;The documentation, which we get when we click on the Request/Response link, provides most of the information we need to configure API Management to front end the ML web service. You need the Endpoint Address for the Service to set up the API:&lt;/p&gt;
&lt;p&gt;&lt;img width="736" height="113" alt="" src="https://aspblogs.blob.core.windows.net:443/media/cschittko/Media/apim-ml-endpoint.png" /&gt;&lt;/p&gt;
&lt;p&gt;The OData Endpoint goes into the Web service URL field. The Web API URL Suffix identifies this service within your API namespace. In this case we'll call it CreditRisk:&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &lt;img width="432" height="279" alt="" src="https://aspblogs.blob.core.windows.net:443/media/cschittko/Media/apim-ml-api-settings.png" /&gt;&lt;/p&gt;
&lt;p&gt;You'll also&amp;nbsp;notice an additional benefits of API management. Your public API is really yours. You're not bound by the URL format defined by Azure ML. Instead of a URL cluttered with confusing identifiers, your URL is simple and its name reflects the capability you're providing. You&lt;/p&gt;
&lt;p&gt;Next we define the specifics of the &lt;a href="https://azure.microsoft.com/en-us/documentation/articles/api-management-howto-add-operations/"&gt;API operation&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;When look at the request documentation you'll notice that we the Web service URL didn't include the resource and the query string:&lt;/p&gt;
&lt;p&gt;&lt;img width="620" height="106" alt="" src="https://aspblogs.blob.core.windows.net:443/media/cschittko/Media/apim-ml-url.png" /&gt;&lt;/p&gt;
&lt;p&gt;First, make sure you select the POST verb. The URL template allows us to define an operation name that expresses the funcntion performed by the operation. Instead of the generic name "execute" we can name the operation "score" to&amp;nbsp;make&amp;nbsp;the intent clear and avoid&amp;nbsp;naming confusion with other ML-based services.&lt;/p&gt;
&lt;p&gt;&lt;img width="404" height="265" alt="" src="https://aspblogs.blob.core.windows.net:443/media/cschittko/Media/apim-ml-operation.png" /&gt;&lt;/p&gt;
&lt;p&gt;The URL Rewrite template allows us to simplify the operation signature further. We can move the ML specific parameters&amp;nbsp;&lt;b&gt;api-version&amp;nbsp;&lt;/b&gt;and &lt;strong&gt;details&lt;/strong&gt;&amp;nbsp;into the rewrite template since they are meaningless to your customer.&lt;/p&gt;
&lt;p&gt;&lt;img width="806" height="572" alt="" src="https://aspblogs.blob.core.windows.net:443/media/cschittko/Media/apim-ml-operation-body.png" /&gt;&lt;/p&gt;
&lt;p&gt;Now we got the API and the operation configured. Make sure you also &lt;a href="https://azure.microsoft.com/en-us/documentation/articles/api-management-howto-add-products/"&gt;add the API to a Product&lt;/a&gt; to enable consumption of the API.&lt;/p&gt;
&lt;p&gt;Now, let's test the setup from the Developer Portal: Try it (by clicking on the big blue "Try It" button)&lt;/p&gt;
&lt;p&gt;&lt;img width="415" height="277" alt="" src="https://aspblogs.blob.core.windows.net:443/media/cschittko/Media/apim-ml-try-1.png" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Once you navigated to the Try API page, double check that the Ocp-Apim-Subscription-Key is populated from your profile. It not, you must still &lt;a href="https://azure.microsoft.com/en-us/documentation/articles/api-management-howto-add-products/#make-visible"&gt;associate the API with a Product&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Note that Content-Type is set to application/json, the Request Body was prepopulated from the representation that we provided earlier and the &lt;a href="https://azure.microsoft.com/en-us/documentation/articles/api-management-howto-api-inspector/"&gt;super cool Trace&lt;/a&gt; is turned on so we can troubleshoot any problems. Now click Send and voila &amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;401 Unauthorized??&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt; &lt;img width="481" height="577" alt="" src="https://aspblogs.blob.core.windows.net:443/media/cschittko/Media/apim-ml-401.png" /&gt; &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Well &amp;hellip; I guess we're not quite there yet. Let's take another look at the Web service page to see if we find a hint about how we authorize the call:&lt;/p&gt;
&lt;p&gt;&lt;img width="757" height="138" alt="" src="https://aspblogs.blob.core.windows.net:443/media/cschittko/Media/apim-ml-headers.png" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;We still need to authenticate/authorize API management as a valid caller of the Web service by adding an Authorization header with a &lt;a href="http://self-issued.info/docs/draft-ietf-oauth-v2-bearer.html"&gt;bearer token&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The token can be found in the Azure Management Portal at&lt;/p&gt;
&lt;p&gt;Machine Learning -&amp;gt;&lt;em&gt;&amp;lt;Your Service&amp;gt;&lt;/em&gt;-&amp;gt;Web Services -&amp;gt;&lt;em&gt;&amp;lt;Your Web Service&amp;gt;&lt;/em&gt;-&amp;gt; default endpoint.&lt;/p&gt;
&lt;p&gt;All the way in the lower right corner of the page, you'll find the API KEY:&lt;/p&gt;
&lt;p&gt;&lt;img width="915" height="577" alt="" src="https://aspblogs.blob.core.windows.net:443/media/cschittko/Media/apim-ml-key.png" /&gt;&lt;/p&gt;
&lt;p&gt;Now &amp;hellip; for the last question &amp;hellip; How do you get API management to pass that token to the Web service?&lt;/p&gt;
&lt;p&gt;The same thing we do with every API, Pinky. Add &lt;a href="https://msdn.microsoft.com/library/azure/dn894081.aspx"&gt;Policies&lt;/a&gt;! So back in the API Management Administrator portal we navigate to Policies and select our API operation. Since the Bearer token needs to be passed as a HTTP Header, the Set HTTP header policy sounds promising.&lt;/p&gt;
&lt;p&gt;Add the Authorization header and copy and paste the API KEY as the value.&lt;/p&gt;
&lt;p&gt;&lt;img width="723" height="548" alt="" src="https://aspblogs.blob.core.windows.net:443/media/cschittko/Media/apim-ml-policy.png" /&gt;&lt;/p&gt;
&lt;p&gt;Save and try Send in the Developer Portal one more time.&lt;/p&gt;
&lt;p&gt;Now that we have presented valid credentials to invoke the Web service, Azure ML runs the algorithm and scores the values we passed in.&lt;/p&gt;
&lt;p&gt;&lt;img width="617" height="462" alt="" src="https://aspblogs.blob.core.windows.net:443/media/cschittko/Media/apim-ml-200.png" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Now that we have front-ended the ML Web Service with API Management, we have much finer grained access control and analytics capabilities as we expose the algorithm as a commercial API.&lt;/p&gt;
&lt;/div&gt;</description><pubDate>Tue, 11 Aug 2015 15:00:54 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/cschittko/managing-azure-machine-learning-service-with-api-management</guid><category>azure</category><category>machine learning</category><category>api management</category></item><item><title>Setting up Web App Multitenant Azure AD Sample</title><link>https://weblogs.asp.net:443/cschittko/setting-up-web-app-multitenant-azure-ad-sample</link><description>&lt;p&gt;Multitenancy in Azure AD is a very cool concept with the &lt;a href="https://msdn.microsoft.com/en-us/library/azure/dn132599.aspx"&gt;Consent Framework&lt;/a&gt; if you're and ISV or a Service Provider building a cloud service that you're looking to monetize.&lt;/p&gt;
&lt;p&gt;When you're building a service, you inevitably have to control access to your services with user identities. But that brings on the headaches and extra cost of identity management:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How do I turn off access when a registered user leaves my customer's company so I can turn off access?&lt;/li&gt;
&lt;li&gt;How much does your helpdesk provider charges for a simple password reset call?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Multitenancy in Azure AD is a way around that. It also allows your customer to take full advantage of their investments into managing corporate identities for &lt;a href="https://blogs.office.com/2014/04/15/synchronizing-your-directory-with-office-365-is-easy/"&gt;accessing Office 365&lt;/a&gt; or advanced security features like &lt;a href="https://blogs.office.com/2014/04/15/synchronizing-your-directory-with-office-365-is-easy/"&gt;Advanced Threat Analytics&lt;/a&gt; or &lt;a href="http://blogs.microsoft.com/cybertrust/2015/07/23/cloud-security-controls-series-azure-ad-privileged-identity-management/"&gt;Privileged Identity Management&lt;/a&gt;. It also doesn't cost you, the service provider anything, it's up to your customer to decide which Azure AD capabilities they require, what they already have and how much they want to pay.&lt;/p&gt;
&lt;p&gt;You can start exploring multi tenancy in Azure with the &lt;a href="https://github.com/AzureADSamples/WebApp-MultiTenant-OpenIdConnect-DotNet"&gt;WebApp-MultiTenant-OpenIdConnect-DotNet sample&lt;/a&gt; on github.&lt;/p&gt;
&lt;p&gt;Simply:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clone the repo&lt;/li&gt;
&lt;li&gt;Follow the &lt;a href="https://github.com/AzureADSamples/WebApp-MultiTenant-OpenIdConnect-DotNet#how-to-run-this-sample"&gt;configuration steps&lt;/a&gt; for the App&lt;/li&gt;
&lt;li&gt;Configure a &lt;a href="https://msdn.microsoft.com/en-us/library/vstudio/cc716756(v=vs.100).aspx"&gt;connection string the Entity Framework data store&lt;/a&gt; (see below)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blogs.technet.com/b/cbernier/archive/2013/09/24/deploy-your-web-application-to-windows-azure-from-with-visual-studio.aspx"&gt;Publish to an Azure Website&lt;/a&gt; (or &lt;a href="http://blogs.msdn.com/b/microsoft_student_developer_blog/archive/2015/07/20/welcome-to-visual-studio-2015-with-azure.aspx"&gt;publish using Visual Studio 2015&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Configuring the Entity Framework data store is super simple, too. Since you're hosting the app in Azure it makes sense to use a Azure SQL Database as the data store for your app. A &lt;a href="https://azure.microsoft.com/en-us/documentation/articles/sql-database-service-tiers/"&gt;Basic Edition&lt;/a&gt; will do just fine since this is just a sample app you're using to explore the functionality.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Once you &lt;a href="https://azure.microsoft.com/en-us/documentation/articles/sql-database-get-started/"&gt;created the database&lt;/a&gt;, you add a connection string setting to the &lt;code&gt;web.config&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;configuration&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;connectionStrings&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp; &amp;lt;add name="TodoListWebAppContext"&lt;/code&gt;&lt;br /&gt;&lt;code&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; connectionString="Server=tcp&lt;i&gt;:&lt;/i&gt;&lt;b&gt;&lt;i&gt;&amp;lt;yourdbserver&amp;gt;&lt;/i&gt;&lt;/b&gt;&lt;i&gt;.&lt;/i&gt;database.windows.net,1433;&lt;/code&gt;&lt;br /&gt;&lt;code&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Database=&lt;b&gt;&lt;i&gt;&amp;lt;yourdatabase&amp;gt;&lt;/i&gt;&lt;/b&gt;;&lt;/code&gt;&lt;br /&gt;&lt;code&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; User ID=&lt;b&gt;&lt;i&gt;&amp;lt;adminuser&amp;gt;&lt;/i&gt;&lt;/b&gt;@&lt;b&gt;&lt;i&gt;&amp;lt;yourserver&amp;gt;&lt;/i&gt;&lt;/b&gt;;&lt;/code&gt;&lt;br /&gt;&lt;code&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Password=&lt;b&gt;&lt;i&gt;&amp;lt;youradminpassword&amp;gt;&lt;/i&gt;&lt;/b&gt;;&lt;/code&gt;&lt;br /&gt;&lt;code&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Trusted_Connection=False;&lt;/code&gt;&lt;br /&gt;&lt;code&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Encrypt=True;&lt;/code&gt;&lt;br /&gt;&lt;code&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Connection Timeout=30;"&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; providerName="System.Data.SqlClient"/&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;/connectionStrings&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;/configuration&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;That's all you need to get going with the sample.&lt;/p&gt;
&lt;p&gt;There is one more thing to note when you Sign Up, i.e. you go through the scenario where your customer's provides consent to provision the app into their own Azure AD tenant to allow their users to access the app.&lt;/p&gt;
&lt;p&gt;You trigger the consent code path by checking the little check box on the Sign Up screen. This indicates that you're signing in with the admin account of &lt;i&gt;another&lt;/i&gt; Azure AD directory. This can be &lt;a href="http://blogs.technet.com/b/ad/archive/2013/11/08/creating-and-managing-multiple-windows-azure-active-directories.aspx"&gt;another directory within the same subscription&lt;/a&gt; to simplify things for testing purposes, or a directory in an entirely different tenant to simulate the real scenario of your customer signing up.&lt;/p&gt;
&lt;p&gt;&lt;img width="369" height="344" alt="" src="https://aspblogs.blob.core.windows.net:443/media/cschittko/Media/multitenant-signup.png" /&gt;&lt;/p&gt;
&lt;p&gt;The app will redirect you to the Azure AD sign in page. When you signed in with an account that has the Global Administrator or Service Administrator role assigned, you'll also get the consent page as part of the sign in flow.&lt;/p&gt;
&lt;p&gt;&lt;img width="698" height="367" alt="" src="https://aspblogs.blob.core.windows.net:443/media/cschittko/Media/multitenant-consent.png" /&gt;&lt;/p&gt;
&lt;p&gt;Now when you take a look at the Applications my company uses in the directory you see that the app has been provisioned:&lt;/p&gt;
&lt;p&gt;&lt;img width="730" height="302" alt="" src="https://aspblogs.blob.core.windows.net:443/media/cschittko/Media/multitenant-provisioned.png" /&gt;&lt;/p&gt;
&lt;p&gt;Be sure you're signing in with a user account that's homed in that directory, i.e. NOT the Microsoft ID you may be using to sign into the Azure Management portal. When you do, you get AADSTS50020: User account '&lt;b&gt;&amp;lt;user&amp;gt;&lt;/b&gt;@live.com' from external identity provider 'live.com' is not supported for application &lt;b&gt;&amp;lt;Client ID&amp;gt;'. The account needs to be added as an external user in the tenant. Please sign out and sign in again with an Azure Active Directory user account.&lt;/b&gt;&lt;/p&gt;</description><pubDate>Tue, 04 Aug 2015 12:50:00 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/cschittko/setting-up-web-app-multitenant-azure-ad-sample</guid><category>azure</category><category>web app</category><category>app service</category><category>azure ad</category><category>multitenant</category><category>consent</category></item><item><title>Connecting EventHubs to API Management</title><link>https://weblogs.asp.net:443/cschittko/connecting-eventhubs-to-api-management</link><description>&lt;p&gt;In the previous posts, we looked at:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://weblogs.asp.net/cschittko/azure-api-management-who-s-calling" target="_blank"&gt;Authenticating callers using Groups in API Management Policies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://weblogs.asp.net/cschittko/api-management-plays-well-with-other-azure-services" target="_blank"&gt;Exposing Strongly Typed APIs for Azure Queues with API Management Policies&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the third article of the Azure API Mangement series, my esteemed (highly esteemed) colleage &lt;a href="https://www.linkedin.com/in/alibaloch" target="_blank"&gt;Ali Baloch&lt;/a&gt;&amp;nbsp;documented how to front-end Event Hubs with API Management with a next-to-no-code solution. Thank You, Ali.&lt;/p&gt;
&lt;p&gt;&lt;span lang="EN" style="mso-ansi-language: EN;"&gt;&lt;span&gt;We're assuming you already have:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="&amp;quot;http://azure.microsoft.com/en-us/documentation/articles/service-bus-event-hubs-csharp-ephcs-getstarted/"&gt;Event hub already created.&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://azure.microsoft.com/en-us/documentation/articles/api-management-get-started/"&gt;API Management instance already created&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Azure API Management allows you to take any backend and invoke any HTTP verb POST/GET/PUT/DELETE requests and also provide security, throttling and scaling capabilities.&lt;/p&gt;
&lt;p&gt;EventHubs can be invoked using POST request which has following three main parts: (see &lt;a href="https://msdn.microsoft.com/en-us/library/azure/dn790664.aspx"&gt;MSDN&lt;/a&gt;)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://msdn.microsoft.com/en-us/library/azure/hh780786.aspx" target="_blank"&gt;URL: Where to send the message.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Headers: Authentication/Authorization information using &lt;a href="https://msdn.microsoft.com/en-us/library/azure/dn170477.aspx" target="_blank"&gt;Shared Access Signatures (SAS)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Body: Actual message&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Procedure:&lt;/p&gt;
&lt;p&gt;Steps:&lt;/p&gt;
&lt;p&gt;Create an API and specify web service URL of EH.&lt;/p&gt;
&lt;ol style="list-style-type: decimal; direction: ltr;"&gt;
&lt;li&gt;
&lt;p&gt;http{s}://{serviceNamespace}.servicebus.windows.net/{eventHubPath}/publishers/{deviceId}/messages&lt;/p&gt;
&lt;p&gt;&lt;img width="936" height="335" src="data:image/png;base64,/9j/4AAQSkZJRgABAQEAkACQAAD/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4NDhwQEBw7KCIoOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozv/wAARCAFPA6gDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD2aobqeK2hMsrYUcVNWVrokEdvKqlo45Q0g7baAJrbUFuJVj8mRARkEjg1bWSNzhXViOuD0rM1K/WTTpVsZA8hUH5Oqr3NUcQrNENPkLMY287n2/xoA6FJI2OEdWPsaQSRkhQ6k9hmubt4hbx6bLGZMuCHye9IkLRWFtOhczG4YE57ZNAHTb13bdw3f3c802SeKMMXkVSoyQT0rmreK5ncs0wjut5PzN82PTFWLZbW5tZ/tPN1lgVY8+1AGpHqKzpFJbKZo3baXB6Va8xN5UOu/wDu55rm4AItOsRbsEdJjuVT3oVozZCUSP8A2jvGV79fT6UAdJ5katjeobsM08YGa5Qwl7W8uizmdZhgE9K6iAkwR55JUZ/KgCWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikozQAtFJmigBaKTNAOaAFooooAKjmeNVxIwAPHI61JVecZmiyMjnigBiPaISVCDAwWC4/ChWs0/wBX5aEjqF61OVjCkEKFHUHpTV8oklShx3HYUAME1t6qAvQFelAltQoGVwDxx3pyNBKhaNldc4JXnmn7E4G0e3FAEG+zMm/Cb+u8rz+dLvtC+8BCx6Hb1qUqueFGR7UjeUq8bF5xz0zQBEGs1GQIxzn7vejzLXzAwEe8jJO3nH1qbYvHygjPHHSneWn90flQBAJbQgqdnPXjrTxcwAcSDHapPLT+4Pyo8tP7g/KgBn2qD/noKPtUH/PQU/y0/uD8qPLT+4PyoAZ9qg/56Cj7VB/z0FP8tP7g/Kjy0/uD8qAGfaoP+ego+1Qf89BT/LT+4Pyo8tP7g/KgBn2qD/noKPtUH/PQU/y0/uD8qPLT+4PyoAZ9qg/56Cj7VB/z0FP8tP7g/Kjy0/uD8qAGfaoP+ego+1Qf89BT/LT+4Pyo8tP7g/KgBn2qD/noKPtUH/PQU/y0/uD8qPLT+4PyoAZ9qg/56Cj7VB/z0FP8tP7g/Kjy0/uD8qAGfaoP+ego+1Qf89BT/LT+4Pyo8tP7g/KgBn2qD/noKPtUH/PQU/y0/uD8qPLT+4PyoAZ9qg/56Cj7VB/z0FP8tP7g/Kjy0/uD8qAGfaoP+ego+1Qf89BT/LT+4Pyo8tP7g/KgBn2qD/noKPtUH/PQU/y0/uD8qPLT+4PyoAZ9qg/56Cj7VB/z0FP8tP7g/Kjy0/uD8qAGfaoP+ego+1Qf89BT/LT+4Pyo8tP7g/KgBn2qD/noKPtUH/PQU/y0/uD8qPLT+4PyoAZ9qg/56Cj7VB/z0FP8tP7g/Kjy0/uD8qAGfaoP+ego+1Qf89BT/LT+4Pyo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5glmYlEjG5kKo3cZoA6YXtsYhKJlKE43VYBzXJSsptHkYiOWS7G+P/nniurQhkXBDcdjQA+iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACop1ieNo5cbXGCD3FS1WuQGkjBAOaAIGsdOezW0ZEMKnKr6Us9rY3G3ewDKMBg2DirXkRf3BR9nj/uD8qAKc1jp04TzNpaNdqtnkCp4UtbeLyoSiL6A9al+zx/3B+VH2eP+4PyoAqxWdhFv27PnGDk9PpSR2VhGjIrAoy7SpbjFW/Ij/uD8qPs8f8AcH5UAQTwWNzAsE2xo1xhSemKV4rN33t5ZbbtyfSpvs8f9wflR5EX9wflQBTjsdPjDqpUq4wVJ4H0qS2gtbQMsUvDcnLZx9KseRF/dH5UfZ4/7g/KgCrcWtjcuHkYBhxlWxn604wWbGLJQeUfkwelWPIi/uD8qPIj/uD8qAKc1jp87u8mws/3jnrU1ulrartjk492qb7PH/cH5UfZ4/7g/KgBfPi/56L+dHnxf89F/Ok+zx/3B+VHkR/3B+VAC+fF/wA9F/Ojz4v+ei/nSeRF/cH5UeRF/cH5UAL58X/PRfzo8+L/AJ6L+dJ5EX9wflR9nj/uD8qAF8+L/nov50efF/z0X86TyIv7o/KjyI/7g/KgBfPi/wCei/nR58X/AD0X86T7PH/cH5UfZ4/7g/KgBfPi/wCei/nR58X/AD0X86TyIv7g/Kj7PH/cH5UAL58X/PRfzo8+L/nov50n2eP+4Pyo8iL+4PyoAXz4v+ei/nR58X/PRfzpPs8f9wflR5Ef9wflQAvnxf8APRfzo8+L/nov50n2eP8AuD8qPs8f9wflQAvnxf8APRfzo8+L/nov50n2eP8AuD8qPs8f9wflQAvnxf8APRfzo8+L/nov50n2eP8AuD8qPIi/uD8qAF8+L/nov50efF/z0X86TyIv7o/KjyI/7g/K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lsEtS3tyx1G7jN1IhRFMSoep70Ab2fpxS/yrG0y6u5dSaGdjtWLOD1zU9vcSPrdzAzkxpGCF9DmgDSz+dJ3549K526vrkC43XDRoLhU3KeVFON3OlvfG3uHeCMDZIx5DelAHRUdBTImJgRj1Kgn8qz01cy3EixwExxHEjFsED1xQBo4wOuADmnZGM1i3Wozz6fPLHbssRX5ZN3v6UWesPDHDHeQmPfHuVs5zQBtUVkLr6bxuiISRC8ZDZyB6+lNXXZmaBfsLKZ8lPmoA2f50VkjXVa3UpEPPZygjZgOR71c0+/S+iYgbXQ7XXOcH60AW6KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACq1/ai9spbcnG9cA+hqzTWIAJPQUAYEnh2RtDi08T4kRwzP3Iqzc6QfOgntfLZo4/LKuOCKnOt2HBMpHbhSaVdYsGZQJupwPlI5oArvptytzDc2jRxtGhRowPlqxZWT2Vs6790kpJY+h9qvdKMc55oAyY9ChFg0Mm153JZpiOd3Y1LYaa0E7zXLLK7KqhiPStDPWjqcZ4oApxWDJq8l7vyrptA9Kju7Kdb8XlpIBJs2uh/iFaI7DofSjueORQBkjRi9vh5AWeYSyAjqfSkuNKldrhbeRUiuFG5NvRhVqXVrOKVozLl1PIAzTf7Z08kZm2knCkgjNAElmLtEK3RUhQAuzrVO40ua5u/McpGoJ+ZDywPXNa4OeQKCAe2aAMhNOvRayWXmp5BGEbvinTaO8/2dTKAkKEZ28nNagP0GOtGfegDJh0mSOB7Zlj8vYVRwPmqSPTHWa0fzcm3XaT61p8YHOPTNJj6Z70AYp0ORT5uUknSUum4cYPatOxg8iEqyIrE5OwcVaooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACo5jiJ/901JTHG5SvqMUAUNGVf7NRtoyWPOPem60q/ZYztGRKuMfWo4bDU7aPyobtAm4kZTNLLp+oXJjW4u0ZFYMQExQBd1BmSwuHQ7WVCQRWNPq7nRhtEokwo37f1rcuovtNtJDnHmKQDVaTTzLpS2RmI4A3AelAFCe3b+1rRBcS7JFyRu9qdc2nl6ta24uZwkgYthvyq89hvvbe534EK4x60+Wz83UILrfxErDb65oAwppWF1fxi5uDPGyiFQa6K1MjW0RmGJCoLVBa2At7u5uGYOZ2BGRyOKtk4znnntQByF14qs/DmpyR6jbstvPIc3YXKoewNZVnNdeKNUm8RGR4tKtz5VrGP+WnPLV1N5oUt2lzbTNHJazklkdN3FEOi3UVhFZJcRw28RH7uOMfd9KANhiRbsw6hOPyrAi1WUaHcErKZV3YcCuhK5iKZxxtzVGPTTHpUtl5pJk3fNj1oAz7uJnh05/OlDXDqHw2M8U/VbZre4sVjuJgJJCG+bqMVfm07zILSNpM/Z2DbvoKde2P2yW2bfjyH3fWgDJvWSHUZYpLifCRAxqvOTU8Op3cRhtJI184ruLOcBh/jWgLILqUl5nO9AuPSoNR0+S9IUuojx/c5X6UAaYPAOKWmouxAM5wMUoOaAFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKSgBaKTdzQWxjjrQAtFJmgtjntQAUtFITigBaKbu9sU6gAopKM0AFLSZ9qM+1AC0lFGfzoAWikzmjNAC0UlFAC0UmaM0ALRSZBozmgBaKTNGaAFopM0tABRRRQAUUmaAc0ALRRTc+1ADqKQHNLQAUUmaM0ALRSZozz0oAWik3UZ/CgBaKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAqvd3cVogeYkL7DNT1W1IA6fPkdEPagCuNasysbqWKyvtHy1auLhYI97K7D/ZFYF3GraFYKG27pVywFLNLNaG6t45m2qUKhv4cnk0AdGDkBumRxmopLhY51jKuWboQOKyEkaHVgl3I0jSt+6dDwPY1PqU0yarbxRSlN0Z47GgDYpDWLo8jLdNbzl/tCplmJyH5qnfzXUdzc6fBM3nS/vI2PoOooA37m6itvL8z/AJavsH1qeuRklfVUhm85liaZYwD2IHJq21x9jnubJnlkTjYM+vvQBvzzx26CSRtozilaRI4jIzfKBnNcnPvmsrm3nk3LBOmArZCg+9bt7CjaHLGpynlcHPNAFkX0BmijVsmYZWrIPFctDaRySaZGsh2FDkg8mmrd3LbLQtK8XnOhYcHjpzQB1LuqIXboBzVdtQtUtUuWlAhfAV/Xmq2lrdLbSRXe1hnEYByce9YRhNy0uh4z9mcyAei9v1oA6trmJZUh3gSSAlB64pLm4S1gaaX7ijk1zMN7JPHcX0K75LSIRqff+I06YXKadO7ErbSRBpCTk5PegDqVYOgYdCM1HcXEVrA007bEXqTWLbD7NqFmlvcNIsyfvUzkAY4NP1qVri7g0+KIyj78ij0FAGnLe28ECzySARtja31pg1O0aPzPNACnn8a59ppPsK2kkaiaC5ACN3z0qfVLSSO1e6n2ozOi7VHGM0Ab808UEQeRwqsQAfc9KWSeKIxh3AMhwo9TWfr2P7MUkZAkUmo9RkjefTthDENu4OcDFAFyPVbSSYxrKM7tv41YiuIpmdY2DGM4b61zERZreNZo41tJLjmVeq4PBrV0hlF1eguuDJwc9qANCW4SKSOMq5LnjAqxWVqUsiX1kkblRIxUkVW0x2j1Bre4d2uOpkByrCgDeorCuXN3qdxDNdGBIEBQA4yfWqdhPLerbW9x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" border="0" v:shapes="_x0000_i1026" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;(Optional) create a product and add API in the product.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a policy for API. This is needed to add SAS security headers. For example&lt;/p&gt;
&lt;p&gt;&lt;span style="color: #1f497d; font-size: 8pt;"&gt;&amp;lt;policies&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="color: #000000; font-family: 'Calibri',sans-serif; font-size: 11pt; font-style: normal; font-weight: normal; margin-top: 0in; margin-bottom: 0pt;"&gt;&lt;span style="color: #1f497d; font-size: 8pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;inbound&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="color: #000000; font-family: 'Calibri',sans-serif; font-size: 11pt; font-style: normal; font-weight: normal; margin-top: 0in; margin-bottom: 0pt;"&gt;&lt;span style="color: #1f497d; font-size: 8pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;set-header name="Authorization" exists-action="override"&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="color: #000000; font-family: 'Calibri',sans-serif; font-size: 11pt; font-style: normal; font-weight: normal; margin-top: 0in; margin-bottom: 0pt;"&gt;&lt;span style="color: #1f497d; font-size: 8pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;&amp;lt;![CDATA[SharedAccessSignature sr=sb%3a%2f%2fali-eh-ns.servicebus.windows.net%2fali-eh%2fpublishers%2fhome&amp;amp;sig=wnLzBidpLnsJBZQzNpHbRl%2bSdasfdsafa%3d&amp;amp;se=1787325230&amp;amp;skn=SendListenPolicy]]&amp;gt;&amp;lt;/value&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="color: #000000; font-family: 'Calibri',sans-serif; font-size: 11pt; font-style: normal; font-weight: normal; margin-top: 0in; margin-bottom: 0pt;"&gt;&lt;span style="color: #1f497d; font-size: 8pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/set-header&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="color: #000000; font-family: 'Calibri',sans-serif; font-size: 11pt; font-style: normal; font-weight: normal; margin-top: 0in; margin-bottom: 0pt;"&gt;&lt;span style="color: #1f497d; font-size: 8pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;set-header name="Content-Type" exists-action="override"&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="color: #000000; font-family: 'Calibri',sans-serif; font-size: 11pt; font-style: normal; font-weight: normal; margin-top: 0in; margin-bottom: 0pt;"&gt;&lt;span style="color: #1f497d; font-size: 8pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;&amp;lt;![CDATA[application/atom+xml;type=entry;charset=utf-8]]&amp;gt;&amp;lt;/value&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="color: #000000; font-family: 'Calibri',sans-serif; font-size: 11pt; font-style: normal; font-weight: normal; margin-top: 0in; margin-bottom: 0pt;"&gt;&lt;span style="color: #1f497d; font-size: 8pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/set-header&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="color: #000000; font-family: 'Calibri',sans-serif; font-size: 11pt; font-style: normal; font-weight: normal; margin-top: 0in; margin-bottom: 0pt;"&gt;&lt;span style="color: #1f497d; font-size: 8pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;base /&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="color: #000000; font-family: 'Calibri',sans-serif; font-size: 11pt; font-style: normal; font-weight: normal; margin-top: 0in; margin-bottom: 0pt;"&gt;&lt;span style="color: #1f497d; font-size: 8pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/inbound&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="color: #000000; font-family: 'Calibri',sans-serif; font-size: 11pt; font-style: normal; font-weight: normal; margin-top: 0in; margin-bottom: 0pt;"&gt;&lt;span style="color: #1f497d; font-size: 8pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;outbound&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="color: #000000; font-family: 'Calibri',sans-serif; font-size: 11pt; font-style: normal; font-weight: normal; margin-top: 0in; margin-bottom: 0pt;"&gt;&lt;span style="color: #1f497d; font-size: 8pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;base /&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="color: #000000; font-family: 'Calibri',sans-serif; font-size: 11pt; font-style: normal; font-weight: normal; margin-top: 0in; margin-bottom: 0pt;"&gt;&lt;span style="color: #1f497d; font-size: 8pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/outbound&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="color: #000000; font-family: 'Calibri',sans-serif; font-size: 11pt; font-style: normal; font-weight: normal; margin-top: 0in; margin-bottom: 0pt;"&gt;&lt;span style="color: #1f497d; font-size: 8pt;"&gt;&amp;lt;/policies&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Make sure &lt;i&gt;sr&lt;/i&gt; and &lt;i&gt;sig&lt;/i&gt; are hex encoded and added as CDATA.&lt;/p&gt;
&lt;p&gt;To test the API go to developer portal which looks like following:&lt;/p&gt;
&lt;p style="margin: 0in 0in 0pt;"&gt;&lt;img width="450" height="422" src="data:image/png;base64,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" border="0" v:shapes="_x0000_i1025" /&gt;&lt;/p&gt;
&lt;p&gt;Other useful links:&lt;/p&gt;
&lt;ul style="list-style-type: disc; direction: ltr;"&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://azure.microsoft.com/en-us/documentation/articles/api-management-get-started/"&gt;http://azure.microsoft.com/en-us/documentation/articles/api-management-get-started/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://blogs.endjin.com/2015/02/send-data-into-azure-event-hubs-using-web-apis-httpclient/"&gt;https://blogs.endjin.com/2015/02/send-data-into-azure-event-hubs-using-web-apis-httpclient/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Event Hub Signature Generator:&lt;a href="https://github.com/sandrinodimattia/RedDog/releases/tag/0.2.0.1"&gt;https://github.com/sandrinodimattia/RedDog/releases/tag/0.2.0.1&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;/ol&gt;</description><pubDate>Fri, 19 Jun 2015 16:18:41 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/cschittko/connecting-eventhubs-to-api-management</guid><category>azure; api management; service bus; policy</category></item><item><title>API Management - Plays Well with Other Azure Services</title><link>https://weblogs.asp.net:443/cschittko/api-management-plays-well-with-other-azure-services</link><description>&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;In the first post of the series, we took a quick look at API management for layering a very &lt;a href="https://weblogs.asp.net/cschittko/azure-api-management-who-s-calling"&gt;basic authentication scheme over an existing service&lt;/a&gt;. That works great when you have an existing service API with an HTTP interface, but what do you do when your existing service listens on a queue? If it's an Azure Queue or a ServiceBus Queue which expose &lt;a href="https://msdn.microsoft.com/en-us/library/azure/dd179363.aspx"&gt;REST APIs&lt;/a&gt;, then you can layer a developer-friendly, strongly typed API over that generic queue API and as a side benefit get usage &lt;a href="http://channel9.msdn.com/Blogs/AzureApiMgmt/API-Management-Analytics"&gt;analytics&lt;/a&gt;, &lt;a href="http://channel9.msdn.com/Blogs/AzureApiMgmt/Rate-Limits-and-Quotas"&gt;enforce call limits&lt;/a&gt; and user management beyond the &lt;a href="https://azure.microsoft.com/en-us/documentation/articles/storage-dotnet-shared-access-signature-part-1/"&gt;Shared Access Signature&lt;/a&gt; Keys you get from the Azure Storage Service.&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;Let's look at the Azure Storage API for a second. The REST interface exposed by the Azure Storage Service authenticate based on a Shared Access Signature and the APIs are, as we would expect, generic queueing APIs. API management helps simplifying programming against these queues since we can "translate" the security approach based on shared keys to user accounts by caller of the API.&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in;"&gt;&lt;img width="625" height="450" alt="Machine generated alternative text:
APIs - 
Summary 
Christoph's Queue Abstraction 
Settings 
Operations 
Security 
Issues 
Products 
Operations 
Define service operations to enable service documentation, interactive API console, per operation 
and operation-level statistics. 
O ADD OPERATION 
POST 
GET 
Add Message 
Get Next Message " src="data:image/png;base64,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" /&gt;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;Each API operation defines a couple of policies below front ends Azure queues with an API management API. The "translation" is implemented via API operations with a pair of &lt;a href="https://azure.microsoft.com/en-us/documentation/articles/api-management-howto-policies/"&gt;policies&lt;/a&gt;.&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;The inbound policy transforms the queue specific API call into an Azure queue REST request. The outbound policy in this example simply extracts the message from the &lt;a href="https://msdn.microsoft.com/en-us/library/azure/dd179474.aspx"&gt;XML-formatted queue message&lt;/a&gt; and returns it to the caller. The steps for front end a ServiceBus queue are very similar. I'll post a sample within the next few days.&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;The approach with policies is very straight forward. There are only a few things related to the Azure queue interface in the sample below. The Azure Queues API requires a signature over the headers of the HTTP request.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;That signature is comprised of:&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul type="disc" style="margin-top: 0in; margin-bottom: 0in; margin-left: 0.375in; unicode-bidi: embed; direction: ltr;"&gt;
&lt;li style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle;"&gt;&lt;span style="font-family: Calibri; font-size: 11pt;"&gt;The standard HTTP headers&lt;/span&gt;&lt;/li&gt;
&lt;li style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle;"&gt;&lt;span style="font-family: Calibri; font-size: 11pt;"&gt;The time header&lt;/span&gt;&lt;/li&gt;
&lt;li style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle;"&gt;&lt;span style="font-family: Calibri; font-size: 11pt;"&gt;Canonical resource and canonical query parameters&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;All signed with the shared key for the storage account. In addition, the timestamp header in the signature has to match the actual header, which also has to be within 15 minutes of the current time to prevent replay attacks.&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;The &amp;lt;inbound&amp;gt; policy below shows how to create the signature and the timestamp headers.&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;lt;inbound&amp;gt;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;lt;base /&amp;gt;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;lt;set-variable name="UTCNow" value="@(DateTime.Now.ToString("R"))" /&amp;gt;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;lt;set-header name="Authorization" exists-action="override"&amp;gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 0in 0.375in; font-family: Calibri; font-size: 11pt;"&gt;&amp;lt;value&amp;gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 0in 0.375in; font-family: Calibri; font-size: 11pt;"&gt;@{&lt;/p&gt;
&lt;p style="margin: 0in 0in 0in 0.375in; font-family: Calibri; font-size: 11pt;"&gt;string accountName = "&amp;lt;your storage account name&amp;gt;";&lt;/p&gt;
&lt;p style="margin: 0in 0in 0in 0.375in; font-family: Calibri; font-size: 11pt;"&gt;string sharedKey = "&amp;lt;your key&amp;gt;";&lt;/p&gt;
&lt;p style="margin: 0in 0in 0in 0.375in; font-family: Calibri; font-size: 11pt;"&gt;string sig = "";&lt;/p&gt;
&lt;p style="margin: 0in 0in 0in 0.375in; font-family: Calibri; font-size: 11pt;"&gt;string canonical = String.Format(&lt;/p&gt;
&lt;p style="margin: 0in 0in 0in 0.375in; font-family: Calibri; font-size: 11pt;"&gt;"GET\n\n\n\nx-ms-date:{0}\n/{1}/myqueue/messages",&lt;/p&gt;
&lt;p style="margin: 0in 0in 0in 0.375in; font-family: Calibri; font-size: 11pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;context.Variables.GetValueOrDefault&amp;lt;string&amp;gt;("UTCNow"), accountName );&lt;/p&gt;
&lt;p style="margin: 0in 0in 0in 0.375in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in 0in 0in 0.375in; font-family: Calibri; font-size: 11pt;"&gt;using (HMACSHA256 hmacSha256 = new HMACSHA256( Convert.FromBase64String(sharedKey) ))&lt;/p&gt;
&lt;p style="margin: 0in 0in 0in 0.375in; font-family: Calibri; font-size: 11pt;"&gt;{&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Byte[] dataToHmac = Encoding.UTF8.GetBytes(canonical);&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;sig = Convert.ToBase64String(hmacSha256.ComputeHash(dataToHmac));&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/p&gt;
&lt;p style="margin: 0in 0in 0in 0.375in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in 0in 0in 0.375in; font-family: Calibri; font-size: 11pt;"&gt;return String.Format("SharedKey {0}:{1}", accountName, sig);&lt;/p&gt;
&lt;p style="margin: 0in 0in 0in 0.375in; font-family: Calibri; font-size: 11pt;"&gt;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 0in 0.375in; font-family: Calibri; font-size: 11pt;"&gt;&amp;lt;/value&amp;gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 0in 0.375in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;lt;/set-header&amp;gt;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;lt;set-header name="x-ms-date" exists-action="override"&amp;gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 0in 0.375in; font-family: Calibri; font-size: 11pt;"&gt;&amp;lt;value&amp;gt;@( context.Variables.GetValueOrDefault&amp;lt;string&amp;gt;("UTCNow") )&amp;lt;/value&amp;gt;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;lt;/set-header&amp;gt;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;lt;/inbound&amp;gt;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;Note that you're not fully qualifying .NET types when referencing static methods or in variable declarations. If you do, you'd get an error, for example:&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;Usage of type 'System' is not supported within expressions.&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in;"&gt;&lt;img width="698" height="186" alt="Machine generated alternative text:
One or more fields contain incorrect values: 
Error in element &amp;bull;set-variable' on line O, column 0: Usage of type 'System' is not supported within expressions 
PO &amp;bull;cy 
I &amp;bull; (policies) 
(inbound) 
O FULL SCREEN 
@ DELETE POLICY PO &amp;bull;cy S 
o 
Alow c 
Authen 
(set-variable name: &amp;quot;UTCNow&amp;quot; 
(set-header name: &amp;quot;Authorization&amp;quot; exists-action: &amp;quot;override&amp;quot; 
(value) " src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAroAAAC6CAIAAADOAHlnAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAE2rSURBVHhe7Z0JeBVFtsdvFggEAkjYAokgq+wiCkRWZxyVZRAUxFnAp6IzgjrKc0BnBsVldEQf6kPwjaK8gXkqgqLIIjgjOwkiIiggIAiENawhrCHJff++p3JS6e12bu7NAuf39Xdzqrqqurauc6q60h3l9/t9giAIgiAIzkSrv4IgCIIgCA6IuSAIgiAIQhDEXBAEQRAEIQiFexe2DxlEgiAIgiAIgo6sLgiCIAiCEAQxFwRBEARBCIKYC4IgCIIgBEHMBUEQBEEQgiDmgiAIgiAIQRBzQRAEQRCEIIi5IAiCIAhCEMRcEARBEAQhCGIuCIIgCIIQBDEXBEEQBEEIgttLoOvdd3+tvv2V47J5S3TDcX+qfn2XvOzscz9sheBSaoSMrVlz75/GKXcBtfoNSBw6bOc9w5W7rGk2febFgwes+bSlyeSp+N398ChyXjJc+cJLuVlZB156QbkFQRCE4uC4ugC1AVsBypKOzHentZzzCRShOn2JUrV1G5gIGeP/BGUP1VL+LSRkGO2iHA6gLB5tBQBDoRzaClD2MM6UQxAEQSh17M2FevfdH1M9QVeWJxfOP7loASbNyn2JEndVU/ye27qFnIIgCIIgAPuHEU0mT83Zt8+6ctts+sxjs2fBdCCh3r0jyR/TcVaxOBWTkADh/PZttpNazBSrtGxFcua705AaBFrYj05IqJzUkD0J/Vo5Bw9g7suX0K9rmywtQVe9ujXCU2AUDZfAKUoqEFyhP3xB5k+tWqk/U7BG1B9GYJaf8pyqLthVCT16UUR6tEH+em4ZLoueLEdBUpnvvA0BeYu/phMahU5R3eoZpui1+g3gRjm97itqQV6Hp6ck2atWUCxrDQAuFJUINUkJ5mVn649XrNn20qw1evT00hx6Kagy6VpA7xsUjPstO90rgWqSr6V3dT2i3oW4XJy4frMIgiBcDtivLsRUTzj73Sbl0Mg7nV05KYlkGjRxQHXVH/UQeWLwvXjwAPlXSmqIoZn8GQy+UB4UgFQR1BKdwqB8ctFC+Ou2AsHXgmppOeeTAxNfhKxf1yVZ6FcKD+WEYPChYBCgzAJBFFDMiAsBZ02GjntEAM0KxUYBoN7IE6oFVydPnCVPHZTl3A9bKQCUFnyQMrQp+UChQq8jEQpMapX8UVfwR4YhkyfpP+hjjotLcyUw0LtVmjWnMEjQ2kAmavXtR4Ehc6mt2fberEGbA1lCdOQfnlQ6mCloayh+ToSADCODi4CyIwwJlKZTJdiCYLguMo+IVAR4InF0Y0qNEhcEQbg8Cf0/I1j/YRYO8wICFBg0ECtazGKhmUgmMCJDeRye+gY5MdxDDVwxUE3UMPRbDQWCtDhAeBw0R+fruifL4c3BFi2snJxMsjtBI0LPIfO0DACOzZ5FwoWfduEX0fGLs5QNBqoIsWheC0iAeuPoCA8VBeVHTszvKQz8EZHtNh2ufIRBeHq2YoLDoGZi69Ql2QkuNeyD2Jo1IVizXaxmDdocmPqja1EY/HKt2nL22w0ITzJSOzHP2MbhpRKs1B1+N/JGWcUvso3+nHPwIC9sUJFxCqYD+QiCIFw+2JsLeaez49t3UA4NqGcMoCSzAHhIBZh60oGZMWacyleDNAGRm5VFSgjkZ2eTEBpOyUImgUh57gXKHqaPZG14xD2ibeYNbffuNIrIk2AGqto2FhkZRO7RI1yHaBQSCCdNT5nEgUaxmhRQn0oKwLXkhF6rlBOnbHts1qDNofexoMCYgIUKy4OMGM6DeyU4AYODIyJZRIRxANuFfHiZRxAE4TLE3lzApK3q1a2VowBSePpM0Qq0Ea3c0sFPiHVotk1AqZj0R8h4TFbPnv4wPijeI+r6iSajOPTHCoytOaXPhp10sy2oAWg1Wk7HYbIMwohttkNrVsoqHVyr3hU8OL99W8IN3as0a45OC2dJKoGed/BBCxv4hZwx/k8waPQyCoIgXFbYmwsYIjGXbTZ9pnIHbAUoPF4nt4UsCetzfQaTP0wBecMB1CcvIJcEj8lSMHpeXiyCRsS1cEW2BmgjoSH0G8Ce0FsmLYhY+u4BqjcoP/73Eyin6td3ObVqJTldIDVGdga1Aq6rL/mEEWu2Q2tWp1o998NWrkCUiy/ktBCC+om/phOuSNo9aCVkr1mN/FO74Bcy+SMd60YHXJ18kFv8InFEgTkSOCkIgnAZ4bh3YffDozBw0zIsDozgmGO5Ly0ATBAx5hbGssynab2BzmK6hkkbDcQlxGOyCFYpsFlShbQ8IHDCPSKudXLRAlyXzvJOC8CeF7XNDQRiIZ+oWApAnnv/NA4hyScl8I8J7nWORGBhIGSTyVMREjLFrdW3X4RWF2yz7bH+TdjW6oGXXsAsn3xQLmh3eB6Z+Q8YBPCx9iiUOqZ6Au9DDFoJyBgCU7sgAEwW8kdENCI/HGFbmX0Qy70tBEEQLmHc3uooCIIgCIIAQv/PCEEQBEEQLhPEXBAEQRAEIQhiLgiCIAiCEAQxFwRBEARBCIKYC4IgCIIgBEHMBUEQBEEQgiDmgiAIgiAIQRBzQRAEQRCEIIi5IAiCIAhCEMRcEARBEAQhCGIuCIIgCIIQBHtzgT67x4f+acowgmRD+D6kDvIZobyFAMri/ZtVkQN5QJOZvqyog3zafjUUEZtMnqocdoS9gJwT/CLP5FkSkCD1WPeCFAskVWrNSvWAw71Xo3ERxtTE8LF+f6v0QXUhJ2gI5Y48uCIXnDsAjjK5GZETa98LV/e+tKFerRyeQRTb0YzHFhNO4cs56FTWflX6uK0u0Ff/cey8Z7jyCitIdu+fxilHxQHNFq6RKIxJMZnvvI0m8/JByPLDgZdeKPkXzjAKRCckUI+NqZ5Q4QYF9ISqV7em/Oedzi5NjRsuUATUPPJvuq9Lx6ynGqMKxFGlWXPy9wgUiYuRXRLC0r1tcVKK5YHSyRsqFtVLspcW1MNXIHY/PIq++lu2yMMI4RIBuvbkooUkH5s9C06SKwrx13TKXrWC5MNT36jSshXJFYjYOnVh6ChHqVMpqeGpVSuVI/AteCUJghAO7D9gjdlAvXtHmixieCYOHXbuh63Vr+9yet1XuUePYIDLz87GuHZy0QJMajG3qNW3PwVGADLi4GkKRgEAzM/crCwEo5QxVlL0nIMHbC0p2Kq4NMmUN4rIix+YrFdOagiBU0CU2Jo1IdDgmzH+T1cMHESJcA6BnnOEwdQcVmrKcy9kvjsN9QDPvOxsuoq+XEYhlaMoHOz89m00bFkz754UTZV4yGMnBFYkHAtJoW5RBBQcmgY55/qh/AMuL1U7qoXS4RxSS3HNc/b0irJFLxo3MaWWs28fneKr6Jg6ANUwpqFQ9pxtvWZcskTtxT3W5LRCAUjm1Lj/AL4uPM9+uwGFor7EpUA+0WOp2+slRZ+pnJRE3clUt+61gdKZCgtn3FVNrXciZV4PDBAelz65cL61aLqPfmluOHQb3KHUFnDq3YbSJFmH24JvDb1n6ne63j1wdSh1qjfyQfWiWk7M+4RKxPk0VQUJ7l0RSaEUporlaiEntxqniSzByODyWovDPl4a2ha9e+u1YWpBaiYkS5nh6xLWCkdZYhISyNPaTHoBkTe+18iTq4V6NU5xT6ARgAqLnk8FDJoZQHWL8PCE05Q3p07FSdEIZurq1D0o28gq5gB0Oa5Suj1zDh40tSCVt3JyMt3R3CH5dvZySwJrN0CGuR/ibHRCAmqMRi1kiUrNl6NsINvwp+ZGBkxKCpgay3oLUzNxDp3q33bk5CIAlyHRC26rC8gTHcgr+VBd4JJUWSj2+Z0/wkm1T41NB9oAPoFIRYKRjxWkXKVZc4qL8ByXgQ/SpACoQVS6OlEAKgW/FAAC5xk1RVdHS1AbQEZ/RWpoFTjR85BzVC780cwNxz4ZiGdQq28/U4KQ0cwIBkG/1XWQN+SQIqKvwMc285Bdkjoy8x/cxgAyfEjmdOqPeoh8ALo+PLn/ETV69KTAKB2XF0CmOsGBlLmuGPQ8LgICo4rUCQuIy0vouApqkgPTXUH+uIpLIibQ4ylBNBmX0T1LUKs0SBFUn1xeE4hL4zKlRp5oFCgb8kGj8O3qBS4pcojMU082ldq9NiirejdAcVAo5SgO6MDUqXCQD0xkXJR8+NJ6nzy5aCH8KTBygiJQ5eCXRx8djAl8iYsHD1B/xliG4qNLGxG1Ox1jBdJBceCPMNAo6Kt0CtdCtdBgApBzShPpcP1774ro/LBFkDd99EBc3AUkU1zkzXSHQnVBwCnUEg2+6NVIigKggDS2AC8N7QLCaHW+QPkWxTrmANsKR1Zxg1BBTLaCqYDK1wFqegocUz1BLyyPyXmns+miwDYzREKPXvBExkx5c+pUeuNyr9CBaofKJxkC1ATdKWhTTFzJH1hbEKCq0bGNDAQMEfLUcb8lgW03QGCkjGwgPM7ykItCHZj4IkKigPowiMDkj7vbVklZG8t6C+u41D/yQP48cuJe4CLgKhQsZDztXeD7GegyhgAeF9BRUAaSAWRufj2YC2w6oaixdeqSzOjpIw/U0gwaD+2NiTU50Uu4kyE1ujotVFL+0b14OMb9iXqkkZpCUo8EnCC6Jq1SeAFahwPT5dwzbwvyg5GXBj78QqYcci2d/W4T7m2SAa/D63BgxNXVD9cJQMa4rgi6KDc0Kie+fQeSreBmgElLMq6CwDw644qUCJUFUzHyDwrXFZqMylisLAUFOUQKPMIiWdzbaBSuLlQOV74XEJjyhlkyfsmwM5U6tNrgcdA7GNn59qEr4hcXJR++NG5PrmdcBV2C5LrD74ZMlYNfhDcNoxjj4Mn9B5WGquNbJiiIyOFhx/B1AUZVJbz0AqoL1y1uu0NVYDTHYI0hlXzQImwJsY6x3qEm9F6N1sSASzIKTuFdGtqFCz/twi+VHfXAjaJjHXNCqPCgBdThQgGUmguLJuA7ArmiUcs9M7AFSTBh26lMjcsF16HeAoEugUQSbugOAZnEAGiEcIavSLm11ljQW9K2GyAw+iFKlDh0GJ8FuJuoQXFRXJo7KmTyRwZslZS1say3MONe/9aRM+fgQZrkA1NSIVC8vQuoXyUFMD2nRM6URLksUGZeHmeaUubq06FRgA44rc2PGQmdhZGlq9KgoFtwyqhcVqv6/RxdUOlBQRMiMJKC7ay8PGQe/YAD0AANy5pMLvxCDoQyFCeFMcqoZYlGIiucJgLz/RB0woHAHBGVY9scjH7p3KNHuKJM7W41AZ3QOxKX0T1LyINeG1S9evPpIIfIp3IUYOqBxj3sOcNecK8NHlDICVAcpzZ1KheFx3Sn6tWtUUv6tANdkaoOgwtdGjeIXs86GNQoMIW3DqOoHCUFQNUVayEEAygMBQjIp77bwLZcxeqKAInAwMIlqPhwYnglzYRykZq3vUNN4P6ii2JU0btWSUBmMPWkYcrJGNUrgW+l4la4lwIypsQZp3HbJTNOPQrYdiovqoGaD1ZCzr5953f+WKVZc7pNyBRwwTTKWWvMywBl2w2gd2E6YGav58Gp7KZsWJWUtbFsb2HGY/1TbpFD2BB0RZPdHwLh3OqoDyuQvXSFYkFrWXxYBxf9LC9JeQEVqscN2hGDgvZGOpgfcHsHzTy6IJ+lDLBljV8yJ2FS0HIfDiRoRHMGNxW6CF/XpA4Z3CTW8QK3KMWiAx1anbBDvw9tUwsL7lmi+mR1iywhPMm2WIcGk0qwNSkiin7boyBwWjsJowcGVHAOj86PKkJD0OInugGmfVRvTtXCmglg8kSB6eCpDKMHBqg6J8vGFpgIGA1p8HK61zjNYnVFhmdXgMxuqBwkxVVkvUNNZBQ8vqFD+ZYYlJcS1NergxJChQctoC1O4zY6Gw8gobV+0E6l92cdWAkwEYwp03ebEAt6GqYDVLU6HWFsuwHGYWQABpBTC7qMHnpqrKSsjWW6hXWKW/+oNCSFgsBA4REyNMJmLqCouAGUIzCZ5glxWED6iUOHKYcFjAIYC6w16wXkU8+5F2ztUAadiQT0GBqzXDLvnhRNkvBLTkyt+D7hNX8n6Paj4RjdGr0q4G2AWRr1G/xC1md4AN0LBorT7McE8sZFs00tLHjJEnLCGx2QJep+aAtrr8AprgGAMKgljIYcEhdiE43BaIUBgmIhgF6fYUHvJCgInBDQcFD25KmDs7j5lSMQnjtJYffLysLIQhnOXrMav5DJAAX65ai8JKP59Mqxggm63haoNF0NO6FXF/VJ0+NnwPXPaRarK+p6EYmz2qNEoHJ4RLLeoQRrLL0vhRG0JisY9Dfrso0t7hVuu9xiLSDm5WhW8uSzhK729HFbvyi6CjVWsVqf82bbqUyNy73RBK4IEwGloG6DZsWUyWmQcbI5QsO2G6AUKAvMVkwy9Tyb7ibT6AGclJS1sUy3MMlEce8+hKRqpzAlrB9PWx1tBywTmBzDfuTwqEprfZUEpA9NyelbKx0GGnoVB+AKDQryqec8qDF+ctFCdBeEdBpSKycnU1K49+hxrFPmgyaFuwKdgzc5oo/ymh75uIC7C92dAtfq248nBwDlbTj2SfinPPcCWoruQx1+AEyHU/YAssRFQ2qZlh3a4SJolmjeSWcxtFH3Q1tYRxacQql5VZAegsKc5/6DC8Eep8AM1SfFgu7R6zMs6J0Eswo41Qk7cJYbl8LztJuWMXGga+GmwDCB5qZso9ExuFAwpICRl0KiOEiN/FFMvXKsq9lIUG8LDGe4ijrnANLEdRGYez4aCD3ZVEaoNEoTDcFpeu+KgIOZcoXSIU0ekax3KEAtwQKj8up9CYdJv5YEXtxGW3scIV0qHCMDDQis7wlrAXEtagIcFIZB5WB8oFOoBM4VwqNjkD9yS43lvfX1vDl1KgwXnJS+D0CH9BwyQM6cfftgetoOMnoLhgVrN0D3QylQFvijonAHsb7IXrWCgqFEqCLyNIG6siopa2OZbuFAVEUIdx9XO+rHtt68Y/+PlIJwaYCxo1iPpS5bMOphWulRgZUcjLyYehaaOIFROHJDEMwUTNTcLbDLE1NDMNBk8dq/VQvuYJyBuVNCZVz+CefeBUEob4it4AXoDNvl08iBaZPTenLYgS2Cae6JwCZHQRBCRswFQbgcgYlAS5Q4oLxLbXGxSeCjEraPwCIBpn0pgWdktKYtCELIyMMIQRAEQRCCIKsLgiAIgiAEQcwFQRAEQRCCIOaCIAiCIAhBEHNBEARBEIQgiLkgCIIgCEIQxFwQBEEQBCEIhf9IKQiCIAiCYIusLgiCIAiCEAQxFwRBEARBCIKYC4IgCIIgBEHMBUEQBEEQgiDmgiAIgiAIQRBzQRAEQRCEIIi5IAiCIAhCEMRcEARBEAQhCGIuCIIgCIIQBDEXBEEQBEEIgpgLgiAIgiAEQcwFQRAEQRCCIOaCIAiCIAhBEHNBEARBEIQgiLkgCIIgCEIQxFwQBEEQBCEIYi4IgiAIghAEMRcEQRAEQQiCmAuCIAiCIARBzAVBEARBEIIg5oIgCIIgCEEQc0EQBEEQhCCIuSAIgiAIQhDEXBAEQRAEIQhiLgiCIAiCEAQxFwRBEARBCIKYC4IgCIIgBEHMBUEQBEEQgiDmgiAIgiAIQYjy+/1KFARBKAG5+f6fzuefvOhLiPU1rRpdOTpKnRAiBgbwnIsXc3PzYmJi4ipXioqSOhciRWTNhajrfuf/+u/KUaY8+cZc/L740GByemfKh8smzli899Dx/j3az3/tIeUrCILGyhO5r++9uPh47uk8NZ5UifbdVDt2dHLlW+vEko8QXk6dPnMw89jJrOzcvDzyiYmJrlkjIaluYq0a1clHEMJIkYcR81ZshILXjw53PQtFe+DISRWiBMxcmI4El3+zXbkrAsjz3z9eMW/SaBg9fx01aOP2fbX6PPri9EXqtDe8FLwiVo4ggFO5/l9/f7bX+rMfHbnItgI4n++bfzS377dnB2w4eyQnX/kK4SAvL3/H7ozvfth59PhJ2AqVK1WKrxoXV7kS/I+fyNq8fdcPP+6+mJurQgtCmDDvXejZqQVUIx3fvjf+jyNuXr1xZ+o9L5XcYriyQW0kXqt6vHJXBN6euwo10LFlMmT81r2ieo9rmifXv4LOesRLwSti5QjCiYv+Pl+fff+Qm2ZacCz3hq/PHLggFkN4gH3w/bZdmUdPREdHJyfV69z+6us7tu7UttV1HVrjuLJRg5iYmGMnT8GYyLkoFoMQToo8jJi3YuMrM79Y8fbjyl1Ar/tfgT7753P3KrdnMGOu0A8jkP9PJ40a2KujcoeJ345/985fdA57soJQmmDouPXbs0uOqZVwd7rUiF51XbVKspuhZKDOf/hxz/GsU1XiKrdu3iS+ahV1QuPChZwtO/ecPXsuoXp8+1bNZDeDEC48/WfE/YN7/N+itcohlJi9h44rSRAqLO8dumi1FW5OjH2iSRwfdzesTP5fncp/IyOHZCFkjh7Pgq0QGxvTtmVTW1sBxMVVbtfiqrhKlbJPnz2YeUz5CkKJ8WQu1KxeVUmCIAgBXtpjo/5vq1vpxeZxfIxOVuYCeGVvTp7DxuqOc7ZEvbWej3Fr98MTwpTNRygAUX/mRjoFf5wlTwaJjFi6WznsQFy+xM0LdyjfAHoGKJF/789mHxwIQCGBbW5tPXEVyE6lCIF9h42kGjdqUCVOVezxk6dIACxXqhR71ZUNIRw4fMR2M7updDj0LOkVhYPK7lTnekhEpCKbDsSl6HygElQSBZguaqoiPVm9LQB8TDWMuKb00aam6BBMl7D6lAeirvudksoBob93YcqHy3rd/woKg6NWn0d/O/7doDv1rCXfuH0fIjYe8CSlgwTnrdh44MhJyDilAmngEriW+0YKShPBOGO2SQEUocNdz9KlIcxcmK5OBLKKA8JtY6aSjIzBSTkMBDGgMPAZ8OgbFMyUDkHBSMCxcsMOTpaektApEhhKlgqCA7I1ZcqPXmRUJqcpCBFi25m8704XbzvCgQv+NScdn1wMb5Hof6AzHS91baR8wwc0wf9uP8qXUL4FirNjYjyfOnTuojrn8/2rf0v21G0R29zaetarGvvsNwdILiHnzl84e/ZcbGxMvUS1fWrrj7tnfPz5lh9/grxzz/5/zl28/rttdKp2rRpxlStfyLmYfeYs+Vjh0uGYuPGQroaRbT61cUgb5WuHqdRL+rUguUPtqmM7NiB5dNu6FJicOA4Pt3kUyxdFxpAfVt5ooMNnL3JcNBZ86JQXYDpsPHZWj45GR95wCRUiYE/8IrlGyTseRmMarvm4lP5dwJO5kHHoRPvmReoRyunvH6+4f3AP2hS5ZfaEtk2ToAKhgFUID6DwA8dMSal/Bf3rAQ4kmHX6XMO6tfr3aP/BknUqnMaHX6wf0LMDAii3BVRl7wdeQZrL33qcM4arnDpzXoUoAEVYtOb7yWPvokv/7vZeD0/8gPNPnhA+nTSKZKetBijFX6Z++sDtPSkYpaObFDoUpmenFpys03YK5GTEU9P73tAORaCQw26+DhdCtlWIAtA6KGBq+6Ynl72GYCjRglXficUgRJSvTxVR/L2uiL2rQaWW8THK7cD6bE8bHSLBhmNnb0muqRw+H7QaCb/+chc0x4wbm5AT8Cmd/2hZBypHOYoDXdR92cMjpwOKv0ZC9ehoNW43btQgsVaNJSvWLUv/ZsHSNdWrxbe4ytiXDaKiomrVSIBAsYICPbrp+LlyMr3+eaMEWCFoMsg3L9wBRa6bLGgs+JjWh5xAMNgHpuhIH5YBDBpul5k7jo3r2IDkEnIJ/7tAcHMBhZw4YzHKrNyBbYObduz7fPIjw/t1Ix/o7yfv6QsV+OepnzhN5U0gGNTqjGfvgb6kfz0ASJDShGp87/OvyFPn/xathUmhHBaQVZgsfx01iNOkjEGDTp1dxI5BEU5mn53/2kO9r21JPqPv7IPMIP/FbdSXZyxBVbAxgXQeHNIbep2coQFrAzlBfSI1to1QM2nTx63csMO0xoCQyDlCkhM5eX7UbX/738/DYs8Kgi2ZOUWWuMc1qfx+u6pBX7FgilWaNKhaafG+LOUogBaxSz6ndOHQuYtPXdsQ2ggzWuUVKjmB/42Mq1SJnCC+apU7+vapmRC/YfOOKnFxQ/r1qVG9mjrn81WJM0J6//8I1tDlii/2nbqtsXl+CNUOf+VwBcGc7IAHWtdFu0CgpQXYEOQfRqCGMG6vePvxxkmJY//7Y+UbKtBWSIrVZenjZi5gpv7i9EVthk7AhJ4tAyihN+cshwK2TvFRGIR8a+5K5Xbl5ZlLoFZZW5vA5bJOnzOtumDCDfPKKQr4x/w0ZIAVJwMNqq+OUBFgVSh3AQiG9P+97gfl9sbvbu9lqoq7br7+ux9LZKS/MvOLcXffYi0pLjR2xC0wUJQ7AIpsCkkF+XrrHuUWhHAT5/A/Dqdy/YdyCo9jF4vYB5XLbpM+5pS0iK3PStdmnoGncrgyceMhaBflCExGkRQdysvBE4xuWxeaeExahnKHSnTgfxz8/iLPgA5mHss+fQ7C2XPn9x3KJE8iP98ISbG8kBRf6fBZ9SAm81wul8V9ycGp1LZwSPflFphxSBZWAtlY/CyDIdUe1AJDOvWqxjrZAUi2Q+2q6A+4lu2SUhi5NP5dwGwuYPLKD10wU1+9cSdmrlPG/Uqd9vmghGpWr+qks29JbeNRU6LuoFaVw47f9O369txVyhFg0ZrvoZuVw45Fazantm+qHEXp36O9kgJFgDa1tdF6dmqxZddB5fDG4BuvUVIBlHJJnjChFfp1L8ywDi5nqmHUuZI0YMxu3hmeJ6aCYKVpVZuZRkKM7/WMnE5rz7ROO520IhtH3w1n1LkAzeId5yfF0jqhQY/VNx47i0uYNsc5cdOC7ZQlRNSVlv7AXnk5eBIwVg6du1jCpX7a3njmXOFz1Z8yDiz4ck31alV+NfAmeiqx9cdCNQwDAr+8KbJY6HsX3FdfXEpthUPqT38YtlEeWr33X/1bWq2EsDMpNeWLfadQBOWOGJfGvwuY7179ucvJZa/Nf+0hXmYn0jbtgipSDguoFKg65XCGVKn7osqdv+g8f+Um5Qg8vFj17Y9W3ayzace+lAbB36GEIkDjslWkH6ZnFl6wrrIQWQGTPwRo34NT5dDl9L0RTh3Rul1DEMLFDbVi4iyq//lmcQd7VsfxVmubPolJbu9ajk8rrFoHGosEnSurh6L8dA4P7zi2YwMoJMj6fNoW2gxIc1DlFSpPXdtQ31sXAgnVqkVFRZ0+c+5CjvqflJoJ1RvUrT2k388a1E28o2+fRvXr1K5Vg07l5uadPGVMvmskeH0h9IZjZz2utUQI3UahJQH6tdp2tK4Q9PHB1bWqwARRDjuQAi7atV7hE5zSZEq5/HcBBOCd+0h29Evvw/PJN+bC6WjsRxQvqrT3tS2vbFCbn9N/sGSd+yZH4F1D61aR6QjhuxKCcLlRIzbqjrrF+xjEz6+IvdJuTcKJBlUr7T1d5H81MfRDAShHCaDpMlQOhE3HzwVdadg4pA3moB4XJJzAXJk26KFcyquYxMbGJNaq4ff79x44TD4wDu4c8HParxBftcrQ/j+DwUCn9h3KzMv310yo5nF1AbWBMt7dMuLz7OKCSvt0j1m3vbTxEPyVwxlYA/p+xjKkovy7ACwM5KF7x2aU2oxn7yGtCrUIZ7HNhdQOTU9mO26HQdLQxMrhzHWtG+M36F68X91y/eI09b89733+lcsmRwLt4WQx6FNt9yKUObSc41Q55G9a8hGE0mdCs7gqBePH4I3nqn6ZzcdvvjffhjFRvheaxymHN25NqYnpOD+fhqLF0B90QumE/l+C9FCAkqKVBv0xge1CAi9IlIQl/VpAJcNAUe7ik9KwfnRUVObRE5lH3V71dvzkqQOHj0K4spGn3f6whG5asB1lDLl6IwdVmt4okOHjcbfBpNSUmTuO6dFhPQTd9BBeMGhXlH8XgIXxm75dkRNyYtKuv8252OYCNP13P+53Kg+0u8mGsgVVg2Bzl36r3A70694eZUNd09q704YJpkOL5PTvjH9BtqI/13AvQnnApXLg76WGBSHStIiPmdxKzfVz8v3nteNivvk/IJ5tGnd9zSD/ZmkCU//hLRJ598DhsxdNLwAgfzrIR98AYZpT0j5HOmCF8CMPXIX+y5/PWvfhAwSDscIv/7G9kMvVGahkJYVEfNUqTVKM9y/9uGf/3gOH8y317Pf7Dxw+8sPOPRBgW+j/KGGF6xaWECqEFl0Ifauj/soj9sRBPl5KzXBIHMrLA8gbWp8j0jsY1LkAyD+fNS0CwQBCYNqwQgd50tlIs7yi/btAENCrmE+Xf9tz5MvK4cyov73Xftgz+zNPKHcBy9Zvq9n7D99uy1Buv9/X+QElBdCdMxakIbA1ERP9/zD5jVlLf/OXd154d6Hycgb5R5rIhnIXgLjwf2Lyx8rt9yNBpKwcGqa4yDDSVI4AqB/dx1RAxhTRFAyJoPjKUYC1cqwFQXVd2f8JPa4pPwz89fIKQoSYtPt8zL+yfF84HlFfZP15xzkVWggHGQcPr1q3Ece6TVv37Dt4/OSp7NNnTmRlw4BYv+kHOrU744AKLZQiGI0xkvOBYRyKxjREw4lhXDksYHjXtbCuF4DuhKxrWyvQ1NB0yhGA9Kly2IG82aoeIpS9C1PG/apWQvytD/83byzATP3JN+aOeGo6LCb3DYwMbB+YUan3vMSPapAIZNPnofve0G7WF1/PX7np7gGpysuZgb06jrv7Fv3xD2Xs/cXrYIWRDzHxkdv3Hjo+4NE32PiC8Nvx7yIuOSNK++aNZi35GjYmDttFDlQOMkwFQRj44BcyquvXt3ZhK1UQypzHGsctvTb+mgT7lYNW8dELr4l/vnkYNhwITHKDevTNiAsXcjIOZm7Z8dPGrT9u3r5r7/5D5y5cqBJX6epmjRsnJ6nQQulSof9dAFn966hBUD3QhvqGeiIUcwGsePvx393e6+25q2j/5MAxUzIOn5g3aXSxNNk/n7v3+VG3wRrgRNK+22X6B8LRd/bZtGNf0E2ODL2UidMc/tS7NapV2fTBU+p0AUjt88mPQG3DxKGQD0/8oG3TpC2zJ6gQkeTP9xpPhhr1Hddm6AS0H3maePGhwTOevWfRmu8RBtnDL72DUnZiCuWNnlfEftMlHkbD41dW7lcntnutmFtqxzySUnnRNfGbU6sFfXeTEAK1alS/pk2LNi2ualg/sWZCterxVfGbVC+xdfMm17a7OvGKwvdXCpckTrv0dHoX/98FAHQu7buETux1/ys0X1WoVYZyzJX9n7BdbxcEQRCE8gNUlf4owRaEaT/sGeWw4PFhxP7ME5CDPs1/4d2F/DwCmtTpKYMTiKs/NwlxdaHUoPUQ+UcAQRAE4RKgPP+7gIl/Pnfv3kPH+alEeTcXPvxi/e/vcHuToyAIgiBUFKDpRw3tM/ypd4us8wdY/s32+Ss3PTC4p3K78scRNwf9yFHHlsn9e7SHVVESTcpvAizX5gLsL4+bHAVBEAShQlBu/11gwKNv8P56pPbb8e/27NSC1yTKqbmA7MLOgv314JDeHjc5CoIgCEKFoHz+u8ADt/dctOb7Rn3HUWop9a/44IWR6pzPF+X3l9knZV1AXmtWrwpbQf4RQBAEQRBCpvGAJyePvavkWwDLqbkgCIIgCEIJmbdi48MTP9gz/0XlLgHlfaujIAiCIAihEcZ/FxBzQRAEQRAuQcL77wJiLgiCIAjCJUUk/l1A9i4IgiAIwiVFJP5doNBcOHHiBAmCIAiCcBlyxRVXKEmwUMRcyMvLI7k8UKdOHSUJgiAIggcOHz5cv359CFlZWeTjnfz8fDEXXJC9C4IgCIIgBOHyNReeGePr0ljJLnw225cS49v0tXIKgiAIwmVIxM2FXbt23RpAuUudB4cZ+h4HFL8gCIIgCCEQWXMhPT191KhRU6dOVe4S89Yk36AeSvbIm7N8GXm+JMs3O56e5Ptqj5Jd+OVQI3qH65TTO8gncisIgiAIlwCRNRe6dev2+eefK4eFTZs2/Z8GnOqEA8+M8T33R98nq5QzJcbwoZUDVszs4/6gwTYMEiF/HARUPjn1hxF8Cd1wIR8cOEsgn8gtOwVBEITLEL/ffzrXf/yiP+uiPze/Ar+5oCz3LiQlJcXFxf0YAAKc6oQdDw7zLfjImOjrbPjK8Jn6gW/a64YT+p7C4OjczYjiBMXS+Wy2od0XrFXRCah8lgkEO7RfhenURVkDuND4l5Xn09qKApzIj0s2BEEQhEuVExf960/lLTqWu/RE7uqTuStO5n5+zBD2n89XISoUZWku1K1b98Ybb2wXAAKc6oQFzOMP7rd5dvDsa8bvL4f6Du4zFgA2rPWN/EPghM/Xb4gRxTvfpBlxgz50QLD5c9RCAmwUmA6gU1fD1LA1C5BnZKO4D1AEQRCEikue378xOw+WwYEL+XnaggLE4xf932TnrTqRe1Y/UREoS3MBJCYm9g4AQXnZgVl+UqMgzxdC2F4QGrAqaCEBx5uzDJ8HxhgyjAbYECajAXlGzvkBiiAIgnBpA1shPStv73m3Bw8ncv2rTuZl51Yki6GMzQVQJ4ByOAPF3P8OQx9beWuSr3PgCxpQ2As/Dnj5fO+8bjws8M61qeqJhjtJyY7BYDRM/cC3Pl05AXKLPJNJIQiCIFwObMzOP34xuB1wId+/7lReBdrNENm3Ou7atWvUqFHK4fO1a9fulVdeUY5g2NoQsAxgENBknU0HqHB+ToHJ/fw5hgADgoIN6uFbn2YIREae8diif1flBAOGKI3+zJhCUwDBQJfGxmMOgq+iBxv/smEl6JeAxfDLoYYAz363G2cFQRCE0qHM3+p4JCc/PasYmrRZ1eg21e3mweWPCvwSaJgLC9aW3jMIQRAEoZxT5uZC2snco0WXFuKiozokGAv5G7PzcyxrCTFRvptrx8ZGRym3K+PGjTt27Ni0adOU2+ebO3duenr6Sy+9BHnw4METJ05s0aIFnQo7Zf8wQhAEQRAuAS7m+48VtRUqR0el1oypUylq11kbWwHk+X2ZHp5cgB07dsBWgLBy5UryKWUqsLmQEdLbkwRBEAQhEmTlFizXB6gUHdWtVkz1GN+m7PxTeYaTD6ACBWIpyZXly5d3C5CWpj1fL0VkdUEQBEEQwkCOpvdhEHSrGVMzxrAMrq0Rc2tirH40iis0F3K8vYUhPT29VatWvXv39mIuTJs2bXABc+fOhc/KlSsh01nA/mDcuHEsMzt27AjENqDHH2IuCIIgCEIY0BWq3+//6Vw+fsHec/6fzhc5srWXLnhRw/QAomfPni1atGjZsqVVu+tAu8O2QBgwceLEGTNmIDriJiYmUjr0C4OAfrdv3w6bwIhZAAKMHTt2zJgxlAh5irlQhC6N5bXNgiAIQihUiymyY3Hf+fyNp/OjoqKqxPg3n877PjuXjyxtv0J80Vi2pKWldevWjWRYDLAGSLZlwYIFd999N8kI3L9/f1qQQArbtm2DAOeIESNgJUD+/vvvYX8YQTUQALFgYZBz5MiR+I24uTB9+nT6IiVsHOVVkXmr+N+48shns+Xlj4IgCBEE025aV48QCbFRcUX/xyHjfP6m03n1Kkd3Toj2afsVdOpU8mQuwAigRwMQoOlpbcCJBg0aKCnwOkTaI9mqVSuyM3g5AYkANkQYhLe+OzGy5sKuXbuWLl36eQCYMPPmzVMnyg0pRT8f9dWeIh99KCu6NJbPbQuCIIQTGApQQyCiFkNKFbPu33Muf8WJ3N3n8m2tgpqxUTWDmQtz586F8qbnAkTLli2XL1+uTttx6NAhJWm6v2fPnpARnZywElAbMB3atWsXCFgEsjB0ImsuNG3adMaMGSTXq1ePBGbLli1zNOBUJ0oFWAmwFca/rP69gj9HqT+MICf5s/5OamQsA5AnQ04cSAcgML+yGilQmg8OK0yN3xVN2cAx6i7lA6Z9ZDgpKUEQBKGEkK1AckQthmZVoytbVhGycv1HL/ovWv6REuHaVAuuhdPT000LAHC6PI9ITU39xz/+QfKOHTsWLFgAH3JCgJNSa9WqFWSYDtZXNSAATiEuOam6Sm/vAlrIZMLUrl07NzcX/gACnOpE5IE679/VeAMjv3WRvvswYIhyMvTRS1gV7xS8yXH+HON1jRSY7ABYBvRFygVrjW9N6csVJqa9rj56iUQo2Mg7jGzAR/9CJiwY+Mj3rwVBEEoO2wpxASDAGSGLoXJ0VKca3l66hBl11eg6lYNo4ZUrV27fvr13797KHWDw4MG0TqDcRRk7dmzLli0DDy4G045F3oUAywARSRfTYoPVVgCIOGLECMSlRGBYwLOU3ur4+OOPt23b9p577lHuAjIzM5ctWwahT58+puUHLx+SCA3M2ulb1dbXNmDS36BR4fMITPopGMwLmAufrDLi8luoSX72NUPl81uoB/Xw3Rf4KuZzjxe+NBogTT1xWBjTPvLt+UklC/gSOgjWuZt8dUIQBMET1rc66rbC8OHDIcycOfPChQsQoDVpEx8Rlrc6Egcu5H+bnef+yUnYCm0ryOufidJYXYCtAFPAaisA+Ac+SNnb+qgictC3oPp3LXy+EDJJjZQQCWCsyBeqBEEQQmbevHm6rQD7AEDgNYYI7ahrGBfdq1Zs3cr2qwzVYqKurxFTsWwFEHFzgWyFsWPHKrcFWIJkDJYmvxxqLBuUcH/Awo+Nb2DSEgVZHvhdn2Yk3vgq9W2qTV+7fegSIRGenkroexdoQ8P4l8vFvktBEIQKCq0isK1AnrrFQAEiQfXYqG41Y/tcEXt1tWhYDzAdGlSObh4fnVoz5me1YxvEld5OgHAR2Rynp6fDfPvyyy/pfylHjBihTpQDeH8AaWvahDh/jqHdIbgsPEDBIwCOTl3U1gfamQgf/NIWBCTeOdXw6d/VNzLwbMIJnEUYhNT3LtCGBvmapSAIQgkx2QqEbjFElITYqBbxMZ1rxMB0uL5mTOtqMUE3K5RbKvAXKQVBEARBx7R3Yd68eU2bNjXZCgxms7t27Ro4cCA5w7h34ZJEzAVBEAThEqHMP2B9CVNRV0UEQRAEQSg1iqwuHD9+nOTyQPV6TZUUVuonRB3Odv3vFkEQyh+bvl2P3w7XdCanILhTJf+UkjwjqwvuXHarC/RPNYIgCIIgeOeyMxec9rxc2nwx13ddraitG5RTEFw4uvHgzDavKcflxxf3fPTJzdOV47IErZ/25y+Uo/ig9nZ9ulU5SgAaYtPUIu85vsx7ZpkTcXNhWAETJkxQXmVKOVxd6Ne2XChyZANWhQkYGThwSrnLGTSuYUz5nxrPwmkaTSBj2MKgg7N8cACKRQdkhCSBzkJGaiR7AUMkLkSJFCuiLa+//NxdA3+GY+2aFcqrZJgqioAPnDiQc+UVYE7Pt/u+X/BRk0BcCqbXrUfCpTlA+oQv5/R6m3Lirsy8KBW99ekoeauZKGGPssJZpcOlEvQ+zxcNY1u4gEvXvz656W2tyWm9L/757v9Q38axcN4cCoayUJMhGNfYL6bfsfEN48YkJ6jTManjQ92QpnIHCO+tJ7gQcXNhVgGQ1683nj6WLRFdXXjiP6ImPVkeNesvBvu+Pulv3Uk5vYNYL04vv1s9EpJrklAtuQYJVjDo/P7UUzf87eZmd7SFMHzLo/DE4LLmiSVDVt4PHxwdRhkfXEEiuz4JcTyt1qgwAxjUlBQqf/jj+A/mfZlYN2yvOrVWFAbow+v2UfHh5DEaI2/Hh1O5CHA2H2zUGw6qujKk48PdKCcbJ6dxhkMDLY500AFQIZQmFxkdZtASm1fQhkBJepQVymeDbik3zxwKIfWvv1AnioKaObP/FAXGEUJvREM7Je4ObqtDazP0uLb3xYBBd6J7P/bEhBnTppJPtUYJJIDqjVRfBd1fvGX1k4uVIwDdqnrrh/fWE1wovYcRR44csX4/u/SJ3OrCvTdHZR7wjXlRKdd/vqGm5vpTAIQhH7Iq8As5c79v+I2G4DSJp0cJyhFYBkDiJFBqfBb+MFnYn67LF9XXMMgHh37Rw/uVv7vRYyqFLZg3YIo8+r67MIfAL3laJxYIQ570yyGfHvcIBYM/+TiBgUYfXzyyaUo6DAjr4IKhR5/NAJ6C0+wHTn1Wh2ELCpXk6g1r1GhSi2RbUGQuIEDpaPGASopDP2sCIfVq5GoJraIwCftx7mZWis0GtTm8bj/JOz/arA/3UDxKKgBF1ufuqBmqMa4oHHAiGIRD6RlLhs9mT/bHwYlAQB3Ch1LQq9cJtB2pYf2ipEIw15zT8+0z+06RJ7cO/MnHJX1UC4Xh+SuKhhSQQ84kFdZaCidK0qO8wHnGQRc6sz+bTjFObQGBM0N54HLpWdKDcVmoNujgStj5yRbM/klmnO6Lrjf0wu/uXeqbh2TRmuz+pre1hr+pAjuM7mYywoLeekJYiLi5sH79enoY0aNHjyZNmijfsiNCqwtQuvUa+t5dUjgRf+0vUZia00HTeijXnw1UPt+vN4wA2BaQ6zXyzVxqCAs328/jfzHY16GLER6Qyv/tQ8YvwlNqv37QSNzw8vn+9YnvsecNz5sG+RZ9aHgiV3DSWYYi4uhwvWFkEO+9aeQZmXnvTeVjxVoKJ9JWLu1/2xBMI+rUqUfGwW/v/T2cOP722t8XfFqwDrl6GeYZ8z/5EJ7HjmRi+IDm69q9F4XcsW0LNOWmffv7/veb+kFxofAw28CYUtyJb/a+LFsjA4oTQ55yBEZPqFWapTXomoIhEkr39AFDg2KUxC+GZgxVEDAlhZaF/YGQRkw7+g00PnhK4yMK1ap1OxoxqaQ4Wl7dlpdnvRByRR1Yvaf54LasG+BDZgHGZUxejQgF9Hj5VkzlEYaXeWl6R06k0OyOtkiW7A+qKKoBmr7zVJg8EQwDPTmhV0gvQrWjDpHO4XX7YAfgF57uoO3QghBQ55TakJX3b3zDMBdQUn3NAO0CT2i7poNakw/SN6kfhpoPeVDuALCfMMeFoDL51T7bUjgRco/yCGwjqmH8whqAD+oElYPUcC0KY9sWBC5NcZErOCkkiklnGVqIQs3AzoYTFXhobQYlhaqm+gHwbNi94Mv9AVzuC3T1xLr1mjQ1PoeI65Lxiv7JDzKI+tcno86VIwACwPRRDtdL7CwOKo7gTMTNhc6dO9PDiG3btr3//vvKt+yIxOoC5tk3DfT97X+LqGQoePjr2hTKFTYEzcs3fWVM5Z3g6TtP/aGh//2pIcMCwLWIJ/5DBdO1O64L8wIgP7zUYYUvAfOCgZ2BXxg3sGCc7ADvpYA6JAVZu05d8oE+o6nwE4/+jnxAavc++EVgGjgANN+MaVMp5Lat3x87mtkhudGiRx7UDwoZdjAS6fNpzLl5toRxH6cwGuIXCgODL4ZjjLb1uyRTAC+gsKuW/RtC+url0PTkySsEMLDIxyMhVxTKhWyveWIJDfeYmdGK7un95jfb0CgMdQK1xJNImBo7PjTuI6TT6dEbICAYfnWrwhaYKRjoEQwHrs5V3eJOw4iHRiend6C3KDVkT3nZAW2Hy1FIZMBaTBdQP6TAKJPAqRS2RLRHkXlH2cMvskr1D6WLVqMiu7cINR/iuhvcsBrxG3QZD5afklzB3AA9Fl13yjvaq++dIXPKhHu5hEhQeg8jUlNTjx07phxlRyRWFzDP/tc8Q3krdwCa07//pqFWWfW+OF3Ny3HQCoEtFBcHrzcg8KZ1hgBt3fdOwxNpQtNTsF8XU3v+8w3fof0q7k2DlKeJZOeVII+lsDLjnakjRo7CVPhvr/1deTnw2BMTaNKMAzaH06Q5ZBKSazrpDCgtfSXWBPQipm5QGB1Gd8PQj4G+WKugPfr8HDoewvYfNpMthTnW0aOZVNLUnjcGQhWD0CqKFBg0DcZcVAWKQzNaJ30AdQL1g5A0YYXipMko0iFDAZCKWvSrWe4qinaQ0MFPQ4oL2o7Wrlc/uRhTXiQ1ZOX9dMoJnljjoAWSklCsUkS0R7mAvHV8OHXDa2uUO3wYNlDB4x7YjmSvANgrJLhDexcS69Z7/eXnlJcrtsst3PGEUqP0zIW0tLQWLdT0sQyJ0N4F6PXMA8aUXbkLgOKHPv7uK8O/XkMfrAfyN7F+tRJc4KcGvGOxXsHns12eHTjRIBB36wbD5jBBxo3TvkiXUnghsY6xfe/Tj9xmFbXr1F1Y8KiC8DhpxgiCUYyWmvELmQcyExjBMfdSjqJAl5AuBPWvb8RPSTdNSa9/vZr2ndmfbYyY+09hoC/WsEUrKDARWl5duN5bJ1Anu3ftcFldqN8g6diRTAgIhskZeYZcUdUaGSsKmCJjUo4ioCpSA/sVUCh9mdcETpE9gSJDW39xz0fQcHSKgdEAKwTKT7kxn9ZWkhF950ebPc4LYZpAG1Fr6iA6MsyXpiyZlCKaXr8Kykur6GHBpRTIsPXZRMg9CkkhQZJtofainJAlZ+qNh9ft03WtaVU/ZHAtGCJkLVHPIRp0LdL07oy4bxQ6PO9dcAJFMC230JqKcgilSGTNhd27d9PGBZCamnrLLeoRVxkSuf+MgGUAVUp7CKCGabneWLFfp/Y/0tMK9ueNh79+0E/L+/quQys/v80I9rOBar2BnjhQUu6rC7TzEcLwG9UljLWKr4y48NHjPnmPERK/tKpBpYAzM7AFkpZPnErhhdTufV7924S7Bv4sMVE9nrDlD38cj19aY8cRdEDRoSe4GGTxC1n5WsAIjvEOweigoZbBhIkEBIOmoTBw0shorEwEVkdpAb+4dO3ea8a0qd269yZnv4FDtm39HsV84tHfYdZFnvR4AvYBVRd8YGe0at3OFCzkioIKwbBOwz2tCqgTgXmzPhWeWfBflDgwj2fzC/bWobUZ7MQIzsHg5Ok7lDptfSB/hEcisFHIx2XODaxb9jZONgwIelpPl0ZLUXPrShEqE6Wgq5Dyph0MdFEcTvYKlQK2CD1rcMqeUymckgWh9ShaBHKHnhMhNWSb/v2VjAw6kCCrc1Nb2IKy4CyMIQpptdUIlIKTwsE10GxQG9pB4oWuN/RCl3afOSADsJ+4mxEws0J4blWGnM/zf5edt/JE7rfZeWfz1ABeEbnsXgJ9ZM/muo3NG3kE4bICo/DqJxc7Pa6GAmB97AR0EibKbBaUAvIS6PIDWh/2GRkipr6k22clB9Zq9xdv0bsiLPtdn2z18hirSv6pYm1gbNasWdhfAv3FsdzX9+b8+0Tu+XzlUynK17tW7OiUSrfVjY2KcpsflkMuO3NBvhkhCAAzQkwQSR6y8n59ERuz5EW/muVkTFBETN/DpRI8IuZC+QEmAv0XBmHqP5/cPL3DaOPfcJQ7VKwmqXvPNFG25sKJi/77tp6bm5mr3BZuuiJ2RrsqSXGltx+g5MjqgiAIFQAxF4RiUYbmwrGc/D7fnP3+dMGSggNNqkav6ByfUqXCWAxFzIW8vDySywN16tRRkiAIgiB44PDhw/Xr14eQlZVVJuZCvt//iw3nvjzuuK6g06l6THqX+MrRFeOpREVaCQkL8kVKQRAEIULMPHjRo60ANpzOe31vjnKUey47c+Hy/CKlUBLm3DXn3R7vKkeJ2frR1meinjn4jeMu+lJjx44dN95444oV4fmKVdhBxpA9ZFK5Kyblp7mF0mHibrP6bxYfvfjaau+3j68WY7OKMGlvTm6+1+1048aNGzlypHIUh4kTJ06bNk05QqWUzIURAZSjTCmHqwtdGvs2fa1kJxDms8KtRSGCFAb1UHJ5BmMrRliMsyY9nf5aOvzxq9wOIAriKkdgvH71yleVo3RZ8vgSHMpRYlAuVEjpq583AyhHZIj0JZx6VNmCzLh05rJqbqEkbD2Tt+VskS0LjatG//vaatfViHnhpwtn7P6L8lCOf3WWp20AMJ3pVYcrV64kH3cGDx4cXmu7NMwF2DX16oXt23olJKKrCw8O8z0zRslCyCRdW7jLuob2nrgtc7bc8uot+9LD86oZ7wz5YMi9q+5VjhLT+o7WT/uf1svoEb0qQohupUWLFkuXLu3VS72LuryBjCF7YXm3m1OPKgXC2NyYVKTEkIdQTll/qojiT65i2Ar1K0f96ruzGRfya1WK4iNW+y/Kb4rGcmL58uXdAqSlqf9pKmUibi6kp6dnZmYOGWK879bEjz/+uFgDTnUikkRudQET94P7fU9PUs63Jhn3Nh28eIAw5ENWBX4hH9zn69/VELoU+TiLmW/SVFykTPAlOOJns5UPDtguBI0yOEZp3zukS+Pg9QaydcjTJSfPPvssJoI3BoDMnuQDaHH74YcfpmD0CyeFDAQxCLoGXuuqWvqISROsbo922zxLvSAPMzOeKdJEjZYfMlZnfDjkQwg46CxAAJMP4pIPTrHPkseXkCelTLNSdhIcUfd/9cpX2RNOipj2X2k4yJMWPDiuPl/ki/IqCAT21CegqBBUi3I4QI8YCJpboHWGDVO9ATK1BTeZ3hBz5swhT4C4lNSHAciTApM/gSgU1wr3E6AHU14BT6dLIJPkRACKBThBLg4E9nTJCWHtUVTDOLh1eDUI1c7NYQpGPtxAFAXh0ZG4G1D7ujc392RAPjj4EsDU3B2u841/2bg9gy5GCmXFkZzC9YOqMVH/vja+WdWoKtG+xZ3iT/RO0I+f1S40/Y5c9PQwAsq0VatWvXv31s2FadOmYUKuHD7fyJEj586du3LlysGDjRf5jR07Vn94MW7cOPgDhFFemicE8qE0AfnTUwwjir+A48ePH4kAffv2Xbt27WeffQZBeRXw9ddfv/LKK6MCQIBTnQigslVBuP5K/+/vVDKRHK0EZsJj/r//l5Jv6+6f96GSEXfjOiU7gTA4AGKRgChIhECypqsDThYCXQu/FAUCh0eucAD4cJ45ipVnnnmmT58+27dvh8wCA/v3oYcegoBfMHv2bAqDX/Lk8OTzxtL0Ts9P4eOut2fRWStpr6Yt/s/FEN7p/s6WOVvIB3LgpH/2sNlwkswBCMgTfBMoLoKxgCNw3j8pZRLFRUTI5IkoB9YfIFm/kI6tJ9KnS5hkHVPifFHOFXzIE5nnsx65807VtKhqltFqU6dO5dZhEACeylHQKCYQEShHACSixwqKnhMIptSA9RKE3sHQl/TiAAjwIU/khwTvPQqtQP2EeggJ1h4FH24sCkYCtRQ3EAJzgjiltzv8OQUOD9wv4QRuTNynTrencOjQIRJOnjy5vjggPJQgxQ2ZKXsv+L7I4uOPO87D81yef3JGzqt7L+hHqzWnOdiEnUYwd2BG33fffSTDCPj4449Jfvvtt1966SWSAcLwqUGDBvHtgzBwIhHICACZ/ZEayRCQGgT8IgClgyicTmRXF6ZPnw6rv2lT+zcoNG7c+Oc//3mLABDgVCciSSRWF2Dv97/D9+Ys5SQ6pxr++oaDDV/5nvujmr6vT/MddHw3f+EihD7LH/+K8dv4qoADluYKIxEKhmQPFnwZknxwHAys2SMDDVN8vyz6NuRv0nzz56hg0143PjdFjPyDEr7aY46ig3GZloj5GRPPSp9++mnyAbCC8QtPcgJU/gMPPEAh4cTEcXSfrt/8eRQf749Urze2gnE2JdV4UXxyt+TNswunZV6okVLj5leMrxLz5DJjTUb3sd1Jbntn21MFX9JLHZNKQtAFZMwR2wxpoxza6kXafxVvnXBf+j6+aNuhhTm59VXjG4BB1xJMoEozMzOphlHVkMn/qaeeWrZsGVpn8uTJ5GNLu3btEJHm9y60adMGSWFar9wBeD2Ap/5Ih3yQE/KhpYIHHyzmJ9ECbNmyZehQ1SlhRmBGQfLo0aPxm5SkGstjj8IkPqV7Sus7jFcJ4Rc95OA3ByFk7c2ilQBM/bs9arwgKGN1xlud36LGhZPXCaj/IMpjex8jH05wyAdDqL9ZQdfl5macLmELbswFa42VQl5lFMoPzeOLqNSXd18Yv/NClWhfzVjff26/8Ni283xsO1P4AKJ51eD/SJmWltatm3pjFYbf9HSvL9tmUlNTe/bsCWFwYOEBNyNAsrz8MGDAALpDQcuWLSkYoiQmJsIIgxxZc2Hp0qWzZs269dZbJ0yYgJELgqmQycnJUCoAgvKKMJHYu5CR51vwUeHiP/HJKsP/ndcNlcxGw9QPDE86HnDe5UBxcUBtuzBgSGFqiAKQB/ZMcq1RWAYc12TohMCUKVMw20Nz41d5OYAwDDr9lGVrr/3rVD5+NU19PMkKP2KAPoayV75lBJQN9DqpE3JCu8DCwJH6n2ZlUMrAhlP1G0D5+ny4AXGKhwNbYEwgCubx0PEuRgP0PaWMYGw0UFyAW5580Cugy+Hz1ltvkU8p4L1H2QLbcc+KPWjQtsMKX+ZGLUtHWHaNWPF+CQwm/bsaI4nLACKUFTfUjKlaVKk+/9OFZ3/KGd6g0uRWVWzf+hwd5etzRaxyOAO9vmDBgsDDgcEQMN13v5et1K5dW0kByAIAY8eOpWQnTZrEX42GiUACcfToUfxG1lyYMWPG5wFgLmCogsD2EZMSQDkiT4T2LkCvY35v/b8DaHHob8zmQVIjw3qwJT3IdM6GpBRjhcD6FJM+NYmZB60uYC6yPk0F470LsCSmOeQkZGh6B01DTlvQB0xTUo9zwfTX0jF883gKHwzoNVNqYi5Isv4YGGSkBbEnUm5I+e6970iG/UHrFt75/LHPMYNUjgCYnpJgWl0IujEzuVvyljnGJ61B2qtpcJIcGrDAYBZYn+Jj6g/NDf7yl78oL2eg+GEHbN5cWKWY2StJA0YDErQ9xdD60/vvv09OWpSy3WTgng5o06bN8uXLSUY3g5NkEx57VOs7WsMApXk87Q4hJd3+1+3RHJtnb247VJkLaFne0FByuLlxUe603i+B+xp38YK1bot/QhlSPTbqzvqVlKOAp3eev2Hd2dmHL1az07e31I5pFOzFjnPnzoX+xi+D2T/fDiVEpRjA/Z8tI2sulEMi958RsAxgENAeRt5diGN9utr/SJN49mdNj4k+PaRw3+poAuPF+JfVHkkcdN1+Qww7AM6FHxtPQwikT8EwIyEwL4EnRcRR8lVNWnDGr9MgTmDeyTvaeMnaCxhhdT0KZQ+DgBZ+n4l65sMhH+pz+tTHUnmDofKyAGW/+cPNFAZxKSkrMEQQYPFji6FaINCYPueuOacyTlFcHPDhnODQc3LzKzdTRBxICj60FQ7CW53fop103R7tViO5BoWhKPgtCZjKY1pPlUy7Gul3yJAhvXr1atu2LdU8PTuAbfH0009DgA8mK4FIBrAV+JEBBBjZ5E9LDkiBnLjQI488QsGs9OnThxKvW7fwA6TPP/88Z4/tBqdLQEC/ogwj/0iHwlAU/JaEO+fcSY8A0L53faJMaTIaMtao3gUe2/sYdyfe/OgR2+aGjQtPdGnuKh4vgREDA0VGnrHnUSi3PN00Lt7yfoW0rNxlJ3JPW/6RMjbK99dmVZTDmfT0dNNMG05aqm/VqlVaWhqtNEDf8/IAwUsItsB8h9mh75R057J7CTRGJXlTkyAIwiVJmb8EGsw4kPMfW857+W+HV1rE/WfjOOVwYOXKlZMmTYJSp8U5ZvDgwSNGjMAvTtH/SqSmpm7fvr1///7whHPatGkLFixITEyk/3SoXbs2b1NAgDFjxtBWBniykUEJIvzx48fHjh1LnghAaco3IwRBEIRLhPJgLoD/2Zfz8Lbzuc4mQ3SU77mmcX+6KoitUK647B5GRGjvgiAIgiAQv0+uvPq6al1r2mvY9tWj/9UpvmLZCkBWFwRBEIRLhHKyusB8lZW38OjF7077s/L81aN9bROib60d26NWjO1/SZRzZO9CiZCdEIIgCOWH8mYuXErIf0aUCLEVBEEQhMuBiJsLt2qE8CKqsBPevQvlbScEf0WC/q9SEARBEMJCaawu0JuagPUdTaVPBVpdoJc3FIsHxhj/lj3A5ntewYGpYX3NlCAIgiCAsnwYsXv37mUacKoTkaSirC7wq15J1u2GLo3Vi5Ug0FqCu1WBs/RKKKTDBoH1i5QwNZIaFe9VUYIgCMJlQmmYC/Qk4vHHH1fuAvLz83fu3EnvmYcApzoRSSrE6oLpVa/47ZyqPjxBih+qHXy1R330YeQfivf0AUkd2q/idupSGPfNWca3styND0EQBOEyJOLmgnoO8fnnkKdPn06eRLNmzW666aamASDAqU5EkvK/ugDlbX3Va7/bfQsDL8yd+56h0YkHh6kVguJ+AMLpi5Tg6UnyTX1BEATBTOk9jGjbti1/c5bw+/1NmjShL1JC4H/pjCjlf3XBVmE/MMb49gTY8JVv8K8N4bPZhsrn1YXigigUF4f+RUpbY0UQBEG4zCk9c2HWrFlXX321chQAE+GqAKVjK4AKsXcBxsHUD4y9C/QAgujcTW1ZYEXOn6h2X11AsD0/GcJzBY+DnL5I+eAw40vcsBUEQRAEQSey5sKuXbto4wIYNWrUwIED1QkNGAqlZiuACrF3AfxyqLF3gT85DfoNMeb9/W5XTtrWQA8UeHWBNjDOn6O+S0nWRv87jHTg5KcYMEesX6TE78H9xn4IQRAEQTAhb3UsEeFNTRAEQSgJ8lbHSOHz/T+YhpLRwpBsLAAAAABJRU5ErkJggg==" /&gt;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;The policy engine "know" about a &lt;a href="https://msdn.microsoft.com/en-us/library/azure/dn910913.aspx#CLRTypes"&gt;subset of .NET types&lt;/a&gt;. The namespaces are already pre-imported so you don't have to reference any namespaces in your expressions.&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;To understand how to create the canonical header string, you can take a look at the code in the &lt;a href="onenote:Posts.one#http//azurestoragesamples.codeplex.com/releases/view/61325&amp;amp;section-id={CCCEBFFE-9377-4E6E-B681-19B61385533E}&amp;amp;page-id={698CB9D4-E2E1-4653-AB8F-312EE29141C1}&amp;amp;base-path=https://microsoft-my.sharepoint.com/personal/cschittk_microsoft_com/Documents/Notebooks/DX CSA Customers"&gt;storage samples&lt;/a&gt;. However, it's pretty easy to troubleshoot problems with the Authorization header. A malformed header or a bad signature can manifest themselves as a 500 Internal Server error. Inspecting the &lt;a href="https://azure.microsoft.com/en-us/documentation/articles/api-management-howto-api-inspector/"&gt;trace data&lt;/a&gt; (ideally with a &lt;a href="http://jsonformatter.curiousconcept.com/"&gt;JSON formatter&lt;/a&gt;) you'll find that the error was a 403 Authentication Failed. (&lt;span style="font-weight: bold;"&gt;Note: &lt;/span&gt;Tracing is only available when you're logged into the developer portal with administrator rights).&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in;"&gt;&lt;img width="1274" height="261" alt="Machine generated alternative text:
&amp;quot;outbound 
&amp;quot;source&amp;quot;: &amp;quot;handler&amp;quot; , 
&amp;quot;timestamp 
&amp;quot;elapsed&amp;quot; 
&amp;quot;response 
&amp;quot;status 
&amp;quot;reason&amp;quot;: &amp;quot;Server failed to authenticate the request _ 
Make sure the value of Authorization header is formed correctly including the signature _ " src="data:image/png;base64,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" /&gt;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;In other cases, you'll find the directly in the API response, which you can test in the developer portal. Missing a header value in the signature causes signatures computed by the API management proxy and the Azure Storage service to be different. The error message returned from Azure Storage will show the canonical headers that Azure Storage expects.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in;"&gt;&lt;img width="663" height="163" alt="Machine generated alternative text:
is not the same as any computed signature. 
text/x ml 
x-ms-date:Tue, B2 Jun 2B15 GMT 
/inintestqueue/myqueue/messages ' 
4/ Authentic 
K/ Error) 
Serwer used following string to sign: 
'POST " src="data:image/png;base64,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" /&gt;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;The line breaks are extremely important.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;Make sure the headers you're using in the policy to compute the signature match exactly the headers expected by Azure Storage.&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;The sample &amp;lt;outbound&amp;gt; policy doesn't do much at this point. An Azure queue message is an XML document with a number of metadata elements. This policy strips out all the metadata from the XML message and returns the message text only. The message text could be a JSON object to make it very simple for javascript clients to process the response.&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;lt;outbound&amp;gt;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;lt;base /&amp;gt;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;lt;set-body&amp;gt;@(&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;Encoding.UTF8.GetString(&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Convert.FromBase64String(&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;XDocument.Parse(&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;context.Response.Body.As&amp;lt;string&amp;gt;())&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;.Descendants("MessageText")&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;.First()&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;.Value)))&amp;lt;/set-body&amp;gt;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;lt;/outbound&amp;gt;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;We also could compose a response following a well-defined message format with a more complex .NET expression, but we'd still be able to leverage API management and not require standing up any infrastructure to deliver notifications to iSupport customers.&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;Hope this helps with crafting policies and exposing internal services securely via queues.&lt;/p&gt;</description><pubDate>Thu, 11 Jun 2015 13:35:47 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/cschittko/api-management-plays-well-with-other-azure-services</guid><category>azure</category><category>api management</category><category>policy</category><category>storage</category><category>signature</category></item><item><title>Azure API Management - Who's calling?</title><link>https://weblogs.asp.net:443/cschittko/azure-api-management-who-s-calling</link><description>&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;API Management is one of the lesser explored areas of Azure. Regardless, it's a very powerful service to layer onto your service to add:&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul type="disc" style="margin-top: 0in; margin-bottom: 0in; margin-left: 0.375in; unicode-bidi: embed; direction: ltr;"&gt;
&lt;li style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle;"&gt;&lt;span style="font-family: Calibri; font-size: 11pt;"&gt;Governance&lt;/span&gt;&lt;/li&gt;
&lt;li style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle;"&gt;&lt;span style="font-family: Calibri; font-size: 11pt;"&gt;Throttling&lt;/span&gt;&lt;/li&gt;
&lt;li style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle;"&gt;&lt;span style="font-family: Calibri; font-size: 11pt;"&gt;Analytics&lt;/span&gt;&lt;/li&gt;
&lt;li style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle;"&gt;&lt;span style="font-family: Calibri; font-size: 11pt;"&gt;Authentication&lt;/span&gt;&lt;/li&gt;
&lt;li style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle;"&gt;&lt;span style="font-family: Calibri; font-size: 11pt;"&gt;developer documentation&lt;/span&gt;&lt;/li&gt;
&lt;li style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle;"&gt;&lt;span style="font-family: Calibri; font-size: 11pt;"&gt;And more stuff&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;hellip; just like that. It's a fantastic example to illustrate how Azure can take care of the work that's not as interesting as the code that your boss wants you to write to add new features to your service.&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;Since I've been playing with it a little bit on behalf of a few service providers now, I thought I share some of my learnings. So here we go.&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;Imagine you have an internal service API you'd like to expose to the rest of the world over the big, bad internet - securely.&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;Azure and API Management make this daunting task a rather simple endeavor. Yes. Really! Secure &amp;hellip; as in &lt;a href="http://download.microsoft.com/download/C/A/3/CA3FC5C0-ECE0-4F87-BF4B-D74064A00846/AzureNetworkSecurity_v3_Feb2015.pdf"&gt;security infrastructure for DDoS prevention, Intrusion detection, etc. are in place&lt;/a&gt;, as well as application security like authentication and authorization. All that without running a single cable or having to punch holes in your firewall.&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&lt;span style="font-weight: bold;"&gt;Security Infrastructure&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;API Management avoids you having to expose your service to the internet directly. Instead, it provides your endpoint on the internet, which runs in Azure and therefore piggy-backs on the defense mechanisms in place for all Azure services. You &lt;a href="https://azure.microsoft.com/en-us/documentation/articles/api-management-howto-setup-vpn/"&gt;connect your Azure API to your internal service via a secure VPN or an ExpressRoute connection&lt;/a&gt;, which means your server is not directly exposed to the internet. If you don't want to or you can't set up a VPN connection, you could also make your service listen on a queue and then layer API management in front of the queue - which will be the topic of the of the &lt;a href="https://weblogs.asp.net/cschittko/api-management-plays-well-with-other-azure-services"&gt;next post&lt;/a&gt;.&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&lt;span style="font-weight: bold;"&gt;Authentication / Authorization&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;Now what about letting only known users use the API? It's an internal API &amp;hellip; It's probably not built for OAuth or SAML authentication. API Management will help you avoid writing authN or authZ code as well. First off, you &lt;a href="https://msdn.microsoft.com/en-us/library/azure/dn798668.aspx"&gt;secure the API with an access token&lt;/a&gt;, which maps to a user in the management portal. You can also assign group memberships to those users. Those groups can be handy to implement authorization in your code, since you can check groups or roles fairly easy.&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;API Management can do the translation from user to group using &lt;a href="https://msdn.microsoft.com/library/azure/dn894081.aspx"&gt;policies&lt;/a&gt;, which means you don&amp;rsquo;t have to change your API. Authorization can occur using HTTP headers. Policies can translate the API Management user and its groups into an HTTP header.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;For example, this policy will add a header with the username of the user associated with the certification used to authenticate the call:&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;lt;set-header name="X-User" exists-action="override"&amp;gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 0in 0.375in; font-family: Calibri; font-size: 11pt;"&gt;&amp;lt;value&amp;gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 0in 0.375in; font-family: Calibri; font-size: 11pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;@(context.User.Email)&lt;/p&gt;
&lt;p style="margin: 0in 0in 0in 0.375in; font-family: Calibri; font-size: 11pt;"&gt;&amp;lt;/value&amp;gt;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;lt;/set-header&amp;gt;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;While this policy will construct a string listing the user's group memberships:&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;lt;set-header name="X-User-Groups" exists-action="override"&amp;gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 0in 0.375in; font-family: Calibri; font-size: 11pt;"&gt;&amp;lt;value&amp;gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 0in 0.375in; font-family: Calibri; font-size: 11pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;@(string.Join(";", (from item in context.User.Groups select item.Name)))&lt;/p&gt;
&lt;p style="margin: 0in 0in 0in 0.375in; font-family: Calibri; font-size: 11pt;"&gt;&amp;lt;/value&amp;gt;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;lt;/set-header&amp;gt;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;Your API implementation can now check these headers to authorize against your group system, e.g. Active Directory without having to change API methods and their implementation.&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;If you really wanted to, you could also add policies to modify the actual API call with a &lt;a href="https://msdn.microsoft.com/en-us/library/azure/dn894083.aspx#SetBody"&gt;set-body policy&lt;/a&gt;. We'll explore that policy in the next post.&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&lt;span style="font-weight: bold;"&gt;Policies&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;Both policies were written using &lt;a href="https://msdn.microsoft.com/en-us/library/azure/dn910913.aspx"&gt;single-line .NET expressions&lt;/a&gt; and the &lt;a href="https://msdn.microsoft.com/en-us/library/azure/dn910913.aspx#ContextVariables"&gt;context object&lt;/a&gt; provided by the policy engine. The policy can work with a subset of .NET classes and most language constructs. As you can see above, even Linq queries work.&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;You can even write complex multi-line .NET expressions, which will be part of the examples in the &lt;a href="https://weblogs.asp.net/cschittko/api-management-plays-well-with-other-azure-services" target="_self"&gt;next article&lt;/a&gt;.&lt;/p&gt;
&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&amp;nbsp;&lt;/p&gt;</description><pubDate>Fri, 05 Jun 2015 14:20:30 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/cschittko/azure-api-management-who-s-calling</guid><category>azure</category><category>api management</category><category>policy</category></item><item><title>The Third Industrial Revolution - Fueled by The Cloud</title><link>https://weblogs.asp.net:443/cschittko/the-third-industrial-revolution-fueled-by-the-cloud</link><description>&lt;p mce_keep="true"&gt;&amp;nbsp;It's so early in the
days of cloud computing. Many haven't even started to realize the magnitude
what this shift could be.&lt;/p&gt;&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;" mce_keep="true"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;It's the change from
custom to standardized… Yes, there's the often cited analogy to the evolution
of power supply. From having your own water wheel to plugging into the electric
grid. My current favorite analogy is clothing. People had clothing for the longest
time, they still do, but lots of things have changed since a few hundred years
ago when people either made their own, or they could afford a tailor to have
their clothes tailor made.&lt;/p&gt;&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;" mce_keep="true"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;Because of that,
most people didn't own more than a few pieces of clothing, but the few tailored
ones they owned fit very well. With increasing industrialization came clothes
in standard sizes. It was more economical for manufacturers to make just a few sizes.
Over time, even the number of sizes went down. Some companies only make S, M, L
and possibly XL. Why? Because it's even more economical to make as few sizes as
possible. &lt;/p&gt;&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;" mce_keep="true"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;Cloud computing is
going to put the world of computing through the same evolution. It takes
computing to the industrial age. We're moving past the times where environments
were made from scratch and purpose built. In the industrial age, it's about
buying mass-market products, manufactured to fit "good enough" for
many but not fitting perfectly for just one use.&lt;/p&gt;&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;" mce_keep="true"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;Clothing brands that
have more differentiated sizing today are usually more expensive. They have to
pass on the higher manufacturing cost and cater to customers that prefer better
fitting clothes over cheap ones. You can also still got to a tailor and get
custom made clothes, they fit great, but they are far more expensive than
buying a standard size. &lt;/p&gt;&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;" mce_keep="true"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;The analogy seems to
hold when you explore deeper. Custom clothes never went away. Special purpose
clothing is still not mass-produced and sold at Walmart. In fact, department
stores, high-end boutiques and custom tailors are still around. &lt;/p&gt;&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;" mce_keep="true"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;Computing will
undergo a similar evolution and thus fuel the Third Indstrial Revolution.
On-prem computing is not going away, but there are many the cases where
"good enough, easy and cheap will do". Those cases will go to the
cloud. In the cases where you need something special, you go to Nordstrom for
clothes, you'll stay in your own computing environment for computing.&lt;/p&gt;&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;" mce_keep="true"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;What's uncertain is
the mix between on-prem and the cloud? I would think that Kohl's or Target sell
a whole lot more clothes than Nordstrom or Saks. Target's price points and the
ubiquity of their stores make buying clothes cheap and easy. Overall, Target's
annual revenue is about 70x the revenue of Nordstrom. While they're both
retailers, the experience and the products don't compare. They address
different scenarios. Sometimes cheap and easy is sufficient. In fact, I may
sacrifice some nice-to-haves when I get something cheap with a 5 minute trip
around the corner.&lt;/p&gt;&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;" mce_keep="true"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;In the world of
cloud computing, I don’t get the same high-performance, highly tuned servers I
can put into my own data center - BUT I don't need those in every scenario. In many cases, an &lt;a href="http://www.nist.gov/itl/cloud/index.cfm" mce_href="http://www.nist.gov/itl/cloud/index.cfm"&gt;IaaS&lt;/a&gt; environment with all the constraints of a standardized environment will be good enough. With the right architecture, an cloud environment
can still deliver well performing and highly scalable solutions. In
some cases however, the cloud doesn't meet performance or scale requirements
and then I have the option to engineer and environment that will meet my needs.&lt;/p&gt;&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;" mce_keep="true"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;If the analogy holds
then cloud computing is just as transformational as the introduction of
standardized clothing sizes. When S, M and L came around, it wasn't about
giving people the ability to express themselves with wearing different styles!
It was about meeting the scalability needs of war that needed to put uniforms
on soldiers.&lt;/p&gt;&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;" mce_keep="true"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;It wasn't about
starting a fashion industry that has to create new styles every year. It wasn't
about lifestyles and creating the job of the super model, but the new means of
mass producing clothes gave rise to new business models, new industries and impacted
the lifestyle of billions of people.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Cloud&lt;/span&gt;&lt;span style='font-family: "Cambria Math";'&gt; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;computing&lt;/span&gt;&lt;span style='font-family: "Cambria Math";'&gt; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;started&lt;/span&gt;&lt;span style='font-family: "Cambria Math";'&gt; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;with&lt;/span&gt;&lt;span style='font-family: "Cambria Math";'&gt; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;making&lt;/span&gt;&lt;span style='font-family: "Cambria Math";'&gt; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;computing&lt;/span&gt;&lt;span style='font-family: "Cambria Math";'&gt; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;more&lt;/span&gt;&lt;span style='font-family: "Cambria Math";'&gt; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;affordable
and scalable&lt;/span&gt;&lt;span style='font-family: "Cambria Math";'&gt;. &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;What's&lt;/span&gt;&lt;span style='font-family: "Cambria Math";'&gt;
&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;going&lt;/span&gt;&lt;span style='font-family: "Cambria Math";'&gt; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;to&lt;/span&gt;&lt;span style='font-family: "Cambria Math";'&gt; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;happen&lt;/span&gt;&lt;span style='font-family: "Cambria Math";'&gt; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;when&lt;/span&gt;&lt;span style='font-family: "Cambria Math";'&gt; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;computing&lt;/span&gt;&lt;span style='font-family: "Cambria Math";'&gt; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;is&lt;/span&gt;&lt;span style='font-family: "Cambria Math";'&gt; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;cheap&lt;/span&gt;&lt;span style='font-family: "Cambria Math";'&gt;, &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;easy&lt;/span&gt;&lt;span style='font-family: "Cambria Math";'&gt; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;and&lt;/span&gt;&lt;span style='font-family: "Cambria Math";'&gt; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;ubiquitous&lt;/span&gt;&lt;span style='font-family: "Cambria Math";'&gt;? &lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0in; font-size: 11pt;"&gt;&lt;span style="font-family: Calibri;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0in; font-size: 11pt;"&gt;&lt;span style="font-family: Calibri;"&gt;It's&lt;/span&gt;&lt;span style='font-family: "Cambria Math";'&gt; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;very&lt;/span&gt;&lt;span style='font-family: "Cambria Math";'&gt; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;early&lt;/span&gt;&lt;span style='font-family: "Cambria Math";'&gt; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;in&lt;/span&gt;&lt;span style='font-family: "Cambria Math";'&gt; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;the&lt;/span&gt;&lt;span style='font-family: "Cambria Math";'&gt; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;days&lt;/span&gt;&lt;span style='font-family: "Cambria Math";'&gt; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;of&lt;/span&gt;&lt;span style='font-family: "Cambria Math";'&gt; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;cloud&lt;/span&gt;&lt;span style='font-family: "Cambria Math";'&gt; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;computing&lt;/span&gt;&lt;span style='font-family: "Cambria Math";'&gt;. &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;I&lt;/span&gt;&lt;span style='font-family: "Cambria Math";'&gt; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;don't&lt;/span&gt;&lt;span style='font-family: "Cambria Math";'&gt; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;think&lt;/span&gt;&lt;span style='font-family: "Cambria Math";'&gt; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;I've&lt;/span&gt;&lt;span style='font-family: "Cambria Math";'&gt; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;grasped&lt;/span&gt;&lt;span style='font-family: "Cambria Math";'&gt; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;the&lt;/span&gt;&lt;span style='font-family: "Cambria Math";'&gt; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;magnitude&lt;/span&gt;&lt;span style='font-family: "Cambria Math";'&gt; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;yet,
but we're seeing the early signs of transformation. New business models are
emerging, new content offerings … new ways to build companies.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0in; font-size: 11pt;"&gt;&lt;span style="font-family: Calibri;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0in; font-family: Calibri; font-size: 11pt;"&gt;It's going to be
exciting times.&lt;/p&gt;&lt;p mce_keep="true"&gt;&amp;nbsp;&lt;/p&gt;</description><pubDate>Mon, 27 Aug 2012 04:11:00 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/cschittko/the-third-industrial-revolution-fueled-by-the-cloud</guid><category>Azure</category><category>cloud</category><category>cloud computing</category><category>cloud strategy</category></item><item><title>CFOs, Fiscal Cliff, Cost Transparency and The Cloud</title><link>https://weblogs.asp.net:443/cschittko/cfos-fiscal-cliff-cost-transparency-and-the-cloud</link><description>&lt;p&gt;CFOs probably look at the business very differently than IT&amp;#160; … that's what I thought joining our CFO &lt;a href="http://www.linkedin.com/pub/john-rex/4/364/518"&gt;John Rex&lt;/a&gt; for the Breakfast at the &lt;a href="http://www.evanta.com/cfo/summit/dallas/2011"&gt;CFO Summit&lt;/a&gt; a couple of weeks ago. I was eager to listen and learn what's on a CFO’s mind and how Cloud Strategy plays a role in their thinking.&lt;/p&gt;  &lt;p&gt;A couple of things shouldn't come as a big surprise. &lt;/p&gt;  &lt;p&gt;1. CFOs mostly face the same problems we're all facing. Only few problems are finance-centric, but many of the bigger business problems have a finance perspective, just like they have an IT perspective.&lt;/p&gt;  &lt;p&gt;2. CFOs don't think about technology or about The Cloud in particular all that much, even though cloud computing can ease or even solve some of the problems they are thinking about.&lt;/p&gt;  &lt;p&gt;Familiar topics that came up during the discussion were&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;the shortage of skilled labor&lt;/li&gt;    &lt;li&gt;understanding the true cost of different areas of the business and &lt;/li&gt;    &lt;li&gt;the need to be prepared for change. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The exclusive group of financial leaders of Dallas also discussed more finance-centric topics, for example the financial cliff and cost control measures.&lt;/p&gt;  &lt;p&gt;The surprise was the realization that The Cloud can play a vital role addressing some of the challenges. &lt;/p&gt;  &lt;p&gt;&lt;b&gt;Escape the Labor Shortage&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Take the labor shortage for starters. It was interesting to hear that finding skilled workers isn't a problem unique to IT. It affects all business areas. Just in IT, the shortage was cited as a blocker for growth. It's ironic that the resistance to moving to the cloud in IT often stems from fear of losing work when at the same time business leaders complain about trouble finding skilled workers.&lt;/p&gt;  &lt;p&gt;We've&amp;#160; been promoting shifting workloads to the cloud as a way to increase focus. Free up the skilled workers you’ve already hired to focus them on what differentiates your business instead of deploying them on tasks that are merely keeping the lights on – like running your email system for example. Rely less on hiring new workers to manage growth. Instead focus (re-using the word) your existing workforce on enabling growth and new business. &lt;/p&gt;  &lt;p&gt;Moving to the cloud is definitely a way to escape labor shortage in IT.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Cost Awareness&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Another, surprisingly open discussion was about cost hidden in different areas of the business. There were some examples about how the country's obesity problems were contributing to higher cost for employers due to increases in healthcare cost, but also loss of productivity, etc. &lt;/p&gt;  &lt;p&gt;The attendees didn’t think about the cost of IT -- yet. With attention shifting to cost in all areas of the business, It's just a matter of time until we get asked for more transparent accounting in IT. Public cloud offerings make accounting for the true operational cost of an app extremely transparent. If you want to see the full operational cost of running your app every month, just take a look at your Amex bill. For a more detailed view, you can go to your cloud provider’s portal and get cost broken out by compute hour, storage, bandwidth, etc. Those numbers include all the cost that's so easily hidden in shared cost buckets, e.g. power, cooling, data center real estate, shared support teams, etc.&lt;/p&gt;  &lt;p&gt;Not many companies have invested in infrastructure or processes to support this kind of transparency because it requires equipment deeply embedded in the data center infrastructure. With workloads moving to the cloud they don't have to make that investment and get all the accounting transparency benefits of the cloud. The monthly report Windows Azure customers receive breaks out true cost by application, location and resource utilization.&lt;/p&gt;  &lt;p&gt;&lt;a href="https://aspblogs.blob.core.windows.net/media/cschittko/Media/clip_image001_58B7749D.jpg"&gt;&lt;img title="clip_image001" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image001" src="https://aspblogs.blob.core.windows.net/media/cschittko/Media/clip_image001_thumb_6FE9DF87.jpg" width="485" height="267" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Cloud Computing to avoiding falling off the Fiscal Cliff &lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Then there was the conversation about the &lt;a href="http://www.huffingtonpost.com/2012/07/08/fiscal-cliff_n_1657459.html"&gt;fiscal cliff&lt;/a&gt; that the US is heading towards and other factors that cause a lot of uncertainty. The response to this uncertainty is to be very conservative with cash on hand. That means that it’s getting harder for businesses (and IT) to get capital for long term projects and investments. In the past this would have meant the death for many big projects. &lt;/p&gt;  &lt;p&gt;Here's where the cloud is going to make a difference. Big projects no longer require the same level of up-front capital. The cloud dramatically changes the financial profile for projects and innovation. In the past, getting projects off the ground required CapEx. Servers, racks, network gear, security equipment, etc. had to be purchased for dev/test/staging and production environments for example. Those costs alone could run in the million dollar+ range for decent sized projects. The cloud moves all of those costs to a pay-as-you-go model, which is pure OpEx - there is no CapEx required. With the pay-as-you-go model, you get to chose when and how much you want to spend. If having larger environments on hand help you move faster (and you can articulate the ROI), then you can get larger environments for the time you need them – but you’re only paying as long as you need them.&lt;/p&gt;  &lt;p&gt;Likewise, companies don't have to delay upgrade projects or hardware-end-of-life projects that wouldn’t qualify as innovation, but under the circumstances, companies might opt to ride the risk of outdated hardware and out-of-date software. Why deploy new capabilities if the business is used to the old functionality by now? Staying current business trends isn’t all that important seems to be a rather prevalent mindset.It’s not a healthy mindset, because the aggressive adopters will seize the moment, especially now, when moving to the cloud not only addresses the out-of-date software and the unsupported hardware problems. Again, it changes the cost profile entirely to predictable, adjustable pay-as-you-go pricing, that's all OpEx.There's&amp;#160; no CapEx required for purchasing new hardware or licenses to new software&amp;#160; licenses.&lt;/p&gt;  &lt;p&gt;In the current financial climate, adopting cloud computing is the way to avoid stagnation. The cloud keeps expenses low and predictable while allowing adopters to continuing to innovate and stay on latest software and hardware in times where others may simple shelf project to conserve cash.&lt;/p&gt;  &lt;p&gt;CFOs may not think about the cloud all that much yet, but the cloud is a readily available answer to deal with problems that are top of mind for financial decision makers. It's only a matter of time until finance drives cloud adoption.&lt;/p&gt;                                  &lt;div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:7ddbd543-966a-4aad-8781-10315e6904b1" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Cloud" rel="tag"&gt;Cloud&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Strategy" rel="tag"&gt;Strategy&lt;/a&gt;,&lt;a href="http://technorati.com/tags/CFO" rel="tag"&gt;CFO&lt;/a&gt;,&lt;a href="http://technorati.com/tags/finance" rel="tag"&gt;finance&lt;/a&gt;,&lt;a href="http://technorati.com/tags/fiscal+cliff" rel="tag"&gt;fiscal cliff&lt;/a&gt;,&lt;a href="http://technorati.com/tags/cloud+strategy" rel="tag"&gt;cloud strategy&lt;/a&gt;&lt;/div&gt;</description><pubDate>Fri, 13 Jul 2012 16:03:48 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/cschittko/cfos-fiscal-cliff-cost-transparency-and-the-cloud</guid><category>Azure</category><category>cloud</category><category>Windows Azure</category></item><item><title>Cloud is the Next iPhone (for IT)</title><link>https://weblogs.asp.net:443/cschittko/cloud-is-the-new-iphone-for-it</link><description>&lt;table border="0" cellSpacing="0" cellPadding="2" width="479"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td vAlign="top" width="102"&gt;&lt;img src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d0/Original_iPhone_docked.jpg/250px-Original_iPhone_docked.jpg" width="87" height="132" mce_src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d0/Original_iPhone_docked.jpg/250px-Original_iPhone_docked.jpg"&gt;&lt;/td&gt;        &lt;td vAlign="top" width="375"&gt;It was the year 2006. The year Google acquired YouTube for a mere $1.65B, Pavarotti opened the Winter Olympics and Germany hosted the World Cup. After successfully branching out into music players, Apple is hinting at releasing a phone. The excitement is building, but the smartphone market is dominated by Blackberry. Microsoft's Windows Mobile has been in the market for a few years and is steadily growing in popularity because it's a more accessible developer platform.          &lt;p&gt;Then on January 9th, 2007 the world changed. Not just the technology world, but the world as we knew it. Yes, Steve Jobs only showed a product, the first iPhone, but what he really showed the world what it's like to be connected and have access to the internet at all times.&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;table border="0" cellSpacing="0" cellPadding="2" width="479"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td vAlign="top" width="603"&gt;The iPhone wasn't the first of its kind. Far from it actually. Microsoft had been toying with the idea of Smartphones for almost 10 years at the time. Mobile powerhouses like Blackberry and Nokia had products in the market as well, but the iPhone had two new things going for it.          &lt;br&gt;          &lt;br&gt;1) it was beautiful and desirable and           &lt;br&gt;2) it made things that mattered easy. It was no longer about piling on features. It was about making the important things easy and hiding the complexity of common tasks.           &lt;br&gt;          &lt;br&gt;Those two factors made the iPhone an overnight success. The philosophy of beauty and simplicity was the perfect recipe to form a strong emotional connection between users and their devices.&lt;/td&gt;        &lt;td vAlign="top" width="10"&gt;&lt;iframe style="width: 91px; height: 128px;" height="319" src="https://skydrive.live.com/embed?cid=F0AB78D27EC7F9D9&amp;amp;resid=F0AB78D27EC7F9D9%21908&amp;amp;authkey=AIOgmJCFGAvd4KU" frameBorder="0" width="230" scrolling="no" mce_src="https://skydrive.live.com/embed?cid=F0AB78D27EC7F9D9&amp;amp;resid=F0AB78D27EC7F9D9%21908&amp;amp;authkey=AIOgmJCFGAvd4KU"&gt;&lt;/iframe&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;It wasn't the apps. Those came later. A year and a half later, when Apple opened the AppStore. At that point there was no holding back, the success of the iPhone seemed unstoppable. It no longer was about being cool. You simply didn't participate without one.&lt;/p&gt;  &lt;p&gt;So what about the cloud? &lt;/p&gt;  &lt;p&gt;The cloud is about the same thing. Making things that matter easy. For consumers, the cloud makes keeping things in sync easy. Keeping your appointments, your contacts and files in sync is frustrating problem that was worth solving. &lt;/p&gt;  &lt;p&gt;For the IT Crowd it's about making it easy to run apps. No longer do you have to spend time and effort on things you or, more importantly, your users(!), don't care about. The users care about how good you are at racking, stacking and cabling. They don't even want to know how much you know about maintaining and patching an OS image. You may argue that they think you're "wasting too much time" on such "unimportant" things. They care about one thing. They want their apps, fast, consistently and everywhere.&lt;/p&gt;  &lt;p&gt;The cloud makes those things easy, because they’re done in different ways that makes users not wait for things to show up. Gratification is instant. Apps show up. New features show while they're still new and exciting. They can show off their new toys before others have them … like people showed off their new iPhones. That's what forms the emotional bond, but there were good business reasons behind it.&lt;/p&gt;  &lt;p&gt;Let's look at some other aspects&lt;/p&gt;  &lt;table border="1" cellSpacing="0" cellPadding="2" width="492"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td vAlign="top" width="235"&gt;&lt;strong&gt;iPhone&lt;/strong&gt;&lt;/td&gt;        &lt;td vAlign="top" width="255"&gt;&lt;strong&gt;Cloud&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td vAlign="top" width="235"&gt;iPhone hides complexity to accomplish the important tasks users care about&lt;/td&gt;        &lt;td vAlign="top" width="255"&gt;Cloud hides complexity to accomplish the important tasks users care about&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td vAlign="top" width="235"&gt;iPhone required upfront investment , but the investment paid off quickly in productivity gains&lt;/td&gt;        &lt;td vAlign="top" width="255"&gt;Transition to the cloud is not seamless, but adopters confirm cost savings and transformational capabilities.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td vAlign="top" width="235"&gt;iPhone shortened timelines because access to information became ubiquitous. Information was accessible before, but the iPhone reached critical mass to drive rapid availability of mobile enabled sites.&lt;/td&gt;        &lt;td vAlign="top" width="255"&gt;Cloud shortens timelines because context becomes ubiquitous, capabilities become available instantaneously and innovation cycles become shorter because IT bottlenecks are eliminated.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td vAlign="top" width="235"&gt;IT hated the iPhone in the enterprise because it meant change. The iPhone was neither the most secure nor the most enterprise friendly smartphone, but users had it their way. Companies who adopted early gained an edge. &lt;/td&gt;        &lt;td vAlign="top" width="255"&gt;IT hates the (public) cloud in the enterprise because it means change, ...&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;That's why I say, the cloud is the next iPhone: Trojanic, Tectonic and Transformational. In other words, it'll creep in no matter how much you think you'll keep it out, it's going to change things and it's here to stay. &lt;/p&gt;  &lt;p&gt;The ones that harness the transformational capabilities are going to have the edge because they shed baggage and thus move faster. With tectonic, transformational shifts, it’s important to have a strategy. Thoughts on strategies on harnessing the power of the cloud come in the next posts.&lt;/p&gt;</description><pubDate>Mon, 07 May 2012 14:27:00 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/cschittko/cloud-is-the-new-iphone-for-it</guid><category>cloud</category></item><item><title>Silverlight 3 / Expression Lab Posted</title><link>https://weblogs.asp.net:443/cschittko/silverlight-3-expression-lab-posted</link><description>&lt;p&gt;&lt;a href="http://ux.artu.tv/?p=136"&gt;Arturo&lt;/a&gt; was kind enough to post a &lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=3308511a-fe8b-43b9-840f-02abc4bf6419"&gt;hands-on lab&lt;/a&gt; I created for a training event in Dallas. &lt;/p&gt;  &lt;p&gt;It’s an introduction to &lt;a href="http://www.silverlight.net"&gt;Silverlight&lt;/a&gt;, that showcases some Silverlight 3 features, such as:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.silverlightshow.net/items/Perspective-3D-in-Silverlight-3.aspx"&gt;Perspective 3D&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://weblogs.asp.net/dwahlin/archive/2009/07/13/using-element-to-element-binding-for-tooltips-in-silverlight-3.aspx"&gt;Element-to-Element Binding&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.wintellect.com/CS/blogs/jprosise/archive/2009/04/05/silverlight-3-s-new-out-of-browser-applications.aspx"&gt;Out-Of-Browser Applications&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.silverlightshow.net/items/Using-the-SaveFileDialog-in-Silverlight-3.aspx"&gt;SaveFileDialog&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;but it’s also written as an introduction to Silverlight with basics such as:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Working in &lt;a href="http://www.microsoft.com/expression/products/Blend_Overview.aspx"&gt;Blend&lt;/a&gt; and Visual&amp;#160; Studio&lt;/li&gt;    &lt;li&gt;&lt;a href="http://jeffblankenburg.com/2009/07/day-10-styling-silverlight-controls.aspx"&gt;Control Styling&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Animations&lt;/li&gt;    &lt;li&gt;&lt;a href="http://timheuer.com/blog/archive/2008/06/04/silverlight-introduces-visual-state-manager-vsm.aspx"&gt;Transitions with the Visual State Manager&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;while you build a rotating &lt;a href="http://zune.net"&gt;Zune&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;&lt;a href="https://aspblogs.blob.core.windows.net/media/cschittko/Media/image_1B76D417.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="https://aspblogs.blob.core.windows.net/media/cschittko/Media/image_thumb_214151E3.png" width="244" height="224" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The lab comes with a Lab Manual for you to work through and Visual Studio projects to keep thing simple and help you out if you get stuck.&lt;/p&gt;  &lt;p&gt;Enjoy.&lt;/p&gt;</description><pubDate>Wed, 09 Dec 2009 17:09:52 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/cschittko/silverlight-3-expression-lab-posted</guid><category>Expression</category><category>Silverlight</category><category>Visual Studio</category></item><item><title>Silverlight 3 – How to access peripherals</title><link>https://weblogs.asp.net:443/cschittko/silverlight-3-how-to-access-peripherals</link><description>&lt;P&gt;The previous post on &lt;A title=http://weblogs.asp.net/cschittko/archive/2009/11/17/silverlight-3-for-kiosk-apps-of-course.aspx href="http://weblogs.asp.net/cschittko/archive/2009/11/17/silverlight-3-for-kiosk-apps-of-course.aspx" mce_href="http://weblogs.asp.net/cschittko/archive/2009/11/17/silverlight-3-for-kiosk-apps-of-course.aspx"&gt;Silverlight 3 for kiosk apps&lt;/A&gt; outlined some architecture options how you can build &lt;A href="http://www.silverlight.net/" mce_href="http://www.silverlight.net"&gt;Silverlight&lt;/A&gt; applications with access to peripherals. This follow up post goes into more detail on the implementation. &lt;/P&gt;
&lt;P&gt;I strongly encourage you to consider &lt;A href="http://windowsclient.net/" mce_href="http://windowsclient.net/"&gt;WPF&lt;/A&gt;, &lt;A href="http://msdn.microsoft.com/en-us/library/t71a733d(VS.80).aspx" mce_href="http://msdn.microsoft.com/en-us/library/t71a733d(VS.80).aspx"&gt;ClickOnce&lt;/A&gt; and &lt;A href="http://msdn.microsoft.com/en-us/library/ms828083(WinEmbedded.10).aspx" mce_href="http://msdn.microsoft.com/en-us/library/ms828083(WinEmbedded.10).aspx"&gt;POS for .NET&lt;/A&gt; as the foundation of your application before you go ahead building these types of applications. The major benefits of Silverlight are the small run-time and the cross-platform availability. Chances are that cross-platform is not necessary in a kiosk environment. The small runtime may not be a big advantage if you are deploying a local application, if you’re deploying, you may as well deploy the full .NET runtime. In fact, the lean runtime may be a disadvantage since it’s lacking functionality available in the .NET libraries. ClickOnce may provide similar benefits as a web deployment of Silverlight. &lt;/P&gt;
&lt;P&gt;Now … if you’re still reading, you probably determined that Silverlight is the way to go. &lt;/P&gt;
&lt;P&gt;The solution is based on several key features in Silverlight&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Hosting Silverlight in a custom container via the hosting API – introduced with Silverlight 1 &lt;/LI&gt;
&lt;LI&gt;Scripting Silverlight applications – introduced with Silverlight 1 &lt;/LI&gt;
&lt;LI&gt;Local messaging between Silverlight applications – even across different containers, first introduced with Silverlight 3 &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Let’s take a look how we can string these together to build a solution that maintains the integrity and protection of the Silverlight sandbox, but also let us get to local computing resources and maintains the benefits of Silverlight development and deployment.&lt;/P&gt;
&lt;P&gt;First, you can host Silverlight applications not only in a web browser, but also in a custom application container via the &lt;A href="http://msdn.microsoft.com/en-us/library/cc296246(VS.95).aspx" mce_href="http://msdn.microsoft.com/en-us/library/cc296246(VS.95).aspx"&gt;Hosting COM API&lt;/A&gt;. You’re in for a blast from the past since some experience with C++ and COM is definitely required to get this to work. There’s a sample for &lt;A href="http://code.msdn.microsoft.com/silverlightalthost" mce_href="http://code.msdn.microsoft.com/silverlightalthost"&gt;Silverlight Alternative Hosting&lt;/A&gt; on MSDN. You save yourself a lot of time and effort compared to implementing the various COM interfaces if you just download the sample and start from there.&lt;/P&gt;
&lt;H2&gt;Custom Silverlight Hosting&lt;/H2&gt;
&lt;P&gt;First, you decide how you’re going to load the Silverlight application in the custom container. You could load a .xap from the local disk, or you could local the .xap application over the web. Loading from a URL over the web preserves some of the deployment flexibilities of a browser app, but if you’re running an application without a network connection, loading the application from a http URL may not be an option.&lt;/P&gt;
&lt;P&gt;Loading a XAP from from a URL, either a &lt;A href="file:///" mce_href="file:///"&gt;file:///&lt;/A&gt; URL or an http:// URL will work. To load the Silverlight application, you pass the URL to the application as a named Source property in the PropertyBag during control activation (I didn’t think I would ever have to write about ActiveX control activation again). The TutorialXcpHost application from the MSDN sample makes this very easy. It includes a XcpControlHost helper class with the SetSource method. You call SetSource before activating the control:&lt;/P&gt;&lt;PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;&lt;SPAN style="COLOR: #0000ff"&gt;int&lt;/SPAN&gt; WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR lpCmdLine, &lt;SPAN style="COLOR: #0000ff"&gt;int&lt;/SPAN&gt; nShowCmd) 
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;{  
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;   CXcpControlHost::SetSource(L"&lt;SPAN style="COLOR: #8b0000"&gt;http://localhost/AppsComms/ClientBin/SenderApp.xap&lt;/SPAN&gt;");
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;   &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; _AtlModule.WinMain(nShowCmd);
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;}&lt;/PRE&gt;&lt;/PRE&gt;
&lt;P&gt;Even when running in a custom host, Silverlight is still validating zones and enforces some cross-domain security. If you’re loading additional application data or resources, then base URL and zone (&lt;A href="file:///" mce_href="file:///"&gt;file:///&lt;/A&gt; or http://) need to match. You can play some trickery by implementing the container’s &lt;A href="http://msdn.microsoft.com/en-us/library/cc296246(VS.95).aspx#IXcpControlHost_GetBaseUrl" mce_href="http://msdn.microsoft.com/en-us/library/cc296246(VS.95).aspx#IXcpControlHost_GetBaseUrl"&gt;IXcpControlHost::GetBaseUrl()&lt;/A&gt; method to return a matching zone, but it’s safer to play by the rules and comply with Silverlight’s security policies. after all, they’ve been put in place for good reasons.&lt;/P&gt;
&lt;P&gt;So far, we can load a Silverlight application into a custom container, that provides more flexibility than a browser. For example, the custom container can communicate with other local resources or devices. Next we need to enable communication between the container and the Silverlight application.&lt;/P&gt;
&lt;H2&gt;Defining an interface from Silverlight to the Custom Container&lt;/H2&gt;
&lt;P&gt;A Silverlight application can expose an interface to scripting engines to allow integration with the host. For example the javascript engine in a browser can get and set properties of a Silverlight application and invoke methods exposed to script. The Silverlight piece of the code is very simple. &lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;You define a class that represents your scripting interface and mark the class with the &lt;A href="http://msdn.microsoft.com/en-us/library/system.windows.browser.scriptabletypeattribute(VS.95).aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.windows.browser.scriptabletypeattribute(VS.95).aspx"&gt;[ScriptableType]&lt;/A&gt; attribute. &lt;BR&gt;&lt;PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;&lt;STRONG&gt;[ScriptableType]&lt;/STRONG&gt;
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;&lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;class&lt;/SPAN&gt; MyScriptableObject
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;{
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;&lt;SPAN style="COLOR: #008000"&gt;// ... &lt;/SPAN&gt;
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;}&lt;/PRE&gt;&lt;/PRE&gt;&lt;/LI&gt;
&lt;LI&gt;In that class, you mark methods you want to expose to the scripting engine with the &lt;A href="http://msdn.microsoft.com/en-us/library/system.windows.browser.scriptablememberattribute(VS.95).aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.windows.browser.scriptablememberattribute(VS.95).aspx"&gt;[ScriptableMember]&lt;/A&gt; attribute. &lt;BR&gt;&lt;PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;&lt;STRONG&gt;[ScriptableMember]&lt;/STRONG&gt;
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;&lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt; ShowMessage()
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;{
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;&lt;SPAN style="COLOR: #008000"&gt;// ...&lt;/SPAN&gt;
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;}
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;&lt;/PRE&gt;&lt;/PRE&gt;
&lt;P&gt;Note: Properties and Methods must be public, or discovering the Method with GetIDsofNames will return E_FAIL. &lt;BR&gt;&lt;/P&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;OL&gt;
&lt;LI&gt;You register an instance of the ScriptableType with the Silverlight runtime after the application starts up by calling &lt;A href="http://msdn.microsoft.com/en-us/library/system.windows.browser.htmlpage.registerscriptableobject(VS.95).aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.windows.browser.htmlpage.registerscriptableobject(VS.95).aspx"&gt;RegisterScriptableObject&lt;/A&gt;. It’s very important to note that you have to call RegisterScriptableObject after runtime and application are intialized, not during the MainPage’s constructor or in InitializeComponent(). Scripting will not work correctly if you register the object too early. &lt;BR&gt;&lt;PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;&lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt; Application_Startup(&lt;SPAN style="COLOR: #0000ff"&gt;object&lt;/SPAN&gt; sender, StartupEventArgs e)
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;{
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;    &lt;SPAN style="COLOR: #0000ff"&gt;this&lt;/SPAN&gt;.RootVisual = &lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt; MainPage();
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;    HtmlPage.&lt;STRONG&gt;RegisterScriptableObject&lt;/STRONG&gt;("&lt;SPAN style="COLOR: #8b0000"&gt;MyReceiver&lt;/SPAN&gt;", &lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt; MyScriptableObject(&lt;SPAN style="COLOR: #0000ff"&gt;this&lt;/SPAN&gt;.RootVisual &lt;SPAN style="COLOR: #0000ff"&gt;as&lt;/SPAN&gt; UserControl));
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;}&lt;/PRE&gt;&lt;/PRE&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Now the Silverlight application exposes an interface for the container to call. Since this application is running in a custom container, the container can call into the application in response to an event from a card reader for example.&lt;/P&gt;
&lt;H2&gt;Calling the Silverlight interface&lt;/H2&gt;
&lt;P&gt;The &lt;A href="http://msdn.microsoft.com/en-us/library/cc645076(VS.95).aspx" mce_href="http://msdn.microsoft.com/en-us/library/cc645076(VS.95).aspx"&gt;HTML bridge&lt;/A&gt; is part of Silverlight to integrate with browser’s java script engines. That doesn’t mean you can’t make use of it from other containers though. We’re calling the scriptable objects from the C++ container. It’s a little bit cumbersome in our scenario since you have to deal with late bound objects through COM interfaces, but the sample code may help you out a little bit.&lt;/P&gt;
&lt;P&gt;Let’s look at the important pieces. The host for the Silverlight application must allow for access to objects that the&amp;nbsp; Silverlight application registered with the scripting bridge. &lt;A href="http://msdn.microsoft.com/en-us/library/cc296246(VS.95).aspx#IXcpControlHost_GetHostOptions" mce_href="http://msdn.microsoft.com/en-us/library/cc296246(VS.95).aspx#IXcpControlHost_GetHostOptions"&gt;IXcpControlHost::GetHostOptions()&lt;/A&gt; gets called during activation of the control by the hosted Silverlight runtime to find out which features the host allows. The options returned to Silverlight control must include &lt;A href="http://msdn.microsoft.com/en-us/library/cc296246(VS.95).aspx#IXcpHostOptions" mce_href="http://msdn.microsoft.com/en-us/library/cc296246(VS.95).aspx#IXcpHostOptions"&gt;XcpHostOption_EnableScriptableObjectAccess&lt;/A&gt;;&lt;/P&gt;&lt;PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;STDMETHODIMP CXcpControlHost::GetHostOptions(DWORD* pdwOptions)
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;{
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;  *pdwOptions = XcpHostOption_EnableCrossDomainDownloads | &lt;STRONG&gt;XcpHostOption_EnableScriptableObjectAccess&lt;/STRONG&gt;;
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;  &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; S_OK;
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;}&lt;/PRE&gt;&lt;/PRE&gt;
&lt;P&gt;Without the option set, attempts&amp;nbsp; by the container to obtain a reference (the DISPID as we’ll see shortly) will fail. RegisterScriptableObject, however, succeeds.&lt;/P&gt;
&lt;P&gt;Getting to the registered object requires some understanding of COM. If you never had to deal with &lt;A href="http://msdn.microsoft.com/en-us/library/ms680509(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/ms680509(VS.85).aspx"&gt;IUnknown&lt;/A&gt; and &lt;A href="http://msdn.microsoft.com/en-us/library/ms221608.aspx" mce_href="http://msdn.microsoft.com/en-us/library/ms221608.aspx"&gt;IDispatch&lt;/A&gt;, you may want to take a quick look at the &lt;A href="http://msdn.microsoft.com/en-us/library/ms694363(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/ms694363(VS.85).aspx"&gt;COM reference&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;The scriptable objects are a accessible from the Silverlight control’s Content Interface. Like all other late bound objects, properties and method on the Content object is available via IDispatch, which turns the inconspicuous lines of javascript:&lt;/P&gt;&lt;PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;slCtl  = sender.get_element();
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;slCtl.Content.MyReceiver.ShowMessage();
&lt;/PRE&gt;&lt;/PRE&gt;
&lt;P&gt;into the slightly more verbose C++ equivalent:&lt;/P&gt;&lt;PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;  _axWindow.QueryControl(IID_IXcpControl, (&lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt;**)&amp;amp;pxcpControl);
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;  HRESULT hr = pxcpControl-&amp;gt;get_Content( &amp;amp;pContentDispatch );
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;  BSTR name = L"&lt;SPAN style="COLOR: #8b0000"&gt;MyReceiver&lt;/SPAN&gt;";
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;  hr = pContentDispatch-&amp;gt;GetIDsOfNames(IID_NULL, &amp;amp;name, 1, LOCALE_SYSTEM_DEFAULT, &amp;amp;dispatchID);
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;  hr = pContentDispatch-&amp;gt;Invoke(dispatchID, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &amp;amp;params, &amp;amp;varResult, NULL, NULL);
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;  pScriptableObjectDispatch = varResult.pdispVal;
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;  name = L"&lt;SPAN style="COLOR: #8b0000"&gt;ShowMessage&lt;/SPAN&gt;";
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;  hr = pScriptableObjectDispatch-&amp;gt;GetIDsOfNames(IID_NULL, &amp;amp;name, 1, LOCALE_SYSTEM_DEFAULT, &amp;amp;dispatchID);
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;  hr = pScriptableObjectDispatch-&amp;gt;Invoke(dispatchID, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &amp;amp;params, &amp;amp;varResult, NULL, NULL);
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;&lt;/PRE&gt;&lt;/PRE&gt;
&lt;P&gt;Let’s examine those lines a little bit more closely. First you get a reference to the Silverlight control. From the control you go to the control’s content. There’s an implicit assumption here that you don’t access the Content until after the &lt;A href="http://msdn.microsoft.com/en-us/library/cc189034(VS.95).aspx" mce_href="http://msdn.microsoft.com/en-us/library/cc189034(VS.95).aspx"&gt;VisualTree&lt;/A&gt; is constructed.&lt;/P&gt;
&lt;P&gt;From the content, you get the ScriptableObject by the name passed to RegisterScriptableObject in the Silverlight application. Then finally, very important(!), you ask the ScriptableObject for its default dispatch interface, from where you get method or property references, which you can invoke via &lt;A href="http://msdn.microsoft.com/en-us/library/ms221479.aspx" mce_href="http://msdn.microsoft.com/en-us/library/ms221479.aspx"&gt;IDispatch::Invoke&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Now you have everything in place to listen to events from peripherals and pass them on to a Silverlight application running inside the custom host.&lt;/P&gt;
&lt;H2&gt;Communication between Applications&lt;/H2&gt;
&lt;P&gt;If you need run the Silverlight application running in a browser, then you can build a bridge from the custom host that communicates with the browser application with the silverlight application communication feature introduced with Silverlight 3.&lt;/P&gt;
&lt;P&gt;Two applications can communicate with the LocalMessageSender and LocalMessageReceiver objects. If you need to forward local events to a browser application, then the browser application would start listening to messages.&lt;/P&gt;
&lt;P&gt;Setting up Sender and Receiver is straight forward. The receiving applications starts the listener:&lt;/P&gt;&lt;PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;LocalMessageReceiver receiver = &lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt; LocalMessageReceiver(     
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;    "&lt;SPAN style="COLOR: #8b0000"&gt;&lt;STRONG&gt;Receiver Name&lt;/STRONG&gt;&lt;/SPAN&gt;",    
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;    ReceiverNameScope.Global, LocalMessageReceiver.AnyDomain  );
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;receiver.MessageReceived += ( &lt;SPAN style="COLOR: #0000ff"&gt;object&lt;/SPAN&gt; sender, MessageReceivedEventArgs e ) =&amp;gt;
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;{
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;        items.Add( &lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt; ListItem() { Text= e.Message + "&lt;SPAN style="COLOR: #8b0000"&gt; &lt;/SPAN&gt;" + DateTime.Now.ToLongTimeString() } );
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;};
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;receiver.Listen();&lt;/PRE&gt;&lt;/PRE&gt;
&lt;P&gt;and the sending application sends to a receiver with the registered name:&lt;/P&gt;&lt;PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;LocalMessageSender msgsender = &lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt; LocalMessageSender(    
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;    "&lt;SPAN style="COLOR: #8b0000"&gt;&lt;STRONG&gt;Receiver Name&lt;/STRONG&gt;&lt;/SPAN&gt;",     
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;    System.Windows.Messaging.LocalMessageSender.Global );
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;msgsender.SendCompleted += ( &lt;SPAN style="COLOR: #0000ff"&gt;object&lt;/SPAN&gt; sender2, SendCompletedEventArgs e2 ) =&amp;gt;
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;{
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;    MessageBox.Show("&lt;SPAN style="COLOR: #8b0000"&gt;Result: &lt;/SPAN&gt;" );
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;};
&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 13px"&gt;msgsender.SendAsync(textBox1.Text);
&lt;/PRE&gt;&lt;/PRE&gt;
&lt;P&gt;MSDN has a &lt;A href="http://msdn.microsoft.com/en-us/library/dd833063(VS.95).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd833063(VS.95).aspx"&gt;good overview of local messaging in Silverlight&lt;/A&gt;, including some advanced features like sending complex XML messages and troubleshooting. &lt;/P&gt;
&lt;P&gt;What’s important to note, is that the BaseUrl of the sending application has to match the BaseUrl of the receiving application. Even setting the receiver options and disabling zone checks are not sufficient for the receiver to process incoming messages. You may have to play some more tricks in the host if you’re not planning on loading the sending application from the same site.&lt;/P&gt;
&lt;P&gt;For example, you could intercept the download request in &lt;A href="http://msdn.microsoft.com/en-us/library/cc296246(VS.95).aspx#IXcpControlHost_DownloadUrl" mce_href="http://msdn.microsoft.com/en-us/library/cc296246(VS.95).aspx#IXcpControlHost_DownloadUrl"&gt;IXcpControlHost::DownloadUrl()&lt;/A&gt; to load the .xap from other locations.&lt;/P&gt;
&lt;H2&gt;Closing Words&lt;/H2&gt;
&lt;P&gt;The upcoming &lt;A href="http://www.silverlight.net/getstarted/silverlight-4-beta/" mce_href="http://www.silverlight.net/getstarted/silverlight-4-beta/"&gt;Silverlight 4&lt;/A&gt; release is going to simplify the architecture for out-of-browser scenarios. &lt;A title="Silverlight 4 trusted applications" href="http://timheuer.com/blog/archive/2009/11/18/whats-new-in-silverlight-4-complete-guide-new-features.aspx#elevated" mce_href="http://timheuer.com/blog/archive/2009/11/18/whats-new-in-silverlight-4-complete-guide-new-features.aspx#elevated"&gt;Silverlight 4 trusted applications&lt;/A&gt; can communicate with COM servers directly, which eliminates the need for hosting a Silverlight application in a custom container to get access to local resources. You still need the custom container bridge if your browser application needs access to devices and other local resources. &lt;/P&gt;
&lt;P&gt;I’m planning a follow up post discussing the Silverlight 4 option. It’s going to be a little bit before SL4 ships – Scott Guthrie mentioned H1 2010 as the target timeframe during his &lt;A href="http://microsoftpdc.com/Sessions/KEY02" mce_href="http://microsoftpdc.com/Sessions/KEY02"&gt;PDC Day 2 keynote&lt;/A&gt;. It’s good to have a working option with Silverlight 3 before that.&lt;/P&gt;
&lt;P&gt;And finally, the big thank you to &lt;A href="http://nerddawg.blogspot.com/" mce_href="http://nerddawg.blogspot.com/"&gt;Ashish&lt;/A&gt;, who patiently answered my questions about the COM APIs while I was looking for the magic combination ;)&lt;/P&gt;</description><pubDate>Tue, 08 Dec 2009 17:27:00 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/cschittko/silverlight-3-how-to-access-peripherals</guid><category>.NET</category><category>Silverlight</category><category>Visual Studio</category></item><item><title>What’s so old-school about text based programming?</title><link>https://weblogs.asp.net:443/cschittko/what-s-so-old-school-about-text-based-programming</link><description>&lt;p&gt;Computerworld posted this piece that &lt;a href="http://www.computerworld.com/s/article/9141465/Microsoft_s_top_developers_prefer_old_school_coding_methods"&gt;Microsoft developers are using text editors for development&lt;/a&gt;. What’s so old-school about that? What I mean really? Coding in text editors is not a trend among the grey-hairds like &lt;a href="http://lewiscurtis.com/default.aspx"&gt;Lewis&lt;/a&gt; suggested on an internal thread. Text based tools are all the rave with the next generation of developers. I mean people that look like the Mac guy in the Apple commercials.&lt;/p&gt;  &lt;p&gt;Lots of today’s developers are all fired up about Ruby, RoR, PHP and even javascript – they’re all about text programming.&amp;#160; Those are going to be the thought-leaders for the next generation of developers and they are programming with very similar tools and dev models that many of us started with. You may say that those developer icons at Microsoft are downright on the cutting edge.&lt;/p&gt;  &lt;p&gt;Aside from that … are the development tools really the right thing to look at to judge state of development at Microsoft (or any other shop)? What about &lt;a href="http://msdn.microsoft.com/en-us/library/4dtdybt8.aspx"&gt;code quality&lt;/a&gt;? &lt;a href="http://www.officelabs.com/Pages/Envisioning.aspx"&gt;Innovation&lt;/a&gt;? Shouldn’t Microsoft developers be judged by that?&lt;/p&gt;  &lt;p&gt;Some of my personal conclusions are that the developer(!) community doesn’t crave graphical tools – maybe it’s because they favor power and flexibility over dealing with level of complexity because that’s a higher priority for the job they are doing. Architects likely that deal with multiple more dimensions, i.e. cross-system dependencies, deployment, etc. and thus like other levels of abstractions that lend themselves better to a visual representation.&lt;/p&gt;  &lt;p&gt;Furthermore, frameworks like RoR following the trends started with Java and .NET. They are raising the level of abstraction for developers – without going to graphical development models. I just spent time experimenting with some COM work. The productivity problem isn’t working with text-based languages like C++.&amp;#160; The much bigger productivity problem is that COM interfaces were designed for late bound environments and are extremely low level. That problem was solved either with graphical environments or text based environments like VB. &lt;/p&gt;  &lt;p&gt;Again, use the right tool for the job. Libraries that raise the level of abstraction have been very successful to boost productivity for developers. Enhancements to text editors to speed up development have been around since way longer than Visual Studio. Pretty much everybody had their Emacs or VI rigged with all sorts of fancy macros to keep code clean. Graphicals tools, at least today are much more helpful for visualizing architecture and the high-level flow of a program. Those are different from executable code and are intended for a different audience.&lt;/p&gt;  &lt;p&gt;What am I missing? &lt;/p&gt;</description><pubDate>Mon, 07 Dec 2009 15:20:53 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/cschittko/what-s-so-old-school-about-text-based-programming</guid><category>Visual Studio</category></item><item><title>Silverlight 3 for Kiosk Apps? Of Course!</title><link>https://weblogs.asp.net:443/cschittko/silverlight-3-for-kiosk-apps-of-course</link><description>&lt;p&gt;Several of the customers I work with are looking to build kiosk or point-of-sale applications with &lt;a href="http://www.silverlight.net"&gt;Silverlight&lt;/a&gt;. The ease of deployment with browser-based Silverlight applications is definitely appealing. Sharing applications or components between customers’ kiosks and web sites is another appealing reasons to go with Silverlight. This post outlines the architecture decisions between Silverlight and WPF and presents architecture options for Silverlight based solutions. A follow up post will discuss the Silverlight implementation details. &lt;/p&gt;  &lt;p&gt;However, POS systems or kiosks often need integration with local peripherals, such as credit card readers, barcode scanners, printers, etc. Since Silverlight browser applications run in a sandbox access to these devices isn’t immediately available. Therefore we need to find a way to insert a bridge between the peripherals and the Silverlight application to read data from the devices and forward the data to the Silverlight app. &lt;/p&gt;  &lt;p&gt;To get started, let’s look at applications that can communicate with local peripherals. Desktop applications can communicate with local devices. Devices usually ship with C++ or .NET libraries to read data or sink events from devices. Therefore Desktop applications are usually preferred for POS systems. Microsoft has a &lt;a href="http://msdn.microsoft.com/en-us/library/ms828083.aspx"&gt;POS for .NET framework&lt;/a&gt; to simplify development of applications that need access to a wide array of peripherals. WPF offers a very compelling option to build the application UI and building the UI in WPF is a great step to share assets between the kiosk and the Web. The following table summarizes the decision points to decide between a full desktop application or a Silverlight app.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;   &lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="200"&gt;           &lt;p&gt;&lt;strong&gt;Pro&lt;/strong&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="200"&gt;           &lt;p&gt;&lt;strong&gt;Con&lt;/strong&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="200"&gt;           &lt;p&gt;Full POS Framework for peripheral integration&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="200"&gt;           &lt;p&gt;Requires high-touch deployment&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="200"&gt;           &lt;p&gt;Full access to local resources (files, registry, printers, peripherals)&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="200"&gt;           &lt;p&gt;Some re-development to share assets between desktop and web applications&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="200"&gt;           &lt;p&gt;Hardware accelerated graphics&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="200"&gt;           &lt;p&gt;Windows specific&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="200"&gt;           &lt;p&gt;Richest Graphics with WPF and XNA&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="200"&gt;&amp;#160;&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="200"&gt;           &lt;p&gt;Full .NET Framework (WCF, WPF, WF, SxS versioning, …)&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="200"&gt;&amp;#160;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;If the cons weigh too high and you really need a browser-based app, for example when you’re running in shared kiosk environments or if ease of deployment is much more important than peripheral integration, then you have a couple of options with Silverlight. &lt;/p&gt;  &lt;p&gt;First, you can simply load the Silverlight application with a control hosted in a desktop application via the &lt;a href="http://msdn.microsoft.com/en-us/library/cc296246(VS.95).aspx"&gt;COM hosting interfaces&lt;/a&gt;. The host application can &lt;a href="http://msdn.microsoft.com/en-us/library/cc296246(VS.95).aspx#IXcpControl_put_Source"&gt;load the Silverlight application&lt;/a&gt; from a web URL, i.e. once you install the host application, you can still download the Silverlight application from the web. The Silverlight hosting interfaces even allow managing the download process, customize caching of .xap files and other resources through the &lt;a href="http://msdn.microsoft.com/en-us/library/cc296246(VS.95).aspx#IXcpControlHost2"&gt;IXcpControlHost interface&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;For communication between the Silverlight app and the device manager running in the host application, the Silverlight application can expose an interface via the scriptable object bridge. That bridge is intended for communicating with the javascript engine of a web browser but it works in other containers as well. The scriptable object is accessible to the Win32 host via COM &lt;a href="http://msdn.microsoft.com/en-us/library/ms221608.aspx"&gt;IDispatch&lt;/a&gt; interfaces, which the host application can invoke to send data to the embedded Silverlight application as shown in the diagram below. &lt;/p&gt;  &lt;p&gt;&lt;a href="file:///C:\Users\cschittk\AppData\Local\Temp\WindowsLiveWriter-429641856\supfiles3B4929C5\clip_image002%5b4%5d.gif"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="clip_image001" border="0" alt="clip_image001" src="https://aspblogs.blob.core.windows.net/media/cschittko/Media/clip_image001_7142BA76.gif" width="269" height="475" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;You may at this point decide that the custom host is all you need, but may also want to run the application in a browser, for example because the Silverlight application integrates with an existing web site or you need to comply with an industry standard like &lt;a href="http://en.wikipedia.org/wiki/Common_Use_Self_Service"&gt;CUSS&lt;/a&gt;.    &lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="200"&gt;           &lt;p&gt;&lt;strong&gt;Pro&lt;/strong&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="200"&gt;           &lt;p&gt;&lt;strong&gt;Con&lt;/strong&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="200"&gt;           &lt;p&gt;Single Process solution&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="200"&gt;           &lt;p&gt;Non-standard,&amp;#160; Windows-only container&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="200"&gt;&amp;#160;&lt;/td&gt;          &lt;td valign="top" width="200"&gt;           &lt;p&gt;Need to re-develop browser functionality, such as caching&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="200"&gt;&amp;#160;&lt;/td&gt;          &lt;td valign="top" width="200"&gt;           &lt;p&gt;Tight coupling of peripheral management and application UI&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;In the past, applications installed a &lt;a href="http://msdn.microsoft.com/en-us/magazine/cc188791.aspx"&gt;local web server like Cassini&lt;/a&gt; which hosted a .NET component that would communicate with local resources as needed. The Silverlight application would make REST calls to the “web server” which would handle the communication with a peripheral device or other local resources. &lt;/p&gt;  &lt;p&gt;&lt;a href="file:///C:\Users\cschittk\AppData\Local\Temp\WindowsLiveWriter-429641856\supfiles3B4929C5\clip_image004%5b4%5d.gif"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="clip_image002" border="0" alt="clip_image002" src="https://aspblogs.blob.core.windows.net/media/cschittko/Media/clip_image002_41C425DD.gif" width="575" height="410" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;However, this approach had a couple of drawbacks. First, running a local web server requires administrator privileges and is often frowned upon because of potential security risks. Second, communication always had to be initiated by the Silverlight application. The peripheral could not send notifications to the application running in the browser.   &lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="200"&gt;           &lt;p&gt;&lt;strong&gt;Pro&lt;/strong&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="200"&gt;           &lt;p&gt;&lt;strong&gt;Con&lt;/strong&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="200"&gt;           &lt;p&gt;Potentially fully managed code implementation&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="200"&gt;           &lt;p&gt;Complexity running a local web server&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="200"&gt;&amp;#160;&lt;/td&gt;          &lt;td valign="top" width="200"&gt;           &lt;p&gt;Communication overhead with HTTP&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="200"&gt;&amp;#160;&lt;/td&gt;          &lt;td valign="top" width="200"&gt;           &lt;p&gt;One-way communication. Silverlight application has to poll/&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="200"&gt;&amp;#160;&lt;/td&gt;          &lt;td valign="top" width="200"&gt;           &lt;p&gt;Policy restrictions for local services and sockets&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="200"&gt;&amp;#160;&lt;/td&gt;          &lt;td valign="top" width="200"&gt;           &lt;p&gt;Perceived security risks of local web servers&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="200"&gt;&amp;#160;&lt;/td&gt;          &lt;td valign="top" width="200"&gt;           &lt;p&gt;Complex deployment of local services&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;With Silverlight 3 we have an alternative that doesn’t require a local “web server”. Silverlight 3 introduced the ability for Silverlight applications to communicate regardless what application container they are running in. One Silverlight application would send messages over a “named channel” with a &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.messaging.localmessagesender%28VS.95%29.aspx"&gt;LocalMessageSender&lt;/a&gt; object. Another Silverlight application can listen on that named channel with a &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.messaging.localmessagereceiver%28VS.95%29.aspx"&gt;LocalMessageReceiver&lt;/a&gt; object. &lt;/p&gt;  &lt;p&gt;In our case the Win32 application could be an application without a visible UI that only acts as a bridge between the peripherals and the browser application. &lt;/p&gt;  &lt;p&gt;&lt;a href="file:///C:\Users\cschittk\AppData\Local\Temp\WindowsLiveWriter-429641856\supfiles3B4929C5\clip_image006%5b4%5d.gif"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="clip_image003" border="0" alt="clip_image003" src="https://aspblogs.blob.core.windows.net/media/cschittko/Media/clip_image003_48477FA0.gif" width="572" height="405" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In a scenario where the need for a local peripherals is limited to a single, well-known device, the effort to write a C++ host and communicate with the device in unmanaged code isn’t a daunting task. More sophisticated POS solutions may require more than one peripheral type. They may even require supporting different device configurations, i.e. bar code readers from different vendors. These types of POS applications typically require POS abstraction frameworks like &lt;a href="http://msdn.microsoft.com/en-us/library/ms828083.aspx"&gt;POS for .NET&lt;/a&gt;. However, in that case the host application could be either a managed C++ application with C++ code to implement the COM host for the Silverlight “bridge” application and .NET code to manage peripheral interaction.    &lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="200"&gt;           &lt;p&gt;&lt;strong&gt;Pro&lt;/strong&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="200"&gt;           &lt;p&gt;&lt;strong&gt;Con&lt;/strong&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="200"&gt;           &lt;p&gt;Loose coupling between peripheral management and UI&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="200"&gt;           &lt;p&gt;Local deployment of peripheral management application required&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="200"&gt;           &lt;p&gt;Shareable bridge&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="200"&gt;           &lt;p&gt;More complex architecture with two applications&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;To close with some food for thought, there may be a completely browser based alternative that I haven’t tested out yet. Instead of running a Silverlight bridge in a separate Win32 application you could try to build a C++ ActiveX control to host the Silverlight “bridge” and the native device interaction code. This approach presents some security challenges that can be mitigated, but you still have to deal with the perceptions of pushing down an ActiveX control. &lt;/p&gt;  &lt;p&gt;&lt;a href="file:///C:\Users\cschittk\AppData\Local\Temp\WindowsLiveWriter-429641856\supfiles3B4929C5\clip_image008%5b6%5d.gif"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="clip_image004" border="0" alt="clip_image004" src="https://aspblogs.blob.core.windows.net/media/cschittko/Media/clip_image004_64288ECB.gif" width="542" height="409" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;You do have the benefits of clean separation between a cross-platform application that run on any platform that supports Silverlight and the platform specific extensions that need to manage interaction with local peripherals. You also have the benefit of a fully browser-based deployment model.   &lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="200"&gt;           &lt;p&gt;&lt;strong&gt;Pro&lt;/strong&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="200"&gt;           &lt;p&gt;&lt;strong&gt;Con&lt;/strong&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="200"&gt;           &lt;p&gt;Fully browser-based deployment model&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="200"&gt;           &lt;p&gt;Native code development of ActiveX control&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="200"&gt;&amp;#160;&lt;/td&gt;          &lt;td valign="top" width="200"&gt;           &lt;p&gt;Policies for secure ActiveX execution required to avoid security risks&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;</description><pubDate>Tue, 17 Nov 2009 15:48:36 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/cschittko/silverlight-3-for-kiosk-apps-of-course</guid><category>.NET</category><category>Silverlight</category><category>WPF</category></item><item><title>WcfTestClient with Windows Azure</title><link>https://weblogs.asp.net:443/cschittko/wcftestclient-with-windows-azure</link><description>&lt;p&gt;One of my customers is working on an Azure WCF service. When wanted to test the service with &lt;a href="http://msdn.microsoft.com/en-us/library/bb552364.aspx"&gt;WcfTestClient&lt;/a&gt;, but we ran into some issues. We started the dev fabric and had the WebRole running on port 81. When we went to the WCF service metadata page at &lt;a href="http://mybox:5101/ProdKService.svc?wsdl"&gt;&lt;span style="font-family: &amp;#39;Courier New&amp;#39;; font-size: 10pt; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;http://mybox:5101/ProdKService.svc&lt;/span&gt;&lt;/a&gt;, we got the expected web page, which states:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;To test this service, you will need to create a client and use it to call the service. You can do this using the svcutil.exe tool from the command line with the following syntax:&lt;/p&gt;    &lt;div style="border-bottom: #f0f0e0 1pt solid; border-left: #f0f0e0 1pt solid; padding-bottom: 4pt; padding-left: 4pt; padding-right: 4pt; background: #e5e5cc; border-top: #f0f0e0 1pt solid; border-right: #f0f0e0 1pt solid; padding-top: 4pt; mso-element: para-border-div; mso-border-alt: solid #f0f0e0 .75pt"&gt;     &lt;p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #e5e5cc; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid #f0f0e0 .75pt; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; mso-padding-alt: 4.0pt 4.0pt 4.0pt 4.0pt" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: black; font-size: 10pt; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;svcutil.exe &lt;/span&gt;&lt;a href="http://mybox:5101/ProdKService.svc?wsdl"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;http://mybox:5101/ProdKService.svc?wsdl&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: black; font-size: 10pt; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;         &lt;p&gt;&lt;/p&gt;       &lt;/span&gt;&lt;/p&gt;      &lt;br /&gt;&lt;/div&gt;    &lt;p&gt;This will generate a configuration file and a code file that contains the client class. Add the two files to your client application and use the generated client class to call the Service. &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Note that the instructions point you to port 5101 in the service URL. That’s the port where the &lt;em&gt;Azure instance&lt;/em&gt; is running in my local development fabric. It is not as we would expect the address of the Azure dev fabric which is running on port 81. We tried to follow the instructions and point WcfTestClient to the address on the page, but instead of testing the service, we got this not so friendly error message:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Error: &lt;strong&gt;Cannot obtain Metadata&lt;/strong&gt; from http://mybox:5101/ProdKService.svc If this is a Windows (R) Communication Foundation service to which you have access,&lt;strong&gt; please check that you have enabled metadata publishing at the specified address&lt;/strong&gt;. For help enabling metadata publishing, please refer to the MSDN documentation at http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata Exchange Error URI: http://mybox:5101/ProdKService.svc Metadata contains a reference that cannot be resolved: 'http://mybox:5101/ProdKService.svc'. There was no endpoint listening at http://mybox:5101/ProdKService.svc that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details. The remote server returned an error: (400) Bad Request.HTTP GET Error URI: http://mybox:5101/ProdKService.svc There was an error downloading 'http://mybox:5101/ProdKService.svc'. The request failed with HTTP status 400: Bad Request.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Now this is weird. We know that metadata publishing is enabled, because we got the instructions for the WSDL address from the metadata page in the first place.&lt;/p&gt;  &lt;p&gt;If you look at the address line in the browser when the Azure dev fabric launches, you note that the local fabric is listening on localhost port 81, not mybox port 5101. localhost is IP address 127.0.0.1, whereas mybox is bound to the IP address on my corporate network. . Is instructed, we tried to get the WSDL with &lt;a href="http://127.0.0.1:81/ProdKService.svc?wsdl"&gt;http://127.0.0.1:81/ProdKService.svc?wsdl&lt;/a&gt; and we’re getting a different error in in WcfTestClient:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p class="MsoNormal"&gt;Error: &lt;strong&gt;Cannot obtain Metadata from http://mybox:5101/ProdKService.svc&lt;/strong&gt; If this is a Windows (R) Communication Foundation service to which you have access, please check that you have enabled metadata publishing at the specified address.&lt;span style="mso-spacerun: yes"&gt;&amp;#160; &lt;/span&gt;For help enabling metadata publishing, please refer to the MSDN documentation at http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata Exchange Error&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;URI: http://mybox:5101/ProdKService.svc&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&lt;/span&gt;&lt;span style="background: yellow; mso-highlight: yellow"&gt;Metadata contains a reference that cannot be resolved: 'http://mybox:5101/ProdKService.svc'.&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;Could not connect to http://mybox:5101/ProdKService.svc&lt;/span&gt;. TCP error code 10061: No connection could be made because the target machine actively refused it 127.0.0.1:5101.&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;Unable to connect to the remote server&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;No connection could be made because the target machine actively refused it 127.0.0.1:5101HTTP GET Error&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;URI: http://mybox:5101/ProdKService.svc&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;There was an error downloading 'http://mybox:5101/ProdKService.svc'.&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;Unable to connect to the remote server&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;No connection could be made because the target machine actively refused it 127.0.0.1:5101&lt;/p&gt; &lt;/blockquote&gt;  &lt;p class="MsoNormal"&gt;   &lt;p&gt;It took a little bit to figure this one out since the error message is so similar to the first one. The difference is only in the InnerException and you have to look at the WSDL at &lt;a href="http://mybox:5101/ProdKService.svc?wsdl"&gt;&lt;span style="font-family: &amp;#39;Courier New&amp;#39;; font-size: 10pt; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;http://mybox:5101/ProdKService.svc?wsdl&lt;/span&gt;&lt;/a&gt;to understand the error. &lt;/p&gt; &lt;/p&gt;  &lt;p&gt;The culprit for this error is the schemaLocation reference in the WSDL:&lt;/p&gt;  &lt;p&gt;&amp;lt;xsd:import schemaLocation=&amp;quot;&lt;b&gt;http://mybox:5101/ProdKService.svc?xsd=xsd0&lt;/b&gt;&amp;quot; namespace=&amp;quot;&lt;b&gt;http://tempuri.org/&lt;/b&gt;&amp;quot; /&amp;gt;&lt;/p&gt;  &lt;p&gt;Even though we retrieved the WSDL from the localhost address, the WSDL generator in WCF generates a reference to the other network address.&lt;/p&gt;  &lt;p&gt;Since there’s no easy way to configure the Metadata generator in WCF to switch the hostname for the schemaLocation, I added the hostname to my C:\Windows\System32\drivers\etc\hosts &lt;/p&gt;  &lt;p&gt;127.0.0.1 mybox&lt;/p&gt;  &lt;p&gt;After restarting the Azure dev fabric, WcfTestClient was able to read the MEX metadata for the service. &lt;/p&gt;  &lt;p&gt;I also tried another work-around since not everybody modifying the hosts file may not be possible (although you also need admin rights for running the dev fabric). There is still &lt;a href="http://blogs.thinktecture.com/cweyer"&gt;Christian&lt;/a&gt;’s old &lt;a href="http://blogs.thinktecture.com/cweyer/archive/2007/05/10/414840.aspx"&gt;FlatWsdl&lt;/a&gt; trick.&lt;/p&gt;  &lt;p&gt;Adding the FlatWsdl extension and configuring the ServiceHost Factory in the Services’ s .svc file got WcfTestClient to work, too.&lt;/p&gt;</description><pubDate>Fri, 30 Oct 2009 16:25:13 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/cschittko/wcftestclient-with-windows-azure</guid><category>.NET</category><category>Azure</category><category>Visual Studio</category><category>WCF</category></item><item><title>Need Help Migrating to SQL Azure?</title><link>https://weblogs.asp.net:443/cschittko/need-help-migrating-to-sql-azure</link><description>&lt;p&gt;Migrating an existing SQL Server database to &lt;a href="http://msdn.microsoft.com/en-us/library/ee336279.aspx"&gt;SQL Azure&lt;/a&gt; is a compelling story, but it’s not a trivial task … unless you start with the SQL Azure migration wizard put together by my team mates &lt;a href="http://www.facebook.com/people/George-Huey/1551153966"&gt;George&lt;/a&gt; and &lt;a href="http://blog.wadewegner.com"&gt;Wade&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;They just updated the wizard to support &lt;a href="http://blogs.msdn.com/ssds/archive/2009/10/14/9907238.aspx"&gt;SQL Azure CTP 2&lt;/a&gt;. Details at: &lt;a href="http://blog.wadewegner.com/index.php/2009/10/15/the-sql-azure-migration-wizard-will-now-migrate-your-data/"&gt;http://blog.wadewegner.com/index.php/2009/10/15/the-sql-azure-migration-wizard-will-now-migrate-your-data/&lt;/a&gt;&lt;/p&gt;</description><pubDate>Tue, 20 Oct 2009 21:47:21 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/cschittko/need-help-migrating-to-sql-azure</guid><category>Azure</category></item><item><title>WinMo App Store Questions? I got answers</title><link>https://weblogs.asp.net:443/cschittko/winmo-app-store-questions-i-got-answers</link><description>&lt;p&gt;The Windows Mobile app store is about to launch. The team launched a number of videos on the &lt;a href="http://www.youtube.com/user/WindowsMobileDev"&gt;Windows Mobile Dev Channel on YouTube&lt;/a&gt; to walk you through the submission process for your application, but as I’m working with the team over at &lt;a href="http://www.tripcase.com"&gt;TripCase&lt;/a&gt;, we had a few more questions that we got answered over the past weeks. I thought they worth sharing:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Q: My app runs on Windows Phone Standard (i.e. SmartPhone, SP, no-touch) and Windows Phone Professional (Pocket PC, PPC, with touch screen). The application is packaged in a single cab file. The AppStore submission UI doesn’t let me select both platforms. How do I make sure I reach both groups of users&lt;/p&gt;  &lt;p&gt;A: Submit the app twice. Once for Standard, once for Professional. You can submit with the same name.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Q: I want to make an update to my application to fix a bug or a spelling error, change the description, etc. What do I do?&lt;/p&gt;  &lt;p&gt;A: Fix your cab, don’t change the version number of the application. Re-submit – it’s free.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Q: I’m getting an error: Unable to enable shim engine on device when running the AppVerifier. Help! How do I fix this?&lt;/p&gt;  &lt;p&gt;A: Most commonly, the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=40B7CEDB-DC8B-4503-8DC9-E75F8E8496C1&amp;amp;displaylang=en"&gt;Windows CE 5.0 Test Kit&lt;/a&gt; is missing on your machine or you haven’t replaced the libraries as outlined in the release docs. &lt;b&gt;Replace the Application verifier binaries in the processor folder for the device type. For example, replace C:\Program Files\Windows CE platform builder\5.00\CEPB\wcetk\DDTK\ARMV4I with C:\Program Files\Application Verifier for Mobile 5.0\Armv4i.      &lt;br /&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;If you’re testing with retail devices, then you also need to sign Privileged Certificate. Make sure your app meets the &lt;a href="http://blogs.msdn.com/windowsmobile/articles/248967.aspx"&gt;requirements&lt;/a&gt; for the cert.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;     &lt;br /&gt;&lt;/b&gt;Steve has more &lt;a href="http://blogs.msdn.com/hegenderfer/archive/2009/08/24/application-verifier-tip-enableshimengine.aspx"&gt;details&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Q: Do my customers need to install .NET CF Versions that my application needs?&lt;/p&gt;  &lt;p&gt;A: No. The Marketplace client takes care of installing the required version of the Compact Framework.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Q: I want to distribute my application through other channels than the Windows Mobile Marketplace. Can I distribute the certified and signed cab from Marketplace?&lt;/p&gt;  &lt;p&gt;A: No: You need to sign the &lt;a href="http://msdn.microsoft.com/en-us/windowsmobile/dd569931.aspx"&gt;cab with your own certificate&lt;/a&gt;. Applications signed with the Marketplace certificate can only be distributed from Marketplace.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Looking forward lots of cool WinMo apps on Marketplace.&lt;/p&gt;</description><pubDate>Mon, 05 Oct 2009 18:09:37 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/cschittko/winmo-app-store-questions-i-got-answers</guid><category>Windows Mobile</category></item><item><title>Win7 Multi-touch. Why wait until WPF4?</title><link>https://weblogs.asp.net:443/cschittko/win7-multi-touch-why-wait-until-wpf4</link><description>&lt;p&gt;WPF 4 is going to fully integrate Win 7’s multi-touch capabilities. with Windows 7 being RTM, you don’t have to wait for WPF 4 to be released for developing multi-touch demos. You can get started today with the &lt;a href="http://msdn.microsoft.com/en-us/library/dd562197(VS.85).aspx"&gt;native Win7 APIs&lt;/a&gt;, or with the &lt;a href="http://code.msdn.microsoft.com/WindowsTouch"&gt;WindowsTouch&lt;/a&gt; library for .NET 3.5SP1. The .NET library is much easier to work with since the native APIs are rather low level and based on the existing tablet APIs.&lt;/p&gt;  &lt;p&gt;Check out the link to the Win 7 .NET Interop Sample or the Channel9 video: &lt;a href="http://channel9.msdn.com/shows/Continuum/MultitouchLibraryWin7/"&gt;http://channel9.msdn.com/shows/Continuum/MultitouchLibraryWin7/&lt;/a&gt;.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/socaldevgal"&gt;Lynn&lt;/a&gt;’s blog post discusses the question on multi-touch with .NET 3.5 or 4.0: &lt;a href="http://blogs.msdn.com/socaldevgal/archive/2009/06/15/socaldevgal-wishes-to-decide-net-3-5-or-net-4-0-for-windows-7-multi-touch-application-development.aspx"&gt;http://blogs.msdn.com/socaldevgal/archive/2009/06/15/socaldevgal-wishes-to-decide-net-3-5-or-net-4-0-for-windows-7-multi-touch-application-development.aspx&lt;/a&gt;. It’s got more useful links to multi-touch development on Win7 resources as well.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;At least until WPF4 ships, there is a viable option to build production apps with multi-touch. There are some differences how WindowsTouch and WPF4 implement things, and you’re probably encountering a little bit of re-work, but both options are based on WPF and most of your UI and you code-behind should stay the same and you learn the &lt;a href="http://msdn.microsoft.com/en-us/library/cc872774.aspx"&gt;UI Design Guidelines for Touch&lt;/a&gt; right away.&lt;/p&gt;  &lt;p&gt;Enjoy.&lt;/p&gt;</description><pubDate>Wed, 23 Sep 2009 13:30:23 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/cschittko/win7-multi-touch-why-wait-until-wpf4</guid><category>Tablet PC</category><category>Windows 7</category><category>WPF</category></item></channel></rss>