<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Am I Done?</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/midunn/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/midunn/feed.xml</link>
    <description>In the Cloud</description>
    <lastBuildDate>Wed, 17 Apr 2019 03:25:13 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Running Mission Critical Solutions on Windows Azure</title>
      <link>https://docs.microsoft.com/archive/blogs/midunn/running-mission-critical-solutions-on-windows-azure</link>
      <pubDate>Thu, 17 May 2012 21:06:00 GMT</pubDate>
      <dc:creator><![CDATA[Michael D. Dunn]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/midunn/2012/05/17/running-mission-critical-solutions-on-windows-azure/</guid>
      <description><![CDATA[I wanted to follow up on my previous post for Common Tip and post something&nbsp;that covers how...]]></description>
      <content:encoded><![CDATA[<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">I wanted to follow up on my previous post for Common Tip and post something&nbsp;that covers how Upgrades work, how to achieve maximum availability and scale along with deployment and monitoring recommendations.</span></span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">With Windows Azure there are a lot of options on how to manage and implement deployments, upgrades, scale and availability.&nbsp; Mission Critical applications require more effort and planning on which Azure features to leverage based on its availability requirements.&nbsp; </span></span></p>
<p><b><span style="font-family: Calibri;" face="Calibri"><span style="font-size: small;" size="3">Understanding Updates &amp; Upgrades</span></span></b></p>
<p><span style="font-family: Calibri;" face="Calibri"><span style="font-size: small;" size="3">There are three types of Update events that can occur on the Windows Azure Platform.</span></span></p>
<ul>
<li><span style="font-size: small;" size="3">&middot;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">Application Upgrade</span></span></li>
<li><span style="font-size: small;" size="3">&middot;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">Guest OS Update</span></span></li>
<li><span style="font-size: small;" size="3">&middot;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">Host OS Update</span></span></li>
</ul>
<p><span style="font-family: Calibri;" face="Calibri"><span style="font-size: small;" size="3">An Application Upgrade occurs when you do an in-place upgrade on your application, options for this is covered in the Deployment section.</span></span></p>
<p><span style="font-family: Calibri;" face="Calibri"><span style="font-size: small;" size="3">The Guest OS Version is controlled via the Azure Service Configuration by setting <strong>osFamily</strong></span><span style="font-size: small;" size="3"> and the <strong>osVersion</strong> attributes.&nbsp; The osFamily attribute currently can be a 1, Windows Server 2008, or a 2, Windows Server 2008 R2.&nbsp; The osVersion controls a group of OS patches and updates for a given time, by setting the osVersion to &ldquo;*&rdquo; instead of an explicit version, this will install OS patches automatically.&nbsp; For Mission Critical applications you will have to determine if having the latest patches, including security vulnerabilities installed automatically is more of risk to your solution, than manually performing the upgrade.&nbsp; There are two ways to perform this update manually either through the Service Configuration or through &ldquo;Configure OS&rdquo; within the Management Portal.</span></span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">The Host OS Update occurs one the Host system.&nbsp; Windows Azure tenants have no control as to when this update happens. To ensure the 99.95% SLA, Windows Azure will not update all hosts at once but perform host updates on host on different Fault domains, which is why you <b>must </b>have at least 2 instances for each role for the guaranteed 99.95% SLA.&nbsp; <i>The Scalability &amp; Elasticity section goes into more detail on how you can ensure capacity during these updates.</i></span></span></p>
<p><b><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">Increasing Scalability &amp; Elasticity</span></span></b></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">A lot of times it is easy to choose the largest instance possible, surely adding more memory or CPU will increase the performance of your application?&nbsp; The problem is that most application are not written specifically to leverage multiple CPU cores and I have yet see an application that actually needed 14 GB of memory that the Extra Large VM provides. </span></span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">Which is better:&nbsp; 4 Mediums or 2 large instances?</span></span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">I would argue that 4 Mediums would be &ldquo;better&rdquo; as it would give you elasticity to increase OR decrease the number of instances based on my load at any given time, yet reducing cost by not over provisioning resources.&nbsp; For example if you have 2 Large Instances &ndash; You couldn&rsquo;t scale down without sacrificing the 99.95% SLA provided for roles that have at least 2 instances and you couldn&rsquo;t scale up without paying for an entire new Extra Large VM.&nbsp;&nbsp;&nbsp; </span></span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">Also by choosing the medium instances over the large instances, it would allow you to increase the number update domains from 2 to 4, this allows you to have higher capacity availability during Host OS updates, Guest OS updates and Application updates.&nbsp;&nbsp; For example if a Host OS update occurs, which you cannot control when it happens, &nbsp;and you were using 2 Large instances, during this time frame your solution could only handle 50% of your maximum capacity.&nbsp; On the other hand if you had used 4 Medium instances you could choose to create 4 update domains, one for each instance, which means during any update your solution, would be able to handle 75% of your maximum capacity.&nbsp; &nbsp;</span></span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">What is your solutions tolerance for reduced capacity?&nbsp; Maybe 25%-50% reduced capacity for a short period is acceptable, if not what are your options?</span></span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">The simplest option is to create an additional update domain that runs the same number of instances as all your other domains.&nbsp; In the example above of using 4 Mediums instances, this would mean running a 5<sup>th</sup> update domain with 1 additional medium instance. </span></span></p>
<p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">Another option would be to consider auto scaling or reducing feature availability for features that are CPU and/or memory intensive. &nbsp;The Enterprise Library Integration pack for Windows Azure includes WASABi , Windows Azure Autoscaling Application Block.&nbsp; This application block allows you to create rules to scale up/down and to reduce resource intensive features on the fly. Developers can download this application block from: </span><a href="http://www.microsoft.com/en-us/download/details.aspx?id=28189"><span style="color: #0000ff; font-family: Calibri; font-size: small;" face="Calibri" size="3" color="#0000ff">http://www.microsoft.com/en-us/download/details.aspx?id=28189</span></a></p>
<p><b><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">Increasing Availability with Geo-Redundancy</span></span></b></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">With two fault domains in a single datacenter and multiple upgrade domains, you are setup nicely in the event of an inner data center failure.&nbsp; What about a complete datacenter failure? &nbsp;As with an inner datacenter failure, you have to decide what is your tolerance for a complete datacenter failure?&nbsp; If your tolerance is low, then you should consider deploying your application into two data center and if you are not using auto scaling type features &ndash; this means running a complete duplicate of all of your instances in a secondary data center to run at 100% capacity you had prior to the failure.&nbsp; Once you have your solution deployed into two data centers, you can leverage the Traffic Manager feature to create a new &lsquo;Failover&rsquo; policy for your secondary deployment.&nbsp; </span></span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">It sounds simple right? Well there are other considerations when planning to have a complete failover, such as are you leveraging any other Windows Azure features, such as storage, Service Bus, Cache or Access Control?&nbsp; Since these services are datacenter dependent in the event of a failure, these services may not be available.</span></span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">This is not a simple task and will take additional development and planning.&nbsp; While I&rsquo;ve geared this section to be towards for a complete data center failure, this could be leveraged for a specific service failure.&nbsp; For example, if your solution leverages Table Storage, if the storage service for the data center your application has a failure, your Windows Azure Compute instances will be running, but any features leveraging storage will not be available and depending on the feature this could be a critical feature of the application.</span></span></p>
<p><b><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">Deployment Process Recommendations</span></span></b></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">With Windows Azure there are multiple options for deploying applications. You can use Visual Studio, the management portal, or something custom using the Management Service API. There isn&rsquo;t one way that is better than the other, but you should deploy your application in a consistent method across multiple environments: Development, Testing, Staging and Production.&nbsp;&nbsp;&nbsp; </span></span></p>
<p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">If it is possible within your team or organization, you should consider automated deployments.&nbsp; This option takes additional time, but allows you to deploy consistently. &nbsp;Automated deployments can be achieved in various ways, but currently require a custom development effort. The largest benefit to automated deployments is for operations teams to be able to rapidly re-deploy services in other data centers in of a catastrophic data center failure.&nbsp;&nbsp; For thoughts around how an automated deployment could be implemented, read the &ldquo;Automating Deployment and using Windows Azure Storage&rdquo; in the Moving Applications to the Cloud, written by Microsoft&rsquo;s Patterns and Practices team. </span><a href="http://msdn.microsoft.com/en-us/library/ff803365"><span style="color: #0000ff; font-family: Calibri; font-size: small;" face="Calibri" size="3" color="#0000ff">http://msdn.microsoft.com/en-us/library/ff803365</span></a><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri"> </span></span></p>
<p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">If automate deployment isn&rsquo;t feasible, you should consider leveraging Windows Azure PowerShell Cmdlets, available for download here: </span><a href="http://wappowershell.codeplex.com/"><span style="color: #0000ff; font-family: Calibri; font-size: small;" face="Calibri" size="3" color="#0000ff">http://wappowershell.codeplex.com/</span></a></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">These PowerShell Cmdlets provides consistent management accessibility that conforms to other Microsoft products that are leveraging PowerShell as a management interface.</span></span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">Another common question is &ldquo;Should I use a VIP Swap or leverage the In Place Upgrade?&rdquo;&nbsp; With the 1.5 Windows Azure SDK &ndash; In Place upgrades features are on-par with a VIP Swap.&nbsp; So what is the advantage of using a VIP Swap?&nbsp; The advantage is the ability to follow a process, to smoke test your application prior to it being published &ldquo;live&rdquo;.&nbsp; &nbsp;&nbsp;IF you were to use an in-place upgrade, once complete the application is &ldquo;live&rdquo;.&nbsp;&nbsp; Mistakes happen in IT, what if someone published the wrong version?&nbsp; If you used VIP swap, you could smoke test the application first and even after you perform the VIP swap, you could revert back to the previous version instantaneously! </span></span></p>
<p><b><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">Solution Monitoring</span></span></b></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">Even if you are using an auto scaling framework such as WASABi &ndash; Monitoring is an important aspect.&nbsp;&nbsp; Monitoring will assist in diagnosing issues within your application and knowing important key metrics about your application performance, errors and load. While Windows Azure can log Windows Events, Performance Counters and Logs to your storage accounts there is no &ldquo;Out of the Box&rdquo; Solution to view this data in a user friendly, graphical format. </span></span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">System Center Operations Manager offers a Windows Azure management pack, which allows you to view alerts for Events and Performance metrics of your applications in a friendly manner.&nbsp; </span></span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">The Windows Azure Management pack is available for download:&nbsp; </span></span><a href="http://www.microsoft.com/en-us/download/details.aspx?id=11324"><span style="color: #0000ff; font-family: Calibri; font-size: small;" face="Calibri" size="3" color="#0000ff">http://www.microsoft.com/en-us/download/details.aspx?id=11324</span></a></p>
<p><b><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">Disaster Recovery</span></span></b></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">While it is true that Windows Azure does backup your Storage and SQL Azure data in triplicate, however this isn&rsquo;t for you to leverage to restore your data on-demand.&nbsp; These backups are used by the Windows Azure teams in case of a catastrophic failure so they can restore an entire datacenter and not necessarily recover data for individual Windows Azure tenants. &nbsp;While this provides some relief, it is best to have backups of your application, configurations and data so that you can restore onto another Azure datacenter manually.&nbsp;&nbsp; While creating backups of Storage data would be a custom development effort, relational data stored on SQL Azure can be backed up and restored to a file using the Import/Export feature in the Windows Azure.</span></span></p>]]></content:encoded>
    </item>
    <item>
      <title>Common Windows Azure Tips</title>
      <link>https://docs.microsoft.com/archive/blogs/midunn/common-windows-azure-tips</link>
      <pubDate>Fri, 02 Dec 2011 12:58:55 GMT</pubDate>
      <dc:creator><![CDATA[Michael D. Dunn]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/midunn/2011/12/02/common-windows-azure-tips/</guid>
      <description><![CDATA[Here are several&nbsp;simple tips if you are planning to leverage Windows Azure for your...]]></description>
      <content:encoded><![CDATA[<p>Here are several&nbsp;simple tips if you are planning to leverage Windows Azure for your applications:</p>
<ul>
<li><b>Application Settings</b> - Don't use the web.config to store application settings, specifically environmental application settings. <b>For example:</b> SQL Connection strings, should be stored in the<br />Service Configuration not the web.config. The problem is since the web.config is part of the deployment package, you will either have to redeploy a new package or Remote Desktop into all of the instances to make a change. &nbsp;Think about how you move builds across environments: Development --&gt; Test --&gt; UAT --&gt; Production</li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Common Web Config Settings that should be moved to the Service Config</p>
<ul>
<ul>
<ul>
<li>SQL Connection Strings</li>
<ul>
<li>Including Entity Framework</li>
</ul>
<li>AppFabric Caching</li>
<ul>
<li>Yes &ndash; Azure lets you copy the web.config settings for caching, but caching it typically going to be environment based so move it to the Service Configuration.</li>
</ul>
</ul>
</ul>
</ul>
<blockquote>
<ul>
<li>ASP.NET Membership Provider&nbsp;</li>
</ul>
</blockquote>
<ul>
<li><b>Deployment</b> &ndash; Leverage the VIP Switch functionality, don&rsquo;t just deploy to the production node. Deploy to the staging node, smoke test, then&nbsp;do a VIP Switch. If something isn&rsquo;t right, this gives you a great way to rollback. Yes &ndash; you have to pay for the staging compute instances. There are some cases where you can&rsquo;t leverage this feature, such as a change to a WCF contract, where WCF client needs to be updated as well. Plan your deployment strategy for this scenario.</li>
</ul>
<ul>
<li><b>Scale Out, Not Up</b> &ndash; Too many times it&rsquo;s easy to say I&rsquo;ll just use the biggest VM size available. &nbsp;Your memory and CPU footprint should account for load, but you can spread that load across multiple instances. &nbsp;IE: 2 x Large Instances or 4 x Medium or 8x Small instance? In a lot of cases &ndash; you&rsquo;d be better off with 4x Medium or 8x Small than 2x Large and it&rsquo;s the same cost.&nbsp;&nbsp;</li>
</ul>
<ul>
<li><b>Performance and Diagnostic Data &ndash; </b>Collect this data, it makes troubleshooting alot easier for you. At a minimum capture the crash dumps, so they will be stored Blob storage &ndash; Ideally you have some kind of Monitoring solution deployed on Premise &ndash; like SCOM with the Windows Azure management pack or another third party solution.</li>
</ul>
<ul>
<li><b>Don&rsquo;t enable Profiling or Remote Desktop for production instances</b> &ndash; Profiling will be a performance hit in production, Remote Desktop exposes another potential attack surface. Leverage Diagnostic and Performance data to troubleshoot issues.</li>
</ul>
<ul>
<li><b>Don&rsquo;t leverage CTP features&nbsp;in Production &ndash;</b> CTP features are great, but don&rsquo;t have SLAs. (Once in Beta features typically have SLAs). IE: Traffic Manager is a great feature, but while it is in CTP, it is extremely risky as a single point of failure with no guaranteed SLA.&nbsp;&nbsp;&nbsp;</li>
</ul>
<p>&nbsp;</p>
<p>Have some thoughts? Share them with me: <a href="mailto:midunn@microsoft.com">midunn@microsoft.com</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Changes</title>
      <link>https://docs.microsoft.com/archive/blogs/midunn/changes</link>
      <pubDate>Sat, 19 Nov 2011 00:03:28 GMT</pubDate>
      <dc:creator><![CDATA[Michael D. Dunn]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/midunn/2011/11/19/changes/</guid>
      <description><![CDATA[I can't believe I've neglected this blog for 2 years, I'm blowing the dust off the keyboard and...]]></description>
      <content:encoded><![CDATA[<p>I can't believe I've neglected this blog for 2 years, I'm blowing the dust off the keyboard and getting back to it. There&rsquo;s been a lot of changes in my professional life - I've changed roles at Microsoft, <b>again.</b> &nbsp;I'm now with Premier Mission Critical support, generally supporting our PMC Azure customers.&nbsp;</p>
<p><strong>About my new team:</strong> <a href="http://www.microsoft.com/microsoftservices/en/us/support_premier_addons_pmc.aspx">http://www.microsoft.com/microsoftservices/en/us/support_premier_addons_pmc.aspx</a></p>
<p>This means I'm pretty much done with Unified Communications, I still take questions around the APIs from time to time, but&nbsp;I&rsquo;ll be changing the theme of the content from UC to Azure. I have&nbsp;lined up some posts&nbsp;about best practices and tips on using Windows Azure for Mission Critical applications:</p>
<ul>
<li>Common Mistakes</li>
<li>Deployment Best Practices</li>
<li>Geo Redundancy Possibilities</li>
</ul>
<p>Hopefully there are a few of you, that still check up on this blog and maybe some new readers.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>Server Side Speech Recognition</title>
      <link>https://docs.microsoft.com/archive/blogs/midunn/server-side-speech-recognition</link>
      <pubDate>Wed, 04 Nov 2009 18:46:00 GMT</pubDate>
      <dc:creator><![CDATA[Michael D. Dunn]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/midunn/2009/11/04/server-side-speech-recognition/</guid>
      <description><![CDATA[Last week I learned something, well I learned many things but one that was particularly interesting....]]></description>
      <content:encoded><![CDATA[<P><SPAN style="FONT-FAMILY: 'Arial','sans-serif'; FONT-SIZE: 10pt">Last week I learned something, well I learned many things but one that was particularly interesting. Lets say you wanted to do server side speech recognition&nbsp;but you <STRONG>don't</STRONG> want the transport to be SIP.&nbsp; This obviously eliminates using UCMA 2.0 as by default it will rely on OCS and therefore SIP. Well I learned that this isn't entirely true, you can actually use the Microsoft.Speech assembly that comes with the UCMA 2.0 SDK outside a UCMA application.&nbsp;&nbsp; This&nbsp;has been&nbsp;staring me in the face and it didn't ever cross my mind to do it.<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></P>
<P><SPAN style="FONT-FAMILY: 'Arial','sans-serif'; FONT-SIZE: 10pt">What kind of scenario does this open? One example improved desktop experience.&nbsp;Well SAPI is the obvious first choice when&nbsp;creating a desktop application, but the&nbsp;SAPI experience is really dependant on the OS. <STRONG>IE:</STRONG> TTS voices are different from XP to Vista.&nbsp;The benefit to having a server side solution you can control the experience of the end user has. </SPAN></P>
<P><SPAN style="FONT-FAMILY: 'Arial','sans-serif'; FONT-SIZE: 10pt">While looking to build something&nbsp;there are some problems to overcome, for me building&nbsp;a simple sample solution, two main problems stick out.</SPAN></P>
<P><SPAN style="FONT-FAMILY: 'Arial','sans-serif'; FONT-SIZE: 10pt">1.) Streaming Audio - I don't really want to pass around and process WAV files. You could but the experience wouldn't be as nice&nbsp;as you couldn't do <SPAN style="FONT-FAMILY: 'Arial','sans-serif'; FONT-SIZE: 10pt; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">immediate</SPAN> speech recognition.<BR>2.) As I won't be using System.Speech or SAPI, I am going to have to access hardware resources such as the microphone and speakers.<o:p></o:p></SPAN></P>
<P><SPAN style="FONT-FAMILY: 'Arial','sans-serif'; FONT-SIZE: 10pt">For streaming audio there are alot of different options, but being a big fan of WCF, this is first avenue I looked at and sure enough you can stream content to/from WCF. Is there anything WCF can't do!<o:p></o:p></SPAN></P>
<P><SPAN style="FONT-FAMILY: 'Arial','sans-serif'; FONT-SIZE: 10pt">&nbsp;<A href="http://msdn.microsoft.com/en-us/library/ms731913.aspx">http://msdn.microsoft.com/en-us/library/ms731913.aspx</A><o:p></o:p></SPAN></P>
<P><SPAN style="FONT-FAMILY: 'Arial','sans-serif'; FONT-SIZE: 10pt">&nbsp;Next access microphone and speakers via .NET, I don't want to write low level code I want something down and dirty. I found a very cool CodePlex project, NAudio. It abstracts a lot of the audio APIs into a single, easy to use API. This will work perfectly for my client side application.<o:p></o:p></SPAN></P>
<P><SPAN style="FONT-FAMILY: 'Arial','sans-serif'; FONT-SIZE: 10pt"><A href="http://www.codeplex.com/naudio">http://www.codeplex.com/naudio</A></SPAN></P>
<P style="MARGIN: 0in 0in 0pt" class=MsoNormal><SPAN style="FONT-FAMILY: 'Arial','sans-serif'; FONT-SIZE: 10pt">Here is a simple diagram of what I am building, and actually very close to having something running.<STRONG><EM> </EM></STRONG></SPAN></P>
<P style="MARGIN: 0in 0in 0pt" class=MsoNormal><SPAN style="FONT-FAMILY: 'Arial','sans-serif'; FONT-SIZE: 10pt"><STRONG><EM>Note:</EM></STRONG> <EM>If this was something which I was planning to actually put in a production environment, I'd separate the Synthesizer and Recognizer. These will be independent calls and would benefit from being on their own servers.</EM></SPAN><o:p></o:p></P>
<P><IMG src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Components.PostAttachments/00/09/91/74/49/ServerSideSpeech.png" original-url="http://blogs.msdn.com/photos/midunnmicrosoftcom/images/9917449/original.aspx" mce_src="http://blogs.msdn.com/photos/midunnmicrosoftcom/images/9917449/original.aspx"></P>
<P mce_keep="true">Code Sample&nbsp;will be available soon, hoping to have it up on MSDN samples by November 16th.</P>
<P mce_keep="true">&nbsp;</P>]]></content:encoded>
    </item>
    <item>
      <title>Custom Disclaimer</title>
      <link>https://docs.microsoft.com/archive/blogs/midunn/custom-disclaimer</link>
      <pubDate>Sun, 02 Aug 2009 03:56:00 GMT</pubDate>
      <dc:creator><![CDATA[Michael D. Dunn]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/midunn/2009/08/02/custom-disclaimer/</guid>
      <description><![CDATA[A lot of businesses want to add disclaimers to external communications. Using MSPL on the Edge...]]></description>
      <content:encoded><![CDATA[<P>A lot of businesses want to add disclaimers to external communications. Using MSPL on the Edge servers we can create something to simply add this disclaimer to an IM Conversation.</P>
<P>Since MSPL hasn't really changed from LCS to OCS,&nbsp;we can use the sample provided for LCS to implement a custom disclaimer for OCS.&nbsp; You can download the sample from: <A href="http://www.microsoft.com/downloads/details.aspx?familyid=ee41345b-836c-4dcf-9810-32709ae9f5c4&amp;displaylang=en&amp;tm">http://www.microsoft.com/downloads/details.aspx?familyid=ee41345b-836c-4dcf-9810-32709ae9f5c4&amp;displaylang=en&amp;tm</A></P>
<P>You'll have to make some project modifcations because it doesn't compile out of the box. These are easy like missing references etc.. </P>
<P>If you want to first run the console application, for debugging and/or learning purposes, you'll notice that the application manifest,&nbsp;".am", &nbsp;is missing. Just copy the the DisclaimerService.am from the service proejct, open it in notepad and change the AppUri to <FONT size=2></FONT><FONT color=#0000ff size=2><FONT color=#0000ff size=2><A href="http://www.microsoft.com/LC/Disclaimer/Console">http://www.microsoft.com/LC/Disclaimer/Console</A>.</FONT></FONT></P>
<P><FONT color=#0000ff></FONT><FONT size=2>Finally when you are ready to install the service portion of the solution, you'll have to&nbsp;change the ServicesDependsOn property on serviceInstaller1 in ProjectInstaller.cs as it is currently set to "LCSProxy.exe".&nbsp; Just set this to be blank.</FONT></P>
<P><FONT size=2></FONT><FONT size=2>After these minor changes, simply continue following the instructions included with the sample.<BR></P></FONT>]]></content:encoded>
    </item>
    <item>
      <title>UCMA WF Application Host</title>
      <link>https://docs.microsoft.com/archive/blogs/midunn/ucma-wf-application-host</link>
      <pubDate>Mon, 11 May 2009 12:42:00 GMT</pubDate>
      <dc:creator><![CDATA[Michael D. Dunn]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/midunn/2009/05/11/ucma-wf-application-host/</guid>
      <description><![CDATA[As promised I've released some code that shows you how to create a reusable application host that...]]></description>
      <content:encoded><![CDATA[<P>As promised I've released some code that shows you how to create a reusable application host that will run your UCMA 2.0 Workflow Applications.</P>
<P>You can find the code, binaries and an initial "How To":<BR><A href="http://code.msdn.microsoft.com/ucmahost">http://code.msdn.microsoft.com/ucmahost</A></P>
<P>The home page of the project site gives a basic walk through. One item I sort of mentioned on the site was the ability to interface with the service via MSMQ. Instead of specifying a Inbound or Outbound workflow, you can just provide the name of a private queue. This will watch that queue and send an alert via a default Outbound WF or&nbsp;the provided&nbsp;Outbound WF.</P>
<P>To use this simply write this string to MSMQ,&nbsp;sipuri={0}&amp;message={1}&amp;type={2}, providing the details of who you want to send the message to, the actual message and type. The type can be 1, Audio, or 2, IM.</P>]]></content:encoded>
    </item>
    <item>
      <title>Unified Communications Managed API v2.0 Workflow Applications</title>
      <link>https://docs.microsoft.com/archive/blogs/midunn/unified-communications-managed-api-v2-0-workflow-applications</link>
      <pubDate>Thu, 30 Apr 2009 16:28:00 GMT</pubDate>
      <dc:creator><![CDATA[Michael D. Dunn]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/midunn/2009/04/30/unified-communications-managed-api-v2-0-workflow-applications/</guid>
      <description><![CDATA[UCMA v2.0 includes a great abstraction layer, Communication Workflows, based on the&nbsp;Windows...]]></description>
      <content:encoded><![CDATA[<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'">UCMA v2.0 includes a great abstraction layer, Communication Workflows, based on the&nbsp;Windows Workflow Foundation (WF). <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'">These workflows are great for those needing to great simple yet powerful UC enabled applications. The workflow activities themselves are pretty self explanatory. I'll cover the activities themselves in another post.<o:p></o:p></SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'">&nbsp;The "difficult" portion of creating a UCMA workflow application isn't the actual workflow, but creating the host. Yes the default template wraps your&nbsp;WF application is nice little console application, but this is really only for debugging purposes.&nbsp;Are you really&nbsp;going to deploy your console application in production?&nbsp;Those familiar with Speech Server&nbsp;are probably scratching their heads, while Speech Server had a nice service and administrator console that allow you to easily point it to your Speech WF application, UCMA does not. You need to build it yourself and build it for every UC application you build, and to truly do that we need to know at least a little bit about the UCMA Core API. Joe Calev has a great blog which walks you through the Signaling portion of the Core API. For the WF API&nbsp;you really should have some understanding of the Collaboration portion of the Core API.<o:p></o:p></SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'">&nbsp;First you will need to make sure that you have a certificate on for your application and you will need to provision an application on the OCS Front End. You can do this by using the Application Provisioner and following these instructions: <A href="http://msdn.microsoft.com/en-us/library/dd253360(office.13).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd253360(office.13).aspx"><FONT color=#0000ff>http://msdn.microsoft.com/en-us/library/dd253360(office.13).aspx</FONT></A><o:p></o:p></SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'">&nbsp;This is the key information that our application will need:<o:p></o:p></SPAN></P>
<UL type=disc>
<LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l1 level1 lfo1; tab-stops: list .5in"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'">Application Name<o:p></o:p></SPAN></LI>
<LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l1 level1 lfo1; tab-stops: list .5in"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'">Application Port<o:p></o:p></SPAN></LI>
<LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l1 level1 lfo1; tab-stops: list .5in"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'">Application SIP URI<o:p></o:p></SPAN></LI>
<LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l1 level1 lfo1; tab-stops: list .5in"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'">Application Server FQDN<o:p></o:p></SPAN></LI>
<LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l1 level1 lfo1; tab-stops: list .5in"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'">OCS Pool FQDN<o:p></o:p></SPAN></LI>
<LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l1 level1 lfo1; tab-stops: list .5in"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'">OCS Pool Port<o:p></o:p></SPAN></LI>
<LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l1 level1 lfo1; tab-stops: list .5in"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'">GRUU<o:p></o:p></SPAN></LI>
<LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l1 level1 lfo1; tab-stops: list .5in"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'">Certificate Information<o:p></o:p></SPAN></LI></UL>
<P><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'">Note:</SPAN></B><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'"> You should never call the asynchronous methods, synchronously. IE object.End(object.Begin). You'll see some of this in sample code and blog posts, do not use this is a production application!<o:p></o:p></SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'">Armed with the necessary information, we can start looking at some code:<o:p></o:p></SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'">First we need to use create an instance of the CollaborationPlatform, for this post the importance of this object is that it is used to describe our application. It has two constructors, one that takes a ClientPlatformSettings parameter and the other that takes a ServerPlatformSettings.<o:p></o:p></SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'">The different here is the ClientPlatformSettings will use an AD account, while a ServerPlatformSettings will use a Contact Object. We reference the Contact Object via the GRUU provided by the Application Provisioning tool. There are some features lost if you use the ClientPlatformSettings, such as Impersonation. I typically draw the line, if the application is going to consume the Audio or Instant Message call and perform some logic based on the input I use the ServerPlatformSettings. <B style="mso-bidi-font-weight: normal">IE:</B> Response Bots. If my application is just providing an abstraction method for a user that already has credentials to sign in and message users, then I would use the ClientPlatformSettings. <B style="mso-bidi-font-weight: normal">IE: </B>Build your own <I style="mso-bidi-font-style: normal">authenticated</I> Web Messaging.<o:p></o:p></SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'">For this post, we will use the ServerPlatformSettings.<o:p></o:p></SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; COLOR: #2b91af; FONT-FAMILY: 'Arial','sans-serif'">ServerPlatformSettings </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'">platformSettings = <SPAN style="COLOR: blue">new</SPAN> <SPAN style="COLOR: #2b91af">ServerPlatformSettings</SPAN>(appName, appServerFqdn, applicationPort, gruu, cert);<BR><SPAN style="COLOR: #2b91af">CollaborationPlatform </SPAN>collabPlatform = <SPAN style="COLOR: blue">new</SPAN> <SPAN style="COLOR: #2b91af">CollaborationPlatform</SPAN>(platformSettings);<o:p></o:p></SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'">collabPlatform.EndStartup(collabPlatform.BeginStartup(<SPAN style="COLOR: blue">null</SPAN>, <SPAN style="COLOR: blue">null</SPAN>))<o:p></o:p></SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'">Once the CollaborationPlatform object has completed starting up, we need to setup our EndPoint. There are two choices, ApplicationEndPoint and UserEndPoint, if you are using the ClientPlatformSettings then you need to use the UserEndPoint, since we are using the ServerPlatformSettings we need to use the ApplicationEndPoint.<o:p></o:p></SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; COLOR: #2b91af; FONT-FAMILY: 'Arial','sans-serif'">ApplicationEndpointSettings</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'"> settings = <SPAN style="COLOR: blue">new</SPAN> <SPAN style="COLOR: #2b91af">ApplicationEndpointSettings</SPAN>(applicationUri, ocsFqdn, ocsTlsPort);<BR><SPAN style="COLOR: #2b91af">ApplicationEndpoint </SPAN>endpoint = <SPAN style="COLOR: blue">new</SPAN> <SPAN style="COLOR: #2b91af">ApplicationEndpoint</SPAN>(collabPlatform, settings);<o:p></o:p></SPAN></P>
<P mce_keep="true"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'">If our WF application is an Inbound application, we need to register for the type of calls the WF will handle, but remember that the WF can only accept AV and IM calls and can't accept conferencing calls. That’s not to say you couldn’t register to receive a conference invite, and handle the conferencing features using the Core API itself, but that is another post.<o:p></o:p></SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'">endpoint.RegisterForIncomingCall&lt;<SPAN style="COLOR: #2b91af">AudioVideoCall</SPAN>&gt;(AudioVideoCallReceived);<BR>endpoint.RegisterForIncomingCall&lt;<SPAN style="COLOR: #2b91af">InstantMessagingCall</SPAN>&gt;(InstantMessagingCallReceived);<o:p></o:p></SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'">Once we have done that, we can establish our endpoint.<o:p></o:p></SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'">endpoint.EndEstablish(endpoint.BeginEstablish(<SPAN style="COLOR: blue">null</SPAN>, endpoint));<o:p></o:p></SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'">Next we need to start the Workflow Runtime and add the UCMA WF Services, this isn’t so much related to UCMA as it is to WF itself. <o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"><SPAN style="FONT-SIZE: 10pt; COLOR: #2b91af; FONT-FAMILY: 'Courier New'; mso-no-proof: yes">WorkflowRuntime</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"> <SPAN style="mso-spacerun: yes">&nbsp;</SPAN>workflowRuntime = <SPAN style="COLOR: blue">new</SPAN> <SPAN style="COLOR: #2b91af">WorkflowRuntime</SPAN>();<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes">workflowRuntime.AddService(<SPAN style="COLOR: blue">new</SPAN> <SPAN style="COLOR: #2b91af">CommunicationsWorkflowRuntimeService</SPAN>());<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes">workflowRuntime.AddService(<SPAN style="COLOR: blue">new</SPAN> <SPAN style="COLOR: #2b91af">TrackingDataWorkflowRuntimeService</SPAN>());<o:p></o:p></SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes">workflowRuntime.StartRuntime();</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'"> <o:p></o:p></SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'">Finally we need to route the call to our workflow, via the handler methods we registered for earlier. <o:p></o:p></SPAN></P>
<P><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'">AudioVideoCallReceived<BR>InstantMessagingCallReceived<o:p></o:p></SPAN></B></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'">When a call comes in, we need to pass the call to our workflow application and from there the Workflow handles the rest:<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"><SPAN style="FONT-SIZE: 10pt; COLOR: #2b91af; FONT-FAMILY: 'Courier New'; mso-no-proof: yes">WorkflowInstance</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"> workflowInstance = workflowRuntime.CreateWorkflow(<SPAN style="COLOR: #2b91af">WorkflowType</SPAN>);<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"><SPAN style="FONT-SIZE: 10pt; COLOR: #2b91af; FONT-FAMILY: 'Courier New'; mso-no-proof: yes">CommunicationsWorkflowRuntimeService</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"> communicationsWorkflowRuntimeService = (<SPAN style="COLOR: #2b91af">CommunicationsWorkflowRuntimeService</SPAN>)workflowRuntime.GetService(<SPAN style="COLOR: blue">typeof</SPAN>(<SPAN style="COLOR: #2b91af">CommunicationsWorkflowRuntimeService</SPAN>));<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes">communicationsWorkflowRuntimeService.EnqueueCall(workflowInstance.InstanceId, <B style="mso-bidi-font-weight: normal"><I style="mso-bidi-font-style: normal">call</I></B>); <SPAN style="COLOR: green">//Call object is passed by the receiving handler</SPAN><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes">communicationsWorkflowRuntimeService.SetEndpoint(workflowInstance.InstanceId, <B style="mso-bidi-font-weight: normal"><I style="mso-bidi-font-style: normal">endpoint</I></B>);<SPAN style="COLOR: green"> //Endpoint object is a local variable</SPAN><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes">communicationsWorkflowRuntimeService.SetWorkflowCulture(workflowInstance.InstanceId, <SPAN style="COLOR: blue">new</SPAN> <SPAN style="COLOR: #2b91af">CultureInfo</SPAN>(<SPAN style="COLOR: #a31515">"en-US"</SPAN>));<o:p></o:p></SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes">workflowInstance.Start();</SPAN><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'"><o:p></o:p></SPAN></B></P>
<P><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'"><o:p>&nbsp;</o:p></SPAN></B></P>
<P><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'"><o:p></o:p></SPAN></B><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'">I was thinking about it and all of this is pretty repetitive code from one workflow to another workflow application, this all has to be done, everytime for every WF project. I’ve created a solution that I will release on CodePlex last this week. Basically the solution is a Windows Service that will take the parameters, GRUU, port, etc… log into OCS and route calls to the workflow you provide as a compiled assembly. Also part of this solution utilizes MSMQ, in much the same way Speech Server did. You can associate a MSMQ name to an application, if a message is in that queue if will fire off the workflow you specify or use the default built in WF application.<o:p></o:p></SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'">The Jist of it is, instead of worrying about writing all the code above, you can concentrate on just the workflow portion. Compile the WF as an Assembly instead of a Console application, add the application parameters to the App.Config of this UCMA Application Host service and you are done! A picture is worth a thousand words, so here is a high level picture of the solution.<o:p></o:p></SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'"><o:p>&nbsp;</o:p></SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'"></SPAN><IMG style="WIDTH: 508px; HEIGHT: 309px" height=304 src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Components.PostAttachments/00/09/58/11/94/UCMAHost.png" original-url="http://blogs.msdn.com/photos/midunnmicrosoftcom/images/9581194/original.aspx" width=476 mce_src="http://blogs.msdn.com/photos/midunnmicrosoftcom/images/9581194/original.aspx"></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'"><o:p></o:p></SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'"><o:p>&nbsp;</o:p></SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'"><STRONG>I am also working on releasing the following solutions on CodePlex:</STRONG></SPAN></P>
<UL>
<LI><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'"></SPAN><EM><STRONG><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'">Updated Web Chat sample. The current released Web Chat uses UC AJAX, this updated one will use UCMA 2.0, WCF &amp; SilverLight.</SPAN></STRONG></EM></LI>
<LI><EM><STRONG><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'"></SPAN></STRONG></EM><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol"><SPAN style="mso-list: Ignore"><EM><STRONG><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;</SPAN></STRONG></EM></SPAN></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'"><EM><STRONG>Client Framework. An abstraction layer to both UC Client and Communicator Automation.</STRONG></EM> <o:p></o:p></SPAN></LI></UL>
<P><FONT size=2>&nbsp;</P></FONT>
<P mce_keep="true">&nbsp;</P>]]></content:encoded>
    </item>
    <item>
      <title>OCS 2007 R2 Virtual Launch</title>
      <link>https://docs.microsoft.com/archive/blogs/midunn/ocs-2007-r2-virtual-launch</link>
      <pubDate>Wed, 28 Jan 2009 11:02:00 GMT</pubDate>
      <dc:creator><![CDATA[Michael D. Dunn]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/midunn/2009/01/28/ocs-2007-r2-virtual-launch/</guid>
      <description><![CDATA[Sign up for the OCS 2007 R2 Virtual Launch on Feburary...]]></description>
      <content:encoded><![CDATA[<DIV class=Section1>
<P class=MsoNormal>Sign up for the OCS 2007 R2 Virtual Launch on Feburary 3rd.<BR><A class="" href="http://www.microsoft.com/communicationsserver/virtualevent/languageselect.aspx" mce_href="http://www.microsoft.com/communicationsserver/virtualevent/languageselect.aspx">http://www.microsoft.com/communicationsserver/virtualevent/languageselect.aspx</A></P>
<P class=MsoNormal>And just to keep entertain until Feburary 3rd, here are some R2 launch teaser videos:<BR><FONT color=#0000ff><A class="" href="https://www.youtube.com/profile?user=OCSR2Launch&amp;view=videos" mce_href="https://www.youtube.com/profile?user=OCSR2Launch&amp;view=videos">https://www.youtube.com/profile?user=OCSR2Launch&amp;view=videos</A></FONT></P></DIV>]]></content:encoded>
    </item>
    <item>
      <title>Windows Speech Recognition Macros Tools have Shipped!</title>
      <link>https://docs.microsoft.com/archive/blogs/midunn/windows-speech-recognition-macros-tools-have-shipped</link>
      <pubDate>Wed, 28 Jan 2009 11:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Michael D. Dunn]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/midunn/2009/01/28/windows-speech-recognition-macros-tools-have-shipped/</guid>
      <description><![CDATA[I blogged about these earlier and they have finally shipped. You can download them...]]></description>
      <content:encoded><![CDATA[<P class=MsoNormal><SPAN style="FONT-SIZE: 12pt">I blogged about these earlier and they have finally shipped. You can download them here:</SPAN></P>
<P class=MsoNormal><SPAN style="FONT-SIZE: 12pt"></SPAN><SPAN style="FONT-SIZE: 12pt"><FONT color=#0000ff><A class="" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=fad62198-220c-4717-b044-829ae4f7c125&amp;displaylang=en" mce_href="http://www.microsoft.com/downloads/details.aspx?FamilyID=fad62198-220c-4717-b044-829ae4f7c125&amp;displaylang=en">http://www.microsoft.com/downloads/details.aspx?FamilyID=fad62198-220c-4717-b044-829ae4f7c125&amp;displaylang=en</A></FONT></SPAN></P>]]></content:encoded>
    </item>
    <item>
      <title>Status Update</title>
      <link>https://docs.microsoft.com/archive/blogs/midunn/status-update</link>
      <pubDate>Mon, 12 Jan 2009 02:03:00 GMT</pubDate>
      <dc:creator><![CDATA[Michael D. Dunn]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/midunn/2009/01/12/status-update/</guid>
      <description><![CDATA[I've been MIA for a couple months mainly for Office Communications Server 2007 R2 to RTM, but I've...]]></description>
      <content:encoded><![CDATA[<P>I've been MIA for a couple months mainly for Office Communications Server 2007 R2 to RTM, but I've also been busy at work. </P>
<P>I promise I will get the the UCMA 2.0 Workflow post I promised, but those of you wanting to get a taste of UCMA now, check out Joe Calev's blog, he currently has a full seris on UCMA 2.0 Core right now. <A href="http://blogs.msdn.com/jcalev/default.aspx" mce_href="http://blogs.msdn.com/jcalev/default.aspx">http://blogs.msdn.com/jcalev/default.aspx</A></P>
<P>Right now I am in Redmond for 3 weeks for the first rotation of Microsoft Certified Master program for Office Communications Server 2007 R2. All I can say it that it will be <STRONG>very very</STRONG> long days, including doing training on the weekend. As much as I am looking forward to it, I am also dreading it. 3 weeks away from home, actually 4 weeks as I will also be attending TechReady, our internal conference, and probably 11-12 hours in a classroom...&nbsp; This class probably is not for the faint of heart.</P>
<P>If are not sure what it is MCM is, you can read more here: <A href="http://www.microsoft.com/learning/mcp/master/OCS/default.mspx" mce_href="http://www.microsoft.com/learning/mcp/master/OCS/default.mspx">http://www.microsoft.com/learning/mcp/master/OCS/default.mspx</A></P>
<P>The long time away from home will actually give me some time to finally blog.</P>]]></content:encoded>
    </item>
  </channel>
</rss>