<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Jian Wu's Blog.</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/jianwu/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/jianwu/feed.xml</link>
    <description />
    <lastBuildDate>Wed, 17 Apr 2019 04:05:44 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Ref: 导出HDInsight数据到MySQL（Azure）</title>
      <link>https://docs.microsoft.com/archive/blogs/jianwu/ref-hdinsightmysqlazure</link>
      <pubDate>Fri, 09 Oct 2015 23:56:00 GMT</pubDate>
      <dc:creator><![CDATA[JIAN WU - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/jianwu/2015/10/09/ref-hdinsightmysqlazure/</guid>
      <description><![CDATA[在大数据计算中，经常会有一个场景：在Hadoop分布式存储DFS和关系型数据库（MySQL、Oracle、SQL Server）间导入（导出）数据。由于Azure...]]></description>
      <content:encoded><![CDATA[<p>在大数据计算中，经常会有一个场景：在Hadoop分布式存储DFS和关系型数据库（MySQL、Oracle、SQL Server）间导入（导出）数据。由于Azure HDInsight是基于公有云的托管式Hadoop，用户在执行数据转移时，与云上Hadoop相连的关系型数据库往往不是本地的数据库引擎，取而代之的是公有云提供的关系型数据库服务，如SQL Database和MySQL on Azure。针对如何使用HDInsight中的工具Sqoop导入（导出）数据到SQL Database，Azure官方文档给出了<a href="https://azure.microsoft.com/en-us/documentation/articles/hdinsight-use-sqoop/">参考教程</a>，本文具体实践如何使用Sqoop（HDInsight）导出数据到MySQL on Azure的场景。</p>
<p>关于HDInsight：<a href="https://azure.microsoft.com/en-us/documentation/articles/hdinsight-high-availability/">https://azure.microsoft.com/en-us/documentation/articles/hdinsight-high-availability/</a>，本实践中将会提交任务到HDInsight集群，集群中的Head Node分配任务到Worker Node，Worker Node具体实施数据的读取、处理和转移。</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/4530.1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/4530.1.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/4530.1.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/4530.1.png" alt="" border="0" /></a><br />&nbsp;</p>
<p>关于MySQL on Azure：<a href="https://www.windowsazure.cn/home/features/mysql/">https://www.windowsazure.cn/home/features/mysql/</a></p>
<p>关于Sqoop: <a href="https://sqoop.apache.org/docs/1.4.4/SqoopUserGuide.html">https://sqoop.apache.org/docs/1.4.4/SqoopUserGuide.html</a></p>
<p>关于HDInsight和Azure Storage：<a href="https://azure.microsoft.com/en-us/documentation/articles/hdinsight-hadoop-use-blob-storage/">https://azure.microsoft.com/en-us/documentation/articles/hdinsight-hadoop-use-blob-storage/</a>，HDInsight中的数据以冗余的形式存储在Azure Storage中，HDInsight节点可以通过分布式存储路径（WASB）来读写目标数据。同时，用户也可以直接访问Azure Storage对应容器中的HDInsight数据文件。</p>
<p>&nbsp;</p>
<p>注：本实践通过Azure PowerShell来实现，主要包括：</p>
<ol>
<li>创建MySQL数据表，用于接收Sqoop导出的数据。</li>
<li>上传数据样本文件到HDInsight的存储（Azure Storage）</li>
<li>提交数据导出任务（Sqoop Job）到HDInsight集群</li>
<li>跟踪Sqoop任务执行情况并检查输出结果。</li>
</ol>
<p>&nbsp;</p>
<p><strong><span style="background-color: #ffff00;">第一步：准备MySQL数据表</span></strong></p>
<p align="left">#MySQL variables = "mysqlservices-sha.chinacloudapp.cn"</p>
<p align="left">$MySQLLogin = "login1@jianwmysql"&nbsp; #<span style="background-color: #ffff00;">注意格式： 登录用户@MySQL服务器名</span></p>
<p align="left">$MySQLPassword = "password"</p>
<p align="left">$MySQLExportedDBName = "testdb01"</p>
<p align="left">$tableName = "jtable3"</p>
<p align="left">&nbsp;</p>
<p align="left">$confirmation= Read-Host "To create a new MySQL table, input 'y'; use existing MySQL table, input anything else ..."</p>
<p align="left">if ($confirmation -eq 'y') {</p>
<p align="left">&nbsp;&nbsp;&nbsp; $MySQLAdminUserName =$MySQLLogin;</p>
<p align="left">&nbsp;&nbsp;&nbsp; $MySQLAdminPassword =$MySQLPassword;</p>
<p align="left">&nbsp;&nbsp;&nbsp; $MySQLDatabase =$MySQLExportedDBName;</p>
<p align="left">&nbsp;&nbsp;&nbsp; $MySQLHost =$MySQLServerName;</p>
<p align="left">&nbsp;&nbsp;&nbsp; $ConnectionString ="server=" +$MySQLHost +";port=3306;uid=" + $MySQLAdminUserName+ ";pwd="+ $MySQLAdminPassword + ";database="+$MySQLDatabase</p>
<p align="left">&nbsp;&nbsp;&nbsp; $Query = "CREATE TABLE " + $tableName + "(id VARCHAR(40),name VARCHAR(40))"</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;&nbsp;&nbsp; Try {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [void][System.Reflection.Assembly]::LoadWithPartialName("MySql.Data")</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $Connection = New-Object MySql.Data.MySqlClient.MySqlConnection</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $Connection.ConnectionString = $ConnectionString</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $Connection.Open()</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $Command = New-Object MySql.Data.MySqlClient.MySqlCommand($Query, $Connection)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $DataAdapter = New-Object MySql.Data.MySqlClient.MySqlDataAdapter($Command)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $DataSet = New-Object System.Data.DataSet</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $RecordCount = $dataAdapter.Fill($dataSet, "data")</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $DataSet.Tables[0]</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $Query = "select count(*) from " + $tableName</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $Command = New-Object MySql.Data.MySqlClient.MySqlCommand($Query, $Connection)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $DataAdapter = New-Object MySql.Data.MySqlClient.MySqlDataAdapter($Command)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $DataSet = New-Object System.Data.DataSet</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $RecordCount = $dataAdapter.Fill($dataSet, "data")</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $DataSet.Tables[0].Rows[0].ItemArray[0].ToString();</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [System.Console]::WriteLine("MySQL table was created successfully.");</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p align="left">&nbsp;&nbsp;&nbsp; Catch {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Write-Host "ERROR : Unable to run query : $query `n$Error[0]"</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p align="left">&nbsp;&nbsp;&nbsp; Finally {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $Connection.Close()</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p align="left">&nbsp; }</p>
<p>&nbsp;</p>
<p><span style="background-color: #ffff00;"><strong>第二步：上传样本数据</strong></span></p>
<p align="left">Add-AzureAccount -Environment azurechinacloud</p>
<p align="left"># Define the cluter variables</p>
<p align="left">$clusterName = "hadoopjianw3"</p>
<p align="left">$storageAccountName = "jianwstorage"</p>
<p align="left">$containerName = "hadoopjianw3"</p>
<p align="left">&nbsp;</p>
<p align="left">#Upload a file into Azure storage (DFS of Hadoop)</p>
<p align="left">$StorageAccountKey = Get-AzureStorageKey -StorageAccountName $storageAccountName</p>
<p align="left">$Ctx = New-AzureStorageContext<br />$StorageAccountName -StorageAccountKey $StorageAccountKey.Primary</p>
<p align="left">Get-ChildItem -Path d:\log2copy.txt | <span style="background-color: #ffff00;">Set-AzureStorageBlobContent</span> -Container $containerName -Blob tutorials2/log2copy.txt -Context $Ctx</p>
<p align="left">此处用到的样本文件log2copy.txt，含有以下样本数据（分隔符为tab跳格），该样本文件可见附件。</p>
<p align="left">mytest&nbsp; 123</p>
<p align="left">world&nbsp;&nbsp;&nbsp; 456</p>
<p>&nbsp;</p>
<p><span style="background-color: #ffff00;"><strong>第三步：提交Sqoop任务到HDInsight</strong></span></p>
<p align="left">[System.Console]::WriteLine("Start Sqoop-MySQL test ...");</p>
<p align="left">&nbsp;#Add-AzureAccount</p>
<p align="left">Add-AzureAccount -Environment azurechinacloud</p>
<p align="left">&nbsp;</p>
<p align="left"># Define the cluter variables</p>
<p align="left">$clusterName = "hadoopjianw3"</p>
<p align="left">$storageAccountName = "jianwstorage"</p>
<p align="left">$containerName = "hadoopjianw3"</p>
<p align="left">&nbsp;</p>
<p align="left"># Connection string for Azure MySQL Database.</p>
<p align="left">$conStr = "jdbc:mysql://$MySQLServerName/$MySQLExportedDBName"</p>
<p align="left">#Hive file location</p>
<p align="left">$exportDir = "wasb://$containerName@$storageAccountName.blob.core.chinacloudapi.cn/tutorials2"</p>
<p align="left">$sqoopDef = <span style="background-color: #ffff00;">New-AzureHDInsightSqoopJobDefinition</span> -Command "export --connect $conStr --username $MySQLLogin --password $MySQLPassword --table $tableName --export-dir $exportDir --fields-terminated-by \t -m 1"</p>
<p align="left">&nbsp;</p>
<p align="left">$sqoopJob = <span style="background-color: #ffff00;">Start-AzureHDInsightJob</span> -Cluster $clusterName -JobDefinition $sqoopDef -Debug -Verbose</p>
<p align="left">&nbsp;</p>
<p align="left">Wait-AzureHDInsightJob -WaitTimeoutInSeconds 3600 -Job $sqoopJob</p>
<p align="left">Write-Host "Standard Error" -BackgroundColor Green</p>
<p align="left">Get-AzureHDInsightJobOutput -Cluster $clusterName -JobId $sqoopJob.JobId -StandardError</p>
<p align="left">Write-Host "Standard Output" -BackgroundColor Green</p>
<p align="left">Get-AzureHDInsightJobOutput -Cluster $clusterName -JobId $sqoopJob.JobId -StandardOutput&nbsp;&nbsp;</p>
<p>&nbsp;</p>
<p><strong><span style="background-color: #ffff00;">第四步：跟踪Sqoop任务并检查输出</span></strong></p>
<p>查看HDInsight的控制台主页</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/0083.3.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/0083.3.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/0083.3.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/0083.3.png" alt="" border="0" /></a></p>
<p>查看Sqoop Job的执行结果：</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/2543.1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/2543.1.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/2543.1.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/2543.1.png" alt="" border="0" /></a></p>
<p>查看MySQL中的结果数据</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/2605.2.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/2605.2.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/2605.2.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/2605.2.png" alt="" border="0" /></a></p>
<p>&nbsp;</p>
<p><strong><span style="background-color: #ffff00;">调试与问题解决：</span></strong></p>
<p>如果建立的HDInsight集群采用的是较低版本的Hadoop，Sqoop任务执行过程中可能抛出以下错误，该错误的原因是在HDInsight集群中找不到对应的MySQL Driver，此类问题的手动解决方法是：用户手动copy相应的MySQL Driver（mysql-connector-java-5.1.36-bin.jar）到HDInsight的C:\apps\dist\sqoop-&lt;version&gt;\lib目录下。MySQL Driver可以在<a href="https://www.mysql.com/products/connector/">https://www.mysql.com/products/connector/</a>下载。</p>
<p align="left">15/09/21 03:35:12 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5.2.2.7.1-0004</p>
<p align="left">15/09/21 03:35:12 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.</p>
<p align="left">15/09/21 03:35:13 INFO manager.SqlManager: Using default fetchSize of 1000</p>
<p align="left">15/09/21 03:35:13 INFO tool.CodeGenTool: Beginning code generation</p>
<p align="left">15/09/21 03:35:13 ERROR sqoop.Sqoop: <strong>Got exception running Sqoop: java.lang.RuntimeException: Could not load db driver class: com.mysql.jdbc.Driver</strong></p>
<p align="left">java.lang.RuntimeException: Could not load db driver class: com.mysql.jdbc.Driver</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.manager.SqlManager.makeConnection(SqlManager.java:848)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.manager.GenericJdbcManager.getConnection(GenericJdbcManager.java:52)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.manager.SqlManager.execute(SqlManager.java:736)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.manager.SqlManager.execute(SqlManager.java:759)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.manager.SqlManager.getColumnInfoForRawQuery(SqlManager.java:269)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.manager.SqlManager.getColumnTypesForRawQuery(SqlManager.java:240)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.manager.SqlManager.getColumnTypes(SqlManager.java:226)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.manager.ConnManager.getColumnTypes(ConnManager.java:295)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.orm.ClassWriter.getColumnTypes(ClassWriter.java:1773)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.orm.ClassWriter.generate(ClassWriter.java:1578)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.tool.CodeGenTool.generateORM(CodeGenTool.java:96)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.tool.ExportTool.exportTable(ExportTool.java:64)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.tool.ExportTool.run(ExportTool.java:100)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.Sqoop.run(Sqoop.java:143)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:179)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.Sqoop.runTool(Sqoop.java:218)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.Sqoop.runTool(Sqoop.java:227)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.Sqoop.main(Sqoop.java:236)</p>
<p align="left">[DBG]: PS C:\WINDOWS\system32&gt;&gt;&nbsp;</p>
<p>此问题也可以通过HDInsight中的action script来解决，使用脚本的方法安装MySQL Driver到目标目录。</p>
<p><a href="https://azure.microsoft.com/en-us/documentation/articles/hdinsight-hadoop-customize-cluster/">https://azure.microsoft.com/en-us/documentation/articles/hdinsight-hadoop-customize-cluster/</a></p>
<p><a href="https://azure.microsoft.com/en-us/documentation/articles/hdinsight-hadoop-script-actions/">https://azure.microsoft.com/en-us/documentation/articles/hdinsight-hadoop-script-actions/</a></p>
<p>&nbsp;</p>
<p>本实践的完整PowerShell脚本如附件，Azure用户修改其中的（MySQL、Storage和HDInsight）参数既可应用。</p>
<p>&nbsp;</p>
<p>参考文档：</p>
<p><a href="https://azure.microsoft.com/en-us/documentation/articles/hdinsight-use-sqoop/">https://azure.microsoft.com/en-us/documentation/articles/hdinsight-use-sqoop/</a></p>
<p><a href="https://azure.microsoft.com/en-us/documentation/articles/storage-powershell-guide-full/">https://azure.microsoft.com/en-us/documentation/articles/storage-powershell-guide-full/</a></p>
<p><a href="https://sqoop.apache.org/docs/1.4.4/SqoopUserGuide.html">https://sqoop.apache.org/docs/1.4.4/SqoopUserGuide.html</a></p>
<p><a href="https://azure.microsoft.com/en-us/documentation/articles/hdinsight-hadoop-introduction/">https://azure.microsoft.com/en-us/documentation/articles/hdinsight-hadoop-introduction/</a></p>
<p><a href="https://azure.microsoft.com/en-us/documentation/articles/hdinsight-hadoop-use-blob-storage/">https://azure.microsoft.com/en-us/documentation/articles/hdinsight-hadoop-use-blob-storage/</a></p>
<p>&nbsp;</p>
<p>原文：<a href="https://blogs.msdn.com/b/cciccat/archive/2015/09/21/hdinsight-mysql-azure.aspx">https://blogs.msdn.com/b/cciccat/archive/2015/09/21/hdinsight-mysql-azure.aspx</a></p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Components.PostAttachments/00/10/64/69/99/sqoop-mysql-summary-3.2.ps1.txt" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-components-postattachments/00-10-64-69-99/sqoop_2D00_mysql_2D00_summary_2D00_3.2.ps1.txt">sqoop-mysql-summary-3.2.ps1.txt</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Updated: 在Windows Azure平台上运行PHP应用</title>
      <link>https://docs.microsoft.com/archive/blogs/jianwu/updated-windows-azurephp</link>
      <pubDate>Wed, 26 Aug 2015 23:03:00 GMT</pubDate>
      <dc:creator><![CDATA[JIAN WU - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/jianwu/2015/08/26/updated-windows-azurephp/</guid>
      <description><![CDATA[参考：https://blogs.msdn.com/b/cciccat/archive/2015/08/19/windows-azure-php.aspx
&nbsp;
PHP技术在互联网应用中非常...]]></description>
      <content:encoded><![CDATA[<p align="left">参考：<a href="https://blogs.msdn.com/b/cciccat/archive/2015/08/19/windows-azure-php.aspx">https://blogs.msdn.com/b/cciccat/archive/2015/08/19/windows-azure-php.aspx</a></p>
<p align="left">&nbsp;</p>
<p align="left">PHP技术在互联网应用中非常流行，被广泛使用在网站应用、报表管理、脚本任务等场景。Windows Azure作为企业级公有云平台，不仅仅能无缝托管传统的微软开发技术（.Net），对于PHP、Java等业内通用的语言和技术也提供了极好的支持。本文就如何在Windows Azure平台上运行PHP应用总结出一些最佳实践和参考步骤。</p>
<p align="left">&nbsp;</p>
<p align="left"><strong>一、 选择合适的Windows Azure服务来运行PHP应用</strong></p>
<p align="left">Windows Azure提供不同层次的公有云服务，主要包括IaaS（基础设施即服务：以虚拟机、虚拟网络为代表），PaaS（平台即服务：以网站应用、云服务、数据库为代表）和SaaS（软件即服务：以Office 365，Azure活动目录为代表），其中可以用作托管PHP应用的主要有三类服务：</p>
<p align="left">-&nbsp; 虚拟机：用户在Azure中创建虚拟机，自行部署PHP环境并发布PHP应用，实践过程和在本地发布PHP服务一致。</p>
<p align="left">-&nbsp; 网站应用（Web App）：Azure后端存在大量已实现好PHP环境的服务器，用户只需将PHP应用代码通过Git、FTP等工具上传到目标服务器即可。</p>
<p align="left">-&nbsp; 云服务(Cloud Service)：Azure平台根据用户的设置，实时创建和定制化（一个或多个）虚拟机，自动安装用户指定的PHP环境并加载用户的PHP应用代码，实现PHP网站服务或者后台处理应用。</p>
<p align="left">关于这三种方案的不同点和相同点，可以参见：<a href="https://azure.microsoft.com/en-us/documentation/articles/choose-web-site-cloud-service-vm/">https://azure.microsoft.com/en-us/documentation/articles/choose-web-site-cloud-service-vm/</a>，总结下来，最突出的特点是：</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="222">
<p align="left">方案类型</p>
</td>
<td valign="top" width="222">
<p align="left">适用场景</p>
</td>
<td valign="top" width="222">
<p align="left">优点</p>
</td>
<td valign="top" width="222">
<p align="left">缺点</p>
</td>
</tr>
<tr>
<td valign="top" width="222">
<p align="left">虚拟机</p>
</td>
<td valign="top" width="222">
<p align="left">支持LAMP（另外两种场景下网站服务器都是<strong>IIS/Windows</strong>）；PHP应用依赖于手动安装的组件或应用。</p>
</td>
<td valign="top" width="222">
<p align="left">用户完全控制，和本地实践一样。</p>
<p align="left">&nbsp;</p>
</td>
<td valign="top" width="222">
<p align="left">手动部署，效率较低。</p>
</td>
</tr>
<tr>
<td valign="top" width="222">
<p align="left">网站应用</p>
</td>
<td valign="top" width="222">
<p align="left">快速部署，用户不需要更改服务器机器环境，较少自定义配置PHP网站服务器（拓展），默认的PHP环境包（如PHP5.4）可以满足应用需求。</p>
</td>
<td valign="top" width="222">
<p align="left">即时部署、迁移、更新，用户不关注服务器环境设置和后台维护。</p>
</td>
<td valign="top" width="222">
<p align="left">用户不能访问后台服务器。</p>
<p align="left">需要很多配置工作来使用自定义PHP运行环境或者深度修改后台网站服务器。</p>
<p align="left">&nbsp;</p>
</td>
</tr>
<tr>
<td valign="top" width="222">
<p align="left">云服务</p>
</td>
<td valign="top" width="222">
<p align="left">用户需要定制化的服务器环境或运行初始化任务。</p>
</td>
<td valign="top" width="222">
<p align="left">平衡部署效率和服务器定制化；支持访问后台服务器；支持同时托管多个网站或应用。</p>
</td>
<td valign="top" width="222">
<p align="left">部署效率不及网站应用，服务器可定制化程度不及虚拟机。</p>
</td>
</tr>
</tbody>
</table>
<p align="left">&nbsp;</p>
<p align="left">这三种方案的形象对比如下图：</p>
<p align="left"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/0844.websites_cloudservices_vms_3.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/0844.websites_5F00_cloudservices_5F00_vms_5F00_3.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/0844.websites_cloudservices_vms_3.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/0844.websites_5F00_cloudservices_5F00_vms_5F00_3.png" alt="" border="0" /></a></p>
<p align="left">&nbsp;</p>
<p align="left"><strong>二、 在Windows Azure平台上运行PHP应用</strong></p>
<p align="left">&nbsp;</p>
<p align="left"><span style="background-color: #ffff00;">1. 本地开发PHP应用</span></p>
<p><span style="background-color: #ffff00;">这一部分同传统的PHP应用开发完全一致，若迁移本地已有的PHP应用到Azure，可以跳过这一部分内容。</span></p>
<p align="left">l&nbsp;&nbsp; 安装PHP运行环境(<strong><em>Apache + PHP + MySQL</em></strong> 或者<strong>XAMPP</strong>)，XAMPP 提供一键式快速安装, 可参考: <a href="https://netbeans.org/kb/docs/php/configure-php-environment-windows_zh_CN.html#XAMPP">https://netbeans.org/kb/docs/php/configure-php-environment-windows_zh_CN.html#XAMPP</a></p>
<p align="left">l&nbsp;&nbsp; 安装PHP开发工具，如Eclipse，Zend Studio，PHPStorm等，也可以直接使用本地记事本（NotePad）。</p>
<p align="left">l&nbsp;&nbsp; 使用PHP开发工具或者记事本创建PHP网页面并写PHP代码。</p>
<p align="left">l&nbsp;&nbsp; 在PHP代码中调用依赖模块连接Cache、MySQL、MangoDB等服务（Cache、MySQL、MangoDB等可以是用户部署在公有云虚拟机或本地计算机中的服务，也可以是公有云直接提供的Redis Cache、MySQL PaaS等服务）.</p>
<p align="left">&nbsp;&nbsp;&nbsp; - PHP连接公有云中的MySQL和连接本地的MySQL完全一致，只需更改对应的host IP和MySQL Login信息就行。</p>
<p align="left">&nbsp;&nbsp;&nbsp; - PHP连接公有云中的Redis Cache可参考： <a href="https://msdn.microsoft.com/en-us/library/azure/Dn690470.aspx">https://msdn.microsoft.com/en-us/library/azure/Dn690470.aspx</a></p>
<p align="left">&nbsp;&nbsp;&nbsp; - Azure Redis Cache的客户端依赖包和使用方法：<a href="https://github.com/nrk/predis">https://github.com/nrk/predis</a></p>
<p align="left">l&nbsp;&nbsp; (可选)根据实际需要，在PHP代码中连接Azure Storage。参考：<a href="https://azure.microsoft.com/en-us/documentation/articles/storage-php-how-to-use-blobs/">https://azure.microsoft.com/en-us/documentation/articles/storage-php-how-to-use-blobs/</a></p>
<p>&nbsp;</p>
<p>示例项目：</p>
<p>创建一个文件夹PHPTest1，按照<a href="https://azure.microsoft.com/en-us/documentation/articles/storage-php-how-to-use-blobs/">https://azure.microsoft.com/en-us/documentation/articles/storage-php-how-to-use-blobs/</a>提示，安装Azure Storage SDK（PHP），安装界面如下：</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/7140.2.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/7140.2.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/7140.2.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/7140.2.png" alt="" border="0" /></a></p>
<p>安装完成后，添加两个PHP页面：test.php和mycomment.php。完整示例代码如附件（附件项目中已包含Azure Storage SDK），mycomment.php为一个简单的留言板页面，使用到了MySQL（存储留言内容）和Azure Storage（存储最后一次MySQL操作命令）。</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/7360.3.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/7360.3.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/7360.3.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/7360.3.png" alt="" border="0" /></a></p>
<p>mycomment.php中用到的MySQL操作和Azure Storage操作代码如下：</p>
<p align="left">&nbsp;&nbsp;&nbsp; &lt;?php</p>
<p align="left">&nbsp;&nbsp;&nbsp; <span style="background-color: #ffff00;">require_once 'vendor\autoload.php';&nbsp; //加载安装到本地的Azure Storage客户端依赖包（for PHP）</span></p>
<p align="left">&nbsp;&nbsp;&nbsp; use WindowsAzure\Common\ServicesBuilder;</p>
<p align="left">&nbsp;&nbsp;&nbsp; use WindowsAzure\Common\ServiceException;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;&nbsp;&nbsp; $val = !empty($_POST["comment"]) ? $_POST["comment"] : null;</p>
<p align="left">&nbsp;&nbsp;&nbsp; if($val)</p>
<p align="left">&nbsp;&nbsp;&nbsp; {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $remarker= "Anonymous";</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $retime = date('Y-m-d H:i:s');</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $link =<span style="background-color: #ffff00;"> mysql_connect</span>('42.159.191.201', 'mysqllogin', 'password');</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!$link) {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; die('Could not connect: ' . mysql_error());</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mysql_select_db('test', $link) or die('Could not select database.');</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $sqlCmd = "insert into commenttable (username, words,timestamp, ipaddress) values ('$remarker','$val','$retime','$_SERVER[REMOTE_ADDR]')";</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $res = <span style="background-color: #ffff00;">mysql_query</span>($sqlCmd, $link);</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; saveAzureBlob($sqlCmd);</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception $e) {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo 'Caught exception: ',&nbsp; $e-&gt;getMessage(), "\n";</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p align="left">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;mysql_close($link);</p>
<p align="left">&nbsp;&nbsp;&nbsp; }</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;&nbsp;&nbsp; function <span style="background-color: #ffff00;">saveAzureBlob</span>($lastOperation)</p>
<p align="left">&nbsp;&nbsp;&nbsp; {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $connectionString = 'BlobEndpoint=https://jianwstorage.blob.core.chinacloudapi.cn/;QueueEndpoint=https://jianwstorage.queue.core.chinacloudapi.cn/;TableEndpoint=https://jianwstorage.table.core.chinacloudapi.cn/;AccountName=jianwstorage;AccountKey=I&times;7+&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;J&times;&times;&times;g==';</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Create blob REST proxy.</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$blobRestProxy = ServicesBuilder::getInstance()-&gt;createBlobService($connectionString);</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $blob_name = "testblob";</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $content = $lastOperation;</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Upload blob</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $blobRestProxy-&gt;createBlockBlob("mylog", $blob_name, $content);</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (ServiceException $e) {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Handle exception based on error codes and messages.</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $code = $e-&gt;getCode();</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$error_message = $e-&gt;getMessage();</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo $code . ":" .$error_message . "&lt;br /&gt;";</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p align="left">&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; ?&gt;</p>
<p>&nbsp;</p>
<p>若需使用Azure Redis Cache,如上介绍，下载Predis依赖包到本地PHP项目中，通过如下示例代码可以连接Azure Redis Cache：</p>
<p>&nbsp;&nbsp;&nbsp; &lt;?php</p>
<p>&nbsp;&nbsp;&nbsp; <span style="background-color: #ffff00;">require "predis/autoload.php";&nbsp; //加载下载到本地的Azure Redis Cache客户端依赖包（for PHP）</span><br />&nbsp;&nbsp;&nbsp; predis\autoloader::register();<br />&nbsp;&nbsp;&nbsp; doAzureRedisCache(false);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; <span style="background-color: #ffff00;">//示例函数记录请求的客户端IP到Redis Cache缓存中，如传递参数true即读取缓存的客户端IP</span></p>
<p>&nbsp;&nbsp;&nbsp; function doAzureRedisCache($isRead)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $myip = $_SERVER['REMOTE_ADDR'];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $r = new Predis\Client('tcp://jianwRedistest.redis.cache.chinacloudapi.cn:6379');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $r-&gt;auth("DfqB9cBTKW5BPknMMzmWly+KUDB6eUHj9sJe1eCG5Ds=");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if($isRead)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $r-&gt;get("myip");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $r-&gt;set("myip", $myip);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; ?&gt;</p>
<p>&nbsp;</p>
<p><span style="background-color: #ffff00;">2. 部署PHP应用到Azure虚拟机</span></p>
<p align="left">将PHP应用部署到Azure虚拟机和本地部署PHP应用完全一致。可以参照</p>
<p align="left"><a href="https://netbeans.org/kb/docs/php/configure-php-environment-windows_zh_CN.html">https://netbeans.org/kb/docs/php/configure-php-environment-windows_zh_CN.html</a></p>
<p align="left"><a href="https://www.xl7788.com/zt/web/platform/php_linux.html">https://www.xl7788.com/zt/web/platform/php_linux.html</a></p>
<p align="left">创建Azure虚拟机可以参考：</p>
<p align="left"><a href="https://azure.microsoft.com/en-us/documentation/articles/virtual-machines-windows-choices-create-vm/">https://azure.microsoft.com/en-us/documentation/articles/virtual-machines-windows-choices-create-vm/</a></p>
<p align="left">&nbsp;<br /><span style="background-color: #ffff00;">3. 部署PHP应用到Azure网站应用</span></p>
<p>将本地开发好的PHP网站部署到Azure网站应用非常便捷，如使用FileZilla工具，将本地PHP网站的全部内容上传到目标Azure网站应用对应的wwwroot目录下即可。如图：</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/5633.1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/5633.1.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/5633.1.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/5633.1.png" alt="" border="0" /></a></p>
<p>部署后的效果如下：</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/0535.3.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/0535.3.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/0535.3.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/0535.3.png" alt="" border="0" /></a></p>
<p>更多详细的步骤参见：<a href="https://blogs.technet.com/b/sams_blog/archive/2014/11/14/azure-websites-deploy-php-website-using-ftp.aspx">https://blogs.technet.com/b/sams_blog/archive/2014/11/14/azure-websites-deploy-php-website-using-ftp.aspx</a></p>
<p>如需定制化默认的PHP环境，可以参考：</p>
<p><a href="https://blogs.msdn.com/b/cciccat/archive/2015/04/08/azure-websites-php-extension.aspx">https://blogs.msdn.com/b/cciccat/archive/2015/04/08/azure-websites-php-extension.aspx</a></p>
<p><a href="https://azure.microsoft.com/en-us/documentation/articles/web-sites-php-configure/">https://azure.microsoft.com/en-us/documentation/articles/web-sites-php-configure/</a></p>
<p>&nbsp;</p>
<p><span style="background-color: #ffff00;">4. 部署PHP应用到Azure云服务</span></p>
<p>对于默认PHP环境够用（不需要其他拓展或定制化的配置）的PHP应用，使用网站应用比较便捷。但如果PHP应用需要使用用户定制的PHP环境和拓展，使用Azure云服务会更加灵活和高效。下面的步骤是如果将本地开发好的PHP应用及本地PHP环境（包含拓展）打包发布到Azure云服务。</p>
<p align="left">l&nbsp;&nbsp; 使用Azure PowerShell命令New-AzureServiceProject创建一个新的工程，并调用命令Add-AzurePHPWebRole创建一个PHP网站角色，调用Add-AzurePHPWorkerRole创建一个PHP后台处理角色（可选，网站应用一般不需要单独的后台处理模块），这些命令会生成一个项目模板，其中包括即将创建的云服务需要使用的虚拟机大小、虚拟机数量等等，用户可以手动更改或不做任何处理。</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/6557.3.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/6557.3.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/6557.3.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/6557.3.png" alt="" border="0" /></a></p>
<p>&nbsp;</p>
<p>创建远程连接用户名/密码用于将来登录云服务虚拟机（可选，发布后也可启用或更改）。</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/6685.1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/6685.1.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/6685.1.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/6685.1.png" alt="" border="0" /></a></p>
<p align="left">l&nbsp;&nbsp; 将本地开发好的PHP应用完整的复制到刚刚创建的PHP网站角色对应的文件夹中。</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/8546.2.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/8546.2.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/8546.2.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/8546.2.png" alt="" border="0" /></a></p>
<p align="left">l&nbsp;&nbsp; 将本地开发机中的PHP安装环境（即本地PHP安装目录，包含php.exe, ext目录, lib目录等）完整复制到PHP网站角色对应目录下的Bin文件夹中。</p>
<p align="left">&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/8867.3.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/8867.3.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/8867.3.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/8867.3.png" alt="" border="0" /></a></p>
<p align="left">该PHP运行环境应该包含有用户自定义的所有拓展和配置。复制完成后，找到复制过来的php.ini文件，打开后更改extension_dir="C:\xampp\php\ext"为extension_dir="ext"。（C:\xampp\php\ext为笔者本地开发机中PHP环境的拓展所在目录，改为相对地址ext，以便云服务使用）</p>
<p align="left">&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/3480.1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/3480.1.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/3480.1.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/3480.1.png" alt="" border="0" /></a></p>
<p align="left">&nbsp;</p>
<p align="left">l&nbsp;&nbsp; 找到PHP网站角色目录下bin文件夹中的文件<code>setup_web.cmd</code>，使用记事本打开，用以下命令覆盖原有内容，并保存。这些脚本命令的作用是在云服务虚拟机中加载前面复制过来的PHP运行环境。</p>
<p align="left"><span class="lit">@ECHO</span><span class="pln"> ON<br />cd </span><span class="str">"%~dp0"</span><span class="pln"><br /><br /></span><span class="kwd">if</span><span class="str">"%EMULATED%"</span><span class="pun">==</span><span class="str">"true"</span><span class="kwd">exit</span><span class="pun">/</span><span class="pln">b </span><span class="lit">0</span><span class="pln"><br /><br />msiexec </span><span class="pun">/</span><span class="pln">i sqlncli</span><span class="pun">.</span><span class="pln">msi </span><span class="pun">/</span><span class="pln">qn IACCEPTSQLNCLILICENSETERMS</span><span class="pun">=</span><span class="pln">YES<br /><br />SET PHP_FULL_PATH</span><span class="pun">=%~</span><span class="pln">dp0php\php</span><span class="pun">-</span><span class="pln">cgi</span><span class="pun">.</span><span class="pln">exe<br />SET NEW_PATH</span><span class="pun">=%</span><span class="pln">PATH</span><span class="pun">%;%</span><span class="typ">RoleRoot</span><span class="pun">%</span><span class="pln">\base\x</span><span class="lit">86</span><span class="pln"><br /><br /></span><span class="pun">%</span><span class="pln">WINDIR</span><span class="pun">%</span><span class="pln">\system32\inetsrv\appcmd</span><span class="pun">.</span><span class="pln">exe </span><span class="kwd">set</span><span class="pln"> config </span><span class="pun">-</span><span class="pln">section</span><span class="pun">:</span><span class="pln">system</span><span class="pun">.</span><span class="pln">webServer</span><span class="pun">/</span><span class="pln">fastCgi </span><span class="pun">/+</span><span class="str">"[fullPath='%PHP_FULL_PATH%',maxInstances='12',idleTimeout='60000',activityTimeout='3600',requestTimeout='60000',instanceMaxRequests='10000',protocol='NamedPipe',flushNamedPipe='False']"</span><span class="pun">/</span><span class="pln">commit</span><span class="pun">:</span><span class="pln">apphost<br /></span><span class="pun">%</span><span class="pln">WINDIR</span><span class="pun">%</span><span class="pln">\system32\inetsrv\appcmd</span><span class="pun">.</span><span class="pln">exe </span><span class="kwd">set</span><span class="pln"> config </span><span class="pun">-</span><span class="pln">section</span><span class="pun">:</span><span class="pln">system</span><span class="pun">.</span><span class="pln">webServer</span><span class="pun">/</span><span class="pln">fastCgi </span><span class="pun">/+</span><span class="str">"[fullPath='%PHP_FULL_PATH%'].environmentVariables.[name='PATH',value='%NEW_PATH%']"</span><span class="pun">/</span><span class="pln">commit</span><span class="pun">:</span><span class="pln">apphost<br /></span><span class="pun">%</span><span class="pln">WINDIR</span><span class="pun">%</span><span class="pln">\system32\inetsrv\appcmd</span><span class="pun">.</span><span class="pln">exe </span><span class="kwd">set</span><span class="pln"> config </span><span class="pun">-</span><span class="pln">section</span><span class="pun">:</span><span class="pln">system</span><span class="pun">.</span><span class="pln">webServer</span><span class="pun">/</span><span class="pln">fastCgi </span><span class="pun">/+</span><span class="str">"[fullPath='%PHP_FULL_PATH%'].environmentVariables.[name='PHP_FCGI_MAX_REQUESTS',value='10000']"</span><span class="pun">/</span><span class="pln">commit</span><span class="pun">:</span><span class="pln">apphost<br /></span><span class="pun">%</span><span class="pln">WINDIR</span><span class="pun">%</span><span class="pln">\system32\inetsrv\appcmd</span><span class="pun">.</span><span class="pln">exe </span><span class="kwd">set</span><span class="pln"> config </span><span class="pun">-</span><span class="pln">section</span><span class="pun">:</span><span class="pln">system</span><span class="pun">.</span><span class="pln">webServer</span><span class="pun">/</span><span class="pln">handlers </span><span class="pun">/+</span><span class="str">"[name='PHP',path='*.php',verb='GET,HEAD,POST',modules='FastCgiModule',scriptProcessor='%PHP_FULL_PATH%',resourceType='Either',requireAccess='Script']"</span><span class="pun">/</span><span class="pln">commit</span><span class="pun">:</span><span class="pln">apphost<br /></span><span class="pun">%</span><span class="pln">WINDIR</span><span class="pun">%</span><span class="pln">\system32\inetsrv\appcmd</span><span class="pun">.</span><span class="pln">exe </span><span class="kwd">set</span><span class="pln"> config </span><span class="pun">-</span><span class="pln">section</span><span class="pun">:</span><span class="pln">system</span><span class="pun">.</span><span class="pln">webServer</span><span class="pun">/</span><span class="pln">fastCgi </span><span class="pun">/</span><span class="str">"[fullPath='%PHP_FULL_PATH%'].queueLength:50000"</span></p>
<p align="left">&nbsp;</p>
<p align="left">l&nbsp;&nbsp; 通过PowerShell命令Publish-AzureServiceProject -ServiceName [目标云服务名称] -StorageAccountName [使用的Azure Storage名称] -Slot [测试环境或生产环境]即可将PHP应用发布到云服务。（其中使用的云服务和存储账号需要提前准备）</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/0882.2.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/0882.2.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/0882.2.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/0882.2.png" alt="" border="0" /></a></p>
<p>发布完成后即可查看运行在云服务中的PHP网站应用。</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/4428.1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/4428.1.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/4428.1.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/4428.1.png" alt="" border="0" /></a></p>
<p align="left"><strong>三、 小结</strong></p>
<p align="left">Windows Azure对于PHP应用提供了与本地完全一致的运行环境，用户可以根据实际场景，选择合适的Azure服务，快速部署自定义的PHP应用。</p>
<p align="left">Azure虚拟机：手动定制PHP环境和应用实践。</p>
<p align="left">Azure网站应用：快速部署PHP应用到公有云平台。</p>
<p align="left">Azure云服务：使用自定义的PHP环境托管运行PHP应用。</p>
<p align="left">&nbsp;</p>
<p align="left">参考内容：</p>
<p><a href="https://www.apachefriends.org/download.html">https://www.apachefriends.org/download.html</a></p>
<p><a href="https://azure.microsoft.com/en-us/documentation/articles/storage-php-how-to-use-blobs/">https://azure.microsoft.com/en-us/documentation/articles/storage-php-how-to-use-blobs/</a></p>
<p><a href="https://azure.microsoft.com/en-us/documentation/articles/cloud-services-php-create-web-role/">https://azure.microsoft.com/en-us/documentation/articles/cloud-services-php-create-web-role/</a></p>
<p><a href="https://netbeans.org/kb/docs/php/configure-php-environment-windows_zh_CN.html#XAMPP">https://netbeans.org/kb/docs/php/configure-php-environment-windows_zh_CN.html#XAMPP</a></p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Components.PostAttachments/00/10/63/77/95/PHPTest1-Share.zip" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-components-postattachments/00-10-63-77-95/PHPTest1_2D00_Share.zip">PHPTest1-Share.zip</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Ref: 快速创建、启动Azure虚拟机(群)</title>
      <link>https://docs.microsoft.com/archive/blogs/jianwu/ref-azure</link>
      <pubDate>Wed, 03 Jun 2015 02:13:00 GMT</pubDate>
      <dc:creator><![CDATA[JIAN WU - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/jianwu/2015/06/03/ref-azure/</guid>
      <description><![CDATA[在使用Azure Virtual Machine过程中，用户常常会遇到以下需求：
l&nbsp; 在同一个托管服务（Cloud Service）下，快速创建多个虚拟机。
l&nbsp;...]]></description>
      <content:encoded><![CDATA[<p>在使用Azure Virtual Machine过程中，用户常常会遇到以下需求：</p>
<p>l&nbsp; 在同一个托管服务（Cloud Service）下，快速创建多个虚拟机。</p>
<p>l&nbsp; 快速启动同一个托管服务下多个已有的虚拟机。</p>
<p>由于这些虚拟机从属于同一个托管服务，共用托管服务所对应的网络配置和负载映射等，因此在同时创建或者同时启动多个虚拟机的操作中，用户容易遇到以下问题：</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/2086.1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/2086.1.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/2086.1.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/2086.1.png" alt="" border="0" /></a></p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/5241.2.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/5241.2.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/5241.2.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/5241.2.png" alt="" border="0" /></a></p>
<p>产生这个问题的原因是：在第一台虚拟机启动初期，Azure后端尚在分配共用资源（如局域网IP）给第一台虚拟机，需要对托管服务独占式访问操作，第二台虚拟机需要在第一台虚拟机成功获取共有资源之后才能开始启动过程。</p>
<p>&nbsp;</p>
<p>对于快速创建或启动同一托管服务下的多个虚拟机，本博文介绍一些常见的实施方法和优化步骤。</p>
<p>查看全文： <a href="https://blogs.msdn.com/b/cciccat/archive/2015/06/02/quick-start-multi-vm-in-single-cloud-service.aspx">https://blogs.msdn.com/b/cciccat/archive/2015/06/02/quick-start-multi-vm-in-single-cloud-service.aspx</a></p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>Windows Azure -- 静态资源访问性能优化</title>
      <link>https://docs.microsoft.com/archive/blogs/jianwu/windows-azure-2</link>
      <pubDate>Thu, 19 Mar 2015 01:54:00 GMT</pubDate>
      <dc:creator><![CDATA[JIAN WU - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/jianwu/2015/03/19/windows-azure-2/</guid>
      <description><![CDATA[在开发网站等可公共访问的服务时，客户端的体验至关重要，Azure网站（PaaS Web Role或者Azure...]]></description>
      <content:encoded><![CDATA[<p>在开发网站等可公共访问的服务时，客户端的体验至关重要，Azure网站（PaaS Web Role或者Azure Websites）同样如此。通常在Azure开发过程中，对于网站服务所有的静态资源（如图片、css、js等），推荐的做法是：</p>
<ul>
<li>将静态文件存储在Azure Storage中，如<a href="https://zcdnstorage.blob.core.windows.net/112041147350697/iis-screenshot.JPG"><span style="color: #0563c1;">https://zcdnstorage.blob.core.windows.net/112041147350697/iis-screenshot.JPG</span></a></li>
<li>开启CDN服务，指向目标Azure Storage，如<a href="https://az39977.vo.msecnd.net/"><span style="color: #0563c1;">https://az39977.vo.msecnd.net</span></a>&nbsp;<span style="font-size: x-small;">指向</span> <a href="https://zcdnstorage.blob.core.windows.net">https://zcdnstorage.blob.core.windows.net</a></li>
<li>在网页中使用基于CDN的资源地址，如<a href="https://az39977.vo.msecnd.net/112041147350697/iis-screenshot.JPG"><span style="color: #0563c1;">https://az39977.vo.msecnd.net/112041147350697/iis-screenshot.JPG</span></a></li>
</ul>
<p><span style="font-family: Calibri;">&nbsp;</span></p>
<p>除此之外，对于部分存储中网站服务器中的静态资源，可以通过设置网站配置<span style="font-family: Calibri;">web.config</span>来指定客户端浏览器缓存该静态内容。</p>
<p><span style="font-family: Calibri;">&lt;staticContent&gt;</span></p>
<p><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;clientCache <span style="background-color: #ffff00;">setEtag="true" cacheControlMode="UseMaxAge" cacheControlMaxAge="01:00:00"</span> /&gt;</span></p>
<p><span style="font-family: Calibri;">&lt;/staticContent&gt;</span></p>
<p><span style="font-family: Calibri;">&nbsp;</span></p>
<p>尽管如此，在上述实现之后，仍然可能发现一些客户端在访问目标网站时存在一些性能问题，如下是通过<strong><span style="font-family: Calibri;">Chrome</span></strong>浏览器抓取的网络包：</p>
<p><span style="font-family: Calibri; font-size: small;">&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/4442.111.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/4442.111.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/4442.111.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/4442.111.png" alt="" border="0" /></a></span></p>
<p>可以发现：访问同一个网页时，本地可以缓存的内容都是来自于网站的，而来自于<span style="font-family: Calibri;">CDN</span>的内容都没有本地缓存。</p>
<p>&nbsp;</p>
<p>进一步抓取<strong><span style="font-family: Calibri;">Fiddler</span></strong>网络包，可以看到，访问来自网站的图片时，返回信息里面包括了目标内容在本地缓存的设定，这和网站配置中的设定是一致的。</p>
<table border="1" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong>#</strong></p>
</td>
<td>
<p align="center"><strong>Result</strong></p>
</td>
<td>
<p align="center"><strong>Protocol</strong></p>
</td>
<td>
<p align="center"><strong>Host</strong></p>
</td>
<td>
<p align="center"><strong>URL</strong></p>
</td>
<td>
<p align="center"><strong>Body</strong></p>
</td>
<td>
<p align="center"><strong>Caching</strong></p>
</td>
<td>
<p align="center"><strong>Content-Type</strong></p>
</td>
<td>
<p align="center"><strong>Process</strong></p>
</td>
<td>
<p align="center"><strong>Comments</strong></p>
</td>
<td>
<p align="center"><strong>Custom</strong></p>
</td>
</tr>
<tr>
<td>
<p>8</p>
</td>
<td>
<p>304</p>
</td>
<td>
<p>HTTP</p>
</td>
<td>
<p>&times;&times;&times;.cloudapp.net</p>
</td>
<td>
<p>/image/A1_logo-03.jpg</p>
</td>
<td>
<p>0</p>
</td>
<td>
<p><span style="background-color: #ffff00;">max-age=3600</span></p>
</td>
<td>&nbsp;</td>
<td>
<p>chrome:3660</p>
</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>HTTP/1.1 304 Not Modified</p>
<p><span style="background-color: #ffff00;">Cache-Control: max-age=3600</span></p>
<p>Accept-Ranges: bytes</p>
<p>ETag: "03ca4df851d01:0"</p>
<p>Server: Microsoft-IIS/8.5</p>
<p>X-Powered-By: ASP.NET</p>
<p>Date: Thu, 12 Mar 2015 02:25:58 GMT</p>
<p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></p>
<p>而访问来自<span style="font-family: Calibri;">CDN</span>的内容时，返回信息里面指定本地缓存时间为<span style="font-family: Calibri;">0.</span></p>
<table border="1" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong>#</strong></p>
</td>
<td>
<p align="center"><strong>Result</strong></p>
</td>
<td>
<p align="center"><strong>Protocol</strong></p>
</td>
<td>
<p align="center"><strong>Host</strong></p>
</td>
<td>
<p align="center"><strong>URL</strong></p>
</td>
<td>
<p align="center"><strong>Body</strong></p>
</td>
<td>
<p align="center"><strong>Caching</strong></p>
</td>
<td>
<p align="center"><strong>Content-Type</strong></p>
</td>
<td>
<p align="center"><strong>Process</strong></p>
</td>
<td>
<p align="center"><strong>Comments</strong></p>
</td>
<td>
<p align="center"><strong>Custom</strong></p>
</td>
</tr>
<tr>
<td>
<p>27</p>
</td>
<td>
<p>304</p>
</td>
<td>
<p>HTTP</p>
</td>
<td>
<p>az725896.vo.msecnd.net</p>
</td>
<td>
<p>/koudaistorage-js-thirdsource/alertify.js</p>
</td>
<td>
<p>0</p>
</td>
<td>
<p><span style="background-color: #ffff00;">public, max-age=0</span></p>
</td>
<td>&nbsp;</td>
<td>
<p>chrome:3660</p>
</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>HTTP/1.1 304 Not Modified</p>
<p>Accept-Ranges: bytes</p>
<p><span style="background-color: #ffff00;">Cache-Control: public, max-age=0</span></p>
<p>Date: Thu, 12 Mar 2015 02:25:57 GMT</p>
<p>Etag: 0x8D21E55F68CDAC3</p>
<p>Last-Modified: Tue, 24 Feb 2015 14:33:17 GMT</p>
<p>Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0</p>
<p>X-Cache: HIT</p>
<p>x-ms-blob-type: BlockBlob</p>
<p>x-ms-lease-status: unlocked</p>
<p>x-ms-request-id: c72b7ac6-0001-0043-424f-de188d000000</p>
<p>x-ms-version: 2009-09-19</p>
<p>由于网站<span style="font-family: Calibri;">&times;&times;&times;.cloudapp.net</span>中<span style="font-family: Calibri;">web.config</span>的<span style="font-family: Calibri;">clientcache</span>配置对于存储在<span style="font-family: Calibri;">Azure Storage</span>中的内容不生效，即导致了客户端的表现。</p>
<p>&nbsp;</p>
<p>解决这个问题，需要对你存储在目标<span style="font-family: Calibri;">Azure Storage</span>中的目标文件都设置<span style="font-family: Calibri;">cache-control</span>配置，如<span style="font-family: Calibri;">storage explorer</span>中即可以设置：</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/2211.222.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/2211.222.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/2211.222.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/2211.222.png" alt="" border="0" /></a></p>
<p>设置<span style="font-family: Calibri;">cache-control</span>后，本地访问目标文件可以看到返回的信息中含有本地缓存配置：</p>
<table border="1" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong>#</strong></p>
</td>
<td>
<p align="center"><strong>Result</strong></p>
</td>
<td>
<p align="center"><strong>Protocol</strong></p>
</td>
<td>
<p align="center"><strong>Host</strong></p>
</td>
<td>
<p align="center"><strong>URL</strong></p>
</td>
<td>
<p align="center"><strong>Body</strong></p>
</td>
<td>
<p align="center"><strong>Caching</strong></p>
</td>
<td>
<p align="center"><strong>Content-Type</strong></p>
</td>
<td>
<p align="center"><strong>Process</strong></p>
</td>
<td>
<p align="center"><strong>Comments</strong></p>
</td>
<td>
<p align="center"><strong>Custom</strong></p>
</td>
</tr>
<tr>
<td>
<p>60</p>
</td>
<td>
<p>200</p>
</td>
<td>
<p>HTTP</p>
</td>
<td>
<p>perfcounter.blob.core.windows.net</p>
</td>
<td>
<p>/test/restart.txt</p>
</td>
<td>
<p>13,915</p>
</td>
<td>
<p><span style="background-color: #ffff00;">max-age=3600</span></p>
</td>
<td>&nbsp;</td>
<td>
<p>iexplore:1836</p>
</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
</tbody>
</table>
<p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></p>
<p>通常开发项目中，考虑到目标<span style="font-family: Calibri;">blob storage</span>中存储的用于网站的<span style="font-family: Calibri;">js</span>、<span style="font-family: Calibri;">css</span>文件可能比较多，如果使用工具如<span style="font-family: Calibri;">storage explorer</span>去逐一设置会比较低效。因此一个比较快速的办法是采用代码的方式去完成，步骤如下：</p>
<p><span style="font-family: Calibri;">1.</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用代码去遍历目标<span style="font-family: Calibri;">storage</span>中的文件</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string ACCOUNTNAME = "storageaccountname";</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string ACCOUNTKEY = "AURnf***********==";</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Retrieve storage account from connection string.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CloudStorageAccount storageAccount = CloudStorageAccount.Parse("DefaultEndpointsProtocol=http;AccountName=" + ACCOUNTNAME + ";AccountKey=" + ACCOUNTKEY);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Create the blob client.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Retrieve a reference to a container.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloudBlobContainer container = blobClient.GetContainerReference("blobcontainer");</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Create the container if it doesn't already exist.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; container.CreateIfNotExists();</p>
<p>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//set blobs in the container to be public</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; container.SetPermissions(</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new BlobContainerPermissions</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PublicAccess = BlobContainerPublicAccessType.Blob</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });</p>
<p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Loop over items within the container</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="background-color: #ffff00;">foreach (IListBlobItem item in container.ListBlobs(null, true))</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background-color: #ffff00;">&nbsp; if (item.GetType() == typeof(CloudBlockBlob))</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CloudBlockBlob blockBlob = (CloudBlockBlob)item;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ......</p>
<p><span style="font-family: Calibri;">2.</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对每一个文件单独设置<span style="font-family: Calibri;">cache-control</span>属性</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Loop over items within the container and save cache control property</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (IListBlobItem item in container.ListBlobs(null, true))</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (item.GetType() == typeof(CloudBlockBlob))</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CloudBlockBlob blockBlob = (CloudBlockBlob)item;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //set cache-control for the blob</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<span style="background-color: #ffff00;">blockBlob.Properties.CacheControl = "max-age=3600, must-revalidate";</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="background-color: #ffff00;">blockBlob.SetProperties();</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></p>
<p>开发参考：</p>
<p><a href="https://msdn.microsoft.com/en-us/library/windowsazure/hh225342.aspx"><span style="color: #0563c1;">https://msdn.microsoft.com/en-us/library/windowsazure/hh225342.aspx</span></a></p>
<p><a href="https://alexandrebrisebois.wordpress.com/2013/08/11/save-money-by-setting-cache-control-on-windows-azure-blobs/"><span style="color: #0563c1; font-family: Calibri; font-size: small;">https://alexandrebrisebois.wordpress.com/2013/08/11/save-money-by-setting-cache-control-on-windows-azure-blobs/</span></a></p>
<p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></p>
<p><span style="background-color: #ffff00;">更多关于<span style="font-family: Calibri;">Azure blob storage</span>的缓存设置：</span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">For blob storage, http cache is controlled by one property named cache-control of blobs, here is definition and details of the cache-control property:</span></span></p>
<p><a href="https://msdn.microsoft.com/en-us/library/windowsazure/microsoft.windowsazure.storage.blob.blobproperties.cachecontrol.aspx"><span style="color: #0563c1; font-family: Calibri; font-size: small;">https://msdn.microsoft.com/en-us/library/windowsazure/microsoft.windowsazure.storage.blob.blobproperties.cachecontrol.aspx</span></a></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">Gets or sets the cache-control value stored for the blob.</span></span></p>
<p><span style="font-family: Calibri; font-size: small;">Regarding </span><a href="https://www.mnot.net/cache_docs/"><span style="color: #0563c1; font-family: Calibri; font-size: small;">Cache-Control Headers</span></a><span style="font-size: small;"><span style="font-family: Calibri;">, here is more about how to value it:</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;"><strong>max-age</strong>=[seconds] &mdash; specifies the maximum amount of time that a representation will be considered fresh. Similar to Expires, this directive is relative to the time of the request, rather than absolute. [seconds] is the number of seconds from the time of the request you wish the representation to be fresh for. </span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;"><strong>s-maxage</strong>=[seconds] &mdash; similar to max-age, except that it only applies to shared (e.g., proxy) caches. </span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;"><strong>public</strong> &mdash; marks authenticated responses as cacheable; normally, if HTTP authentication is required, responses are automatically private. </span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;"><strong>private</strong> &mdash; allows caches that are specific to one user (e.g., in a browser) to store the response; shared caches (e.g., in a proxy) may not. </span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;"><strong>no-cache</strong> &mdash; forces caches to submit the request to the origin server for validation before releasing a cached copy, every time. This is useful to assure that authentication is respected (in combination with public), or to maintain rigid freshness, without sacrificing all of the benefits of caching. </span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;"><strong>no-store</strong> &mdash; instructs caches not to keep a copy of the representation under any conditions. </span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;"><strong>must-revalidate</strong> &mdash; tells caches that they must obey any freshness information you give them about a representation. HTTP allows caches to serve stale representations under special conditions; by specifying this header, you&rsquo;re telling the cache that you want it to strictly follow your rules. </span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;"><strong>proxy-revalidate</strong> &mdash; similar to must-revalidate, except that it only applies to proxy caches.</span></span></p>
<p><span style="font-family: Calibri;">&nbsp;</span></p>
<p>另外，对于<span style="font-family: Calibri;">Windows Azure Storage</span>中存储的网站静态资源，还有一个很好的功能可以打开：</p>
<p><a href="https://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.blob.blobproperties.contentencoding.aspx"><span style="color: #0563c1; font-family: Calibri;">BlobProperties.ContentEncoding</span></a></p>
<p>该功能的作用是指定该文件的编码方式，如较大的静态文件，可以在本地用代码的方式批量压缩成<span style="font-family: Calibri;">gzip</span>格式，然后使用代码逐一上传到<span style="font-family: Calibri;">Azure Storage</span>中，如示例代码：<a href="https://msdn.microsoft.com/en-us/library/azure/hh225342.aspx"><span style="color: #0563c1; font-family: Calibri;">https://msdn.microsoft.com/en-us/library/azure/hh225342.aspx</span></a>。</p>
<p>上传过程中，需要设定目标资源的<span style="font-family: Calibri;">ContentEncoding</span>属性，如下代码：</p>
<p><span style="font-family: Calibri;">// Set the CacheControl property.</span></p>
<p><span style="font-family: Calibri; background-color: #ffff00;">blob.Properties.ContentEncoding = "gzip";</span></p>
<p><span style="font-family: Calibri; background-color: #ffff00;">blob.SetProperties();</span></p>
<p>这样设定以后，浏览器访问该<span style="font-family: Calibri;">gzip</span>格式的静态资源（如图片、<span style="font-family: Calibri;">css</span>、<span style="font-family: Calibri;">js</span>文件）时，会自动解压缩，然后显示到网页中。该过程中，由于目标文件被压缩了，网页加载速度自然就加快了。</p>
<p><span style="font-family: Calibri;">&nbsp;</span></p>
<p>因此，对于<span style="font-family: Calibri;">Azure</span>网站中静态资源的访问性能优化，可以使用以下思路：</p>
<ul>
<li>将静态文件存储在Azure Storage中。</li>
<li>开启CDN服务，指向目标Azure Storage。</li>
<li>在网页中使用基于CDN的资源地址。</li>
<li>对Storage中存储的网站静态资源，开启client cache属性。</li>
<li>对上传到Storage中的网站静态资源，先压缩成gzip，然后上传，并指定其contentencoding属性为gzip。</li>
<li>对于较大的图片，可以考虑生成指纹图片，网站加载时仅加载较小分辨率的指纹图片，进一步访问该图片时才返回原始图片。</li>
</ul>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>2 known issues in Windows Azure Diagnostics</title>
      <link>https://docs.microsoft.com/archive/blogs/jianwu/2-known-issues-in-windows-azure-diagnostics</link>
      <pubDate>Thu, 05 Feb 2015 19:56:00 GMT</pubDate>
      <dc:creator><![CDATA[JIAN WU - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/jianwu/2015/02/05/2-known-issues-in-windows-azure-diagnostics/</guid>
      <description><![CDATA[As you know, Windows Azure Diagnostics enables you to collect diagnostic data from an application...]]></description>
      <content:encoded><![CDATA[<p>As you know, Windows Azure Diagnostics enables you to collect diagnostic data from an application running in Windows Azure. You can use diagnostic data for debugging and troubleshooting, measuring performance, monitoring resource usage, traffic analysis and capacity planning, and auditing. After the diagnostic data is collected it can be transferred to a Windows Azure storage account for persistence. Transfers can either be scheduled or on-demand.</p>
<p>More reference about Windows Azure Diagnostics are here:</p>
<p>Overview: <a href="https://msdn.microsoft.com/en-us/library/azure/gg433048.aspx"><span style="color: #0563c1;">https://msdn.microsoft.com/en-us/library/azure/gg433048.aspx</span></a></p>
<p>Practice: <a href="https://blogs.msdn.com/b/jianwu/archive/2014/08/15/azure-paas-4.aspx"><span style="color: #0563c1;">https://blogs.msdn.com/b/jianwu/archive/2014/08/15/azure-paas-4.aspx</span></a></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">In this blog, 2 known issues in WAD are summarized with quick workarounds, hopes it will help get better WAD and better cloud service. Special thanks to <strong>Peter Thompson</strong> reporting this issue and assist us to fix.</span></span></p>
<p><span style="font-size: large; background-color: #ffff00;"><strong><span style="font-family: Calibri;">Issue 1:</span></strong></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">After upgrading Azure SDK to the latest version 2.5, the IIS logs cannot be transferred to Azure Storage account with the following settings in WAD GUI configuration page.</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/6283.222.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/6283.222.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/6283.222.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/6283.222.png" alt="" border="0" /></a></span></span></p>
<ul>
<li><span style="font-size: small;"><span style="font-family: Calibri;"><strong>Cause:</strong> </span></span></li>
</ul>
<p><span style="font-size: small;"><span style="font-family: Calibri;">When WAD is generating the WAD configure it gets the IIS log directory from the .NET service manager. It&rsquo;s very likely that WAD generates its configure just before a new web site is created. In this scenario the configure becomes stale and uses <strong>default web site&rsquo;s log settings</strong>. However the default web site&rsquo;s log settings is not the actual place where the IIS logs will be put. </span></span></p>
<p><strong><span style="font-size: small;"><span style="font-family: Calibri;">Defualt web site&rsquo;s log settings:</span></span></strong></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&lt;FileWatchItem dontUseNPartitionSpread="true" compressionType="none" eventName="DirectoriesTable" directoryQuotaInMB="6500" lastChangeOffsetInSeconds="300" removeEmptyDirectories="false" container="iiscontainer"&gt;</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Directory&gt;"D:\inetpub\logs\LogFiles"&lt;/Directory&gt;</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/FileWatchItem&gt;</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;FileWatchItem dontUseNPartitionSpread="true" compressionType="none" eventName="DirectoriesTable" directoryQuotaInMB="6500" lastChangeOffsetInSeconds="300" removeEmptyDirectories="false" container="failedrequestlogs-container"&gt;</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Directory&gt;"D:\inetpub\logs\FailedReqLogFiles"&lt;/Directory&gt;</span></span></p>
<p><strong><span style="font-size: small;"><span style="font-family: Calibri;">Actual path the web site&rsquo;s logs are saved (one example:):</span></span></strong></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C:\Resources\Directory\Test.WebRole1.DiagnosticStore\LogFiles\W3SVC1</span></span></p>
<p>&nbsp;</p>
<ul>
<li><strong><span style="font-size: small;"><span style="font-family: Calibri;">Hotfix:</span></span></strong></li>
</ul>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; This issue will be addressed in the next release in SDK3.0 in March or April.</span></span></p>
<p>&nbsp;</p>
<ul>
<li><strong><span style="font-size: small;"><span style="font-family: Calibri;">Workaround:</span></span></strong></li>
</ul>
<p><strong><span style="font-family: Calibri; font-size: small;">1.</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong><strong><span style="font-family: Calibri;"><span style="font-size: small;">Restart WAD agent</span></span></strong></p>
<p><span style="font-family: Calibri;"><span style="font-size: small;">All we need to resolve this issue is to restart the WAD agent which will redirect the monitoring folder to the correct one. You can perform either of the following to restart WAD agent.</span></span></p>
<ul>
<li><span style="font-size: small;">&middot;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: Calibri;"><span style="font-size: small;">REBOOT the role instances to force the Diagnosticsplugin.exe restarted</span></span></li>
<li><span style="font-size: small;">&middot;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: small;"><span style="font-family: Calibri;">Send a WAD update via Server Explore in Visual Studio to force WAD agent being restarted</span></span></li>
</ul>
<p><span style="font-size: small;"><span style="font-family: Calibri;"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/4617.333.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/4617.333.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/4617.333.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/4617.333.png" alt="" border="0" /></a></span></span></p>
<p><strong><span style="font-family: Calibri; font-size: small;">2.</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong><span style="font-size: small;"><span style="font-family: Calibri;"><strong>Use WAD custom directory logging as a workaround</strong></span></span></p>
<p><span style="font-family: Calibri; font-size: small;">Azure WAD automatically maps </span>wad-iis-logfiles <span style="font-family: Calibri; font-size: small;">and </span>wad-failedrequestlogs <span style="font-size: small;"><span style="font-family: Calibri;">containers to special folders which exist in web roles.&nbsp;In addition, WAD provides <strong>custom directory logging</strong> shown as below. Since we are intending to transfer IIS logs to azure storage account, I specify the absolute log path to <strong>&ldquo;\Resources\Directory</strong>&rdquo; where the IIS logs reside. &nbsp;The exact directory path for IIS logs is &ldquo;<strong>C:\Resources\Directory\8723df3598a241688eb39a1cee727639.WebRole1.DiagnosticStore\LogFiles\Web\W3SVC1273337584</strong>&rdquo;, and I take its <strong>parent folder</strong> for simplicity as I don&rsquo;t know the &nbsp;deployment ID before the cloud service being deployed.</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/8688.222.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/8688.222.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/8688.222.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/8688.222.png" alt="" border="0" /></a></span></span></p>
<p><strong><span style="font-size: small;"><span style="font-family: Calibri;">Steps to configure custom logging:</span></span></strong></p>
<p><strong><span style="font-family: Calibri; font-size: small;">1.</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong><span style="font-size: small;"><span style="font-family: Calibri;">Configure via WAD GUI as shown above&nbsp;&nbsp;&nbsp; </span></span><strong><span style="font-family: Calibri; font-size: small;">2.</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong><span style="font-size: small;"><span style="font-family: Calibri;">Add the following lines to .wadcfgx file directly<strong></strong></span></span></p>
<p>&lt;Directories scheduledTransferPeriod="PT1M"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;IISLogs containerName="wad-iis-logfiles" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;FailedRequestLogs containerName="wad-failedrequestlogs" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;DataSources&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;DirectoryConfiguration containerName="wad-custom1"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Absolute path="\Resources\Directory" expandEnvironment="false" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/DirectoryConfiguration&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/DataSources&gt;</p>
<p>&lt;/Directories&gt;<strong></strong></p>
<p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></p>
<p><span style="font-size: large; background-color: #ffff00;"><strong><span style="font-family: Calibri;">Issue 2:</span></strong></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">In elder version of Azure SDK like 2.2, newly deployed cloud service worked fine with WAD at beginning, but after some time, customers might observe that certain WAD logs like performance counters and IIS logs were no longer transferred to target storage, though rebooting or reimaging the role instances could resolve problem quickly, sometime later after the rebooting/reimaging, the problem would reoccur again.</span></span></p>
<ul>
<li><span style="font-size: small;"><span style="font-family: Calibri;">Root cause:</span></span></li>
</ul>
<p><span style="font-size: small;"><span style="font-family: Calibri;">In Azure elder version of SDKs, The total size of all WAD data should be at least 500MB less than the size limit of diagnostics folder <strong><em>C:\Resources\Directory\[deploymentid].[rolename].DiagnosticStore</em></strong>, </span></span></p>
<p><span style="font-family: Calibri; font-size: small;">By default, the size of the diagnostics folder is 4096MB, the max size of all WAD data can be 4096MB, that means, if in your WAD settings, the sum of *</span>QuotaInMB <span style="font-size: small;"><span style="font-family: Calibri;">exceeded 4GB, then there should be less than 500MB between the gap of WAD data and folder size of <strong><em>C:\Resources\Directory\[deploymentid].[rolename].DiagnosticStore</em></strong>, the size gap is used for temporary purpose in WAD, hence if there was no enough space for this temporary use, WAD will stop transferring data to target storage after some time.</span></span></p>
<p><span style="font-family: Calibri; font-size: small;">&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/07306.111.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/07306.111.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/07306.111.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/07306.111.png" alt="" border="0" /></a></span></p>
<ul>
<li><strong><span style="font-size: small;"><span style="font-family: Calibri;">Solution &amp; workaround:</span></span></strong></li>
</ul>
<p><span style="font-family: Calibri;">1.</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: small;"><span style="font-family: Calibri;">Set local resource configuration in <strong>servicedefinition.csdef</strong> file as below: (this is to set the size limit of <strong><em>C:\Resources\Directory\[deploymentid].[rolename].DiagnosticStore to 6GB</em></strong>)</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&hellip;.</span></span></p>
<p><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp; &lt;/Imports&gt;</span></p>
<p><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp; &lt;LocalResources&gt;</span></p>
<p><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;LocalStorage name="DiagnosticStore" sizeInMB="6144" cleanOnRoleRecycle="false"/&gt;</span></p>
<p><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp; &lt;/LocalResources&gt;</span></p>
<p><span style="font-family: Calibri;">&nbsp; &lt;/WebRole&gt;</span></p>
<p><span style="font-family: Calibri;">&lt;/ServiceDefinition&gt;</span></p>
<p>&nbsp;</p>
<p><span style="font-family: Calibri; font-size: small;">2.</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: small;"><span style="font-family: Calibri;">Adjust the buffer size for each WAD item to a proper space, like 512MB, and make sure the remaining space is enough for temporary use, like no less than 1 GB. See a sample screenshot: </span></span></p>
<p><br /><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/2821.222.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/2821.222.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/2821.222.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/2821.222.png" alt="" border="0" /></a></p>
<p>&nbsp;3.&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: Calibri; font-size: small;">Debug your project first in local emulator, while there is no error, deploy the project to empty staging slot of Azure cloud, and if everything is working fine there, then swap it to production.</span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;"><strong><em>Temporary workaround:</em></strong>&nbsp; if you are not able to do the setting changes as above and redeploy right now due to product schedule, you can RDP into the current deployment VMs and then delete the existing log data in &ldquo;<strong><em>C:\Resources\Directory\[deploymentid].[rolename].DiagnosticStore</em></strong>&rdquo;, that will make diagnostic work fine for you for some time again. But that is just a temporary workaround like VM reboot/reimage, because if size of new log comes to the limit of those 2 settings, the problem may happen again.</span></span></p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>One reference architecture in PaaS cloud solution.</title>
      <link>https://docs.microsoft.com/archive/blogs/jianwu/one-reference-architecture-in-paas-cloud-solution</link>
      <pubDate>Sat, 31 Jan 2015 03:59:00 GMT</pubDate>
      <dc:creator><![CDATA[JIAN WU - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/jianwu/2015/01/31/one-reference-architecture-in-paas-cloud-solution/</guid>
      <description><![CDATA[It is from projects to demonstrate cloud energy and&nbsp;relieve big headaches in traditional...]]></description>
      <content:encoded><![CDATA[<p>It is from projects to demonstrate cloud energy and&nbsp;relieve big headaches in traditional solutions, the&nbsp;architecture can be realized&nbsp;smartly with public cloud while keep connected with local network,&nbsp;and the reference may help in Windows Azure, Amazon Web Service and more cloud platforms.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/1643.con_img.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/1643.con_5F00_img.jpg"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/1643.con_img.jpg" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/1643.con_5F00_img.jpg" alt="" border="0" /></a></p>
<p><span style="font-family: Calibri;"><span style="font-size: small;">Highlights to demonstrate:</span></span></p>
<ul>
<li>&nbsp;<span style="font-family: Calibri;"><span style="font-size: small;">Apply Microsoft cloud to grant traditional solution capability to process sudden dramatic increase requests or huge incoming traffic in a very smart way</span></span></li>
<li>&nbsp;<span style="font-family: Calibri;"><span style="font-size: small;">Able to save more than 50% system cost</span></span></li>
<li>&nbsp;<span style="font-family: Calibri;"><span style="font-size: small;">On premise solution can be integrated with or migrated to cloud services, leading to a more powerful and decoupled solution</span></span></li>
<li>&nbsp;<span style="font-family: Calibri;"><span style="font-size: small;">Numerous great features in Microsoft Azure accelerates development cycle and make online solutions easy to go with performance guarantee</span></span></li>
<li>&nbsp;<span style="font-family: Calibri; font-size: small;">Popular 3<sup>rd</sup> party technologies can be well applied as they were</span></li>
</ul>
<p><span style="font-family: Calibri;"><span style="font-size: small;">Key features involved:</span></span></p>
<ul>
<li><span style="font-family: Calibri;"><span style="font-size: small;">Classic programing pattern: multi tiers design &amp; integration, security enhancement, performance optimization.</span></span></li>
<li><span style="font-family: Calibri;"><span style="font-size: small;">Auto scaling on Azure: flexible cloud technology to respond changing business traffic.</span></span></li>
<li><span style="font-family: Calibri;"><span style="font-size: small;">Virtual network: extend on premise network &amp; machine to cloud, keep traditional software solution still working for Azure.</span></span></li>
<li><span style="font-family: Calibri;"><span style="font-size: small;">WAD: powerful monitoring and diagnostics from Windows Azure.</span></span></li>
<li><span style="font-family: Calibri;"><span style="font-size: small;">ACS: let customer benefit more from existing identity providers and Azure cloud, then focus more on business logic.</span></span></li>
<li><span style="font-family: Calibri;"><span style="font-size: small;">Service Bus: solutions for those who doesn&rsquo;t have public endpoint but needs real time communication.</span></span></li>
<li><span style="font-family: Calibri;"><span style="font-size: small;">Cache Service: Improve performance both for Azure solution and on premise application.</span></span></li>
<li><span style="font-family: Calibri;"><span style="font-size: small;">SQL Azure: Powerful Relation Database Engine on cloud, provide&nbsp;reliable and secure structured storage for cloud apps and local apps.&nbsp;</span></span></li>
<li><span style="font-family: Calibri; font-size: small;">Others: easy management and high efficiency of Windows Azure, good support on open tech and third party plugins.</span></li>
</ul>
<p><span style="font-size: small;"><span style="font-family: Calibri;">Brief Workflow:</span></span></p>
<ol>
<li><span style="font-size: small;"><span style="font-family: Calibri;">Load test generates web requests to web role.</span></span></li>
<li><span style="font-size: small;"><span style="font-family: Calibri;">Web role handles incoming traffic initially and adds the corresponding message in target storage queue.</span></span></li>
<li><span style="font-size: small;"><span style="font-family: Calibri;">Worker role picks up messages from storage queue, and process them one by one.</span></span></li>
<li><span style="font-size: small;"><span style="font-family: Calibri;">When worker role process a message, it needs some important information from on premise server.</span></span></li>
<li><span style="font-family: Calibri; font-size: small;">During the whole workflow, end user can trace the status of his request from web role</span></li>
</ol>
<p><br />Reference: <a href="https://www.doingcloud.com/index.php/2016/01/29/one-reference-architecture-in-azure-paas-solution/">https://www.doingcloud.com/index.php/2016/01/29/one-reference-architecture-in-azure-paas-solution/</a></p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>Expose SSL service to multi domains from the same cloud service</title>
      <link>https://docs.microsoft.com/archive/blogs/jianwu/expose-ssl-service-to-multi-domains-from-the-same-cloud-service</link>
      <pubDate>Wed, 17 Dec 2014 01:19:00 GMT</pubDate>
      <dc:creator><![CDATA[JIAN WU - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/jianwu/2014/12/17/expose-ssl-service-to-multi-domains-from-the-same-cloud-service/</guid>
      <description><![CDATA[When designing and deploying web services to Azure with Azure cloud service, it is very common to...]]></description>
      <content:encoded><![CDATA[<p>When designing and deploying web services to Azure with Azure cloud service, it is very common to apply SSL to secure web access and protect the data transfer, regarding how to enable SSL in cloud service and make custom domain work instead of default cloudapp.net, here are some good tutorials:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. <a href="https://azure.microsoft.com/en-us/documentation/articles/cloud-services-configure-ssl-certificate/">https://azure.microsoft.com/en-us/documentation/articles/cloud-services-configure-ssl-certificate/</a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2. <a href="https://blogs.msdn.com/b/avkashchauhan/archive/2011/03/28/complete-solution-adding-ssl-certificate-with-windows-azure-application.aspx">https://blogs.msdn.com/b/avkashchauhan/archive/2011/03/28/complete-solution-adding-ssl-certificate-with-windows-azure-application.aspx</a></p>
<p>in this implementation, if your certificate is not in pfx format but in others like p7b, you can follow this article <a href="https://stackoverflow.com/questions/6708223/convert-p7b-to-pfx-for-azure">https://stackoverflow.com/questions/6708223/convert-p7b-to-pfx-for-azure</a> to get the right pfx formated certificate to move with https on Azure.</p>
<p>if you certificate is pfx, but after you upload it to the portal, you notice 2 or more certificates added there, you can check the solution here to fix: <a href="https://blog.michaelchi.net/2014/12/cloud-servicechained-certificatessl.html">https://blog.michaelchi.net/2014/12/cloud-servicechained-certificatessl.html</a></p>
<p>in this post, i am summarying a resolved issue in my job, which was to enable multi SSL in the same cloud service. (<em>a special thanks to <strong>John Ellis</strong>, whom I worked on this topic.</em>&nbsp;)</p>
<p>for exampel, the cloud service is <a href="https://test.cloudapp.net">https://test.cloudapp.net</a> and is listening at port 80 and 443, now the goal is to set the cloud service to be accessible at <a href="https://www.test1.com">https://www.test1.com</a> and <a href="https://www.test2.com">https://www.test2.com</a></p>
<p>&nbsp;</p>
<p><span style="font-size: medium;"><strong><em>&gt;Analysis:</em></strong></span><strong><em></em></strong></p>
<p>In lower version of IIS, such as IIS 6 and IIS 7, it is not supported to enable multi SSL bindings for a website.</p>
<p><span style="font-family: arial,helvetica,sans-serif;">Until IIS 7.5, the major limitation of IIS is that <strong>IIS will allow you to bind only one site for one IP: Port combination using an SSL certificate</strong>.&nbsp; If you try to bind a second site on the IP address to the same certificate, IIS will give you an error when starting the site up stating that there is a conflict. </span></p>
<p><span style="font-family: arial,helvetica,sans-serif;">To know why it doesn&rsquo;t work in HTTPS lets understand the SSL handshake briefly.</span></p>
<p><span style="font-family: arial,helvetica,sans-serif;">1. Client - &gt; (SSL Handshake) - &gt; &ldquo; Hello, I support XYZ algorithm for encryption&rdquo; </span></p>
<p><span style="font-family: arial,helvetica,sans-serif;">2. Server -&gt; (SSL Handshake) -&gt; &ldquo;Hi there, Okay so here is my public certificate. Let&rsquo;s use algorithm X&rdquo;</span></p>
<p><span style="font-family: arial,helvetica,sans-serif;">3. Client -&gt; (SSL Handshake)-&gt; &ldquo;Great we can use that&rdquo;</span></p>
<p><span style="font-family: arial,helvetica,sans-serif;">4. Client -&gt; (In Encrypted format)-&gt; &ldquo;HTTP Request&rdquo;</span></p>
<p><span style="font-family: arial,helvetica,sans-serif;">5. Server -&gt; (In Encrypted format)-&gt; &ldquo;HTTP Response&rdquo;</span></p>
<p><span style="font-family: arial,helvetica,sans-serif;">&lt;And now cycle continues&gt;</span></p>
<p><span style="font-family: arial,helvetica,sans-serif;">Now let&rsquo;s say hypothetically, you have set two sites on same IP-address and port and different host headers and you set two different certificates on both of them.</span></p>
<p><span style="font-family: arial,helvetica,sans-serif;">Look at the steps in SSL Handshake, Client sends the HTTP Request only in Step 4. That means Server doesn&rsquo;t know what host header HTTP request is referring to until step 4. So at Step 2, Server has only IP-Address and Port information with it, so how can server figure out which certificate it needs to send to the Client as you have bind two certificates to same IP-Address and port.</span></p>
<p><span style="font-family: arial,helvetica,sans-serif;">When a request comes to HTTP.SYS layer, the HTTP.SYS reads the site configuration, including the certificate used to encrypt/decrypt the data. The host name is encrypted in SSL Blob that the client sends. However, IIS needs to know the host name in order to get the right certificate. Without the host name IIS cannot get to the correct site. As IIS is not able to get to the correct site so it cannot get the right certificate to decrypt the SSL blob to get the host name. This is the classic Chicken and Egg problem. We are turning into circles with no way out.</span></p>
<p><span style="font-family: arial,helvetica,sans-serif;">This is the precise reason; <strong>HTTP server can only allow one site per IP-Address: Port combination for HTTPS browsing. If you need to bind another site over HTTPS then you need to get either a different IP-Address or bind the site to a different port.</strong></span></p>
<p><span style="font-family: Times New Roman; font-size: small;">Reference: </span><a href="https://blogs.msdn.com/b/varunm/archive/2013/06/18/bind-multiple-sites-on-same-ip-address-and-port-in-ssl.aspx"><span style="color: #0000ff; font-family: Times New Roman; font-size: small;">https://blogs.msdn.com/b/varunm/archive/2013/06/18/bind-multiple-sites-on-same-ip-address-and-port-in-ssl.aspx</span></a></p>
<p>&nbsp;</p>
<p>However, IIS8 has a new functionality called Server Name Indication (SNI) to overcome this problem.</p>
<p><strong>Problem:</strong> As more e-commerce sites come on line and more businesses are storing and sharing sensitive documents online, the ability to host and scale secure sites are increasingly more important. Prior to Windows Server 2012, there were a couple of challenges when it comes to hosting secure sites:</p>
<ul>
<li>SSL Scalability: In a multi-tenanted environment, such as a shared hosting, there is a limitation as to how many secure sites can be hosted on Windows Server, resulting in a low site-density.</li>
<li>IPv4 scarcity: Because the network end-point can only be identified with IP:Port binding, where tenants request to use the standard SSL port, 443, <strong>hosting a secure site often means offering a dedicated IP address per tenant</strong>.</li>
</ul>
<p><strong>Solution:</strong> On Windows Server 2012, IIS supports Server Name Indication (SNI), which is a TLS extension to include a virtual domain as a part of SSL negotiation. What this effectively means is that the virtual domain name, or a hostname, can now be used to identify the network end point. In addition, a highly scalable WebHosting store has been created to complement SNI. The result is that the secure site density is much higher on Windows Server 2012 and it is achieved with just one IP address.</p>
<p>&nbsp;</p>
<p><span style="font-size: medium;"><strong><em>&gt;How to expose multi SSL services from the same web role</em></strong></span></p>
<p>1. Adjust your <strong>service configuration file</strong> to apply higher version of OS, which has IIS 8 in it. see below, apply <span style="background-color: #ffff00;">osFamily="4"</span> in your service configuration file.</p>
<p>&lt;?xml version="1.0" encoding="utf-8"?&gt;</p>
<p>&lt;ServiceConfiguration serviceName="WindowsAzure1" xmlns="<a href="https://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration"><span style="color: #0000ff;">https://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration</span></a>" <span style="background-color: #ffff00;">osFamily="4"</span> osVersion="*" schemaVersion="2013-03.2.0"&gt;</p>
<p>&nbsp; &lt;Role name="WebRole1"&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;Instances count="1" /&gt;</p>
<p>&lt;ConfigurationSettings&gt;</p>
<p>&hellip;</p>
<p>More details on Azure OS family and its compatibility with SDK: <a href="https://msdn.microsoft.com/en-us/library/azure/ee924680.aspx"><span style="color: #0000ff;">https://msdn.microsoft.com/en-us/library/azure/ee924680.aspx</span></a></p>
<p>2. Add certificate into your project and add endpoints as below. (for the certification specified in https endpoint, that can be any one from the 2 certificates as you want).</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/5315.111.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/5315.111.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/5315.111.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/5315.111.png" alt="" border="0" /></a></p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/2538.222.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/2538.222.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/2538.222.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/2538.222.png" alt="" border="0" /></a></p>
<p>3. Adjust service definition file with high lightened below.</p>
<p>&lt;?xml version="1.0" encoding="utf-8"?&gt;</p>
<p>&lt;ServiceDefinition name="WindowsAzure1" xmlns="<a href="https://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition"><span style="color: #0000ff;">https://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition</span></a>" schemaVersion="2013-03.2.0"&gt;</p>
<p>&nbsp; &lt;WebRole name="WebRole1" vmsize="Small"&gt;</p>
<p>&nbsp;&nbsp;<span style="background-color: #ffff00;">&nbsp; &lt;Runtime executionContext="elevated" /&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp; &lt;Sites&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Site name="Web"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Bindings&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Binding name="Endpoint1" endpointName="Endpoint1" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="background-color: #ffff00;">&lt;!--&lt;Binding name="Endpoint2" endpointName="Endpoint2"/&gt;--&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Bindings&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Site&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;/Sites&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;Endpoints&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;InputEndpoint name="Endpoint1" protocol="http" port="80" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;InputEndpoint name="Endpoint2" protocol="https" port="443" certificate="Certificate2" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;/Endpoints&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;Imports&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Import moduleName="Diagnostics" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Import moduleName="RemoteAccess" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Import moduleName="RemoteForwarder" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;/Imports&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;LocalResources&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;LocalStorage name="DiagnosticStore" sizeInMB="6144" cleanOnRoleRecycle="false"/&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;/LocalResources&gt;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&lt;Certificates&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Certificate name="Certificate1" storeLocation="LocalMachine" storeName="My" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Certificate name="Certificate2" storeLocation="LocalMachine" storeName="My" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;/Certificates&gt;</p>
<p>&nbsp; &lt;/WebRole&gt;</p>
<p>&lt;/ServiceDefinition&gt;</p>
<p>&hellip;&hellip;</p>
<p>4. Add your target pfx SSL certificates into the web role project and set their property as &ldquo;copy always&rdquo;</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/4087.333.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/4087.333.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/4087.333.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/4087.333.png" alt="" border="0" /></a></p>
<p>5. Right click your web project like WebRole1 in my test and install package from Nuget as below</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/0880.111.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/0880.111.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/0880.111.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/0880.111.png" alt="" border="0" /></a></p>
<p>6. Add codes below in your WebRole.cs, and replace the key information with yours.</p>
<p>using System;</p>
<p>using System.Collections.Generic;</p>
<p>using System.Linq;</p>
<p>using Microsoft.WindowsAzure;</p>
<p>using Microsoft.WindowsAzure.Diagnostics;</p>
<p>using Microsoft.WindowsAzure.ServiceRuntime;</p>
<p>using System.Security.Cryptography.X509Certificates;</p>
<p>using Microsoft.Web.Administration;</p>
<p>using System.Net;</p>
<p>using System.Net.Sockets;</p>
<p>using System.Diagnostics;</p>
<p>&nbsp;</p>
<p>namespace WebRole1</p>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp; public class WebRole : RoleEntryPoint</p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public override bool OnStart()</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // For information on handling configuration changes</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // see the MSDN topic at <a href="https://go.microsoft.com/fwlink/?LinkId=166357"><span style="color: #0000ff;">https://go.microsoft.com/fwlink/?LinkId=166357</span></a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Threading.Thread.Sleep(40000);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var newCert = new X509Certificate2<span style="background-color: #ffff00;">("test1.com-1.pfx", "password",</span> X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var readWriteMyStore = new X509Store(StoreName.My, StoreLocation.LocalMachine);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; readWriteMyStore.Open(OpenFlags.ReadWrite);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; readWriteMyStore.Add(newCert);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; readWriteMyStore.Close();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.IO.File.AppendAllText("log.txt", "\r\n cert 1 is installed. @" + DateTime.Now.ToString());</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var serverManager = new ServerManager();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var site = serverManager.Sites[0];</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var binding = <span style="background-color: #ffff00;">site.Bindings.Add(":443:www.test1.com", newCert.GetCertHash(), "My");</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; binding.SetAttributeValue("sslFlags", 1); //enables the SNI</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; serverManager.CommitChanges();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.IO.File.AppendAllText("log.txt", "\r\n binding 1 is added. @" + DateTime.Now.ToString());</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var newCert2 = new X509Certificate2<span style="background-color: #ffff00;">("test2.com-1.pfx", "password",</span> X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var readWriteMyStore2 = new X509Store(StoreName.My, StoreLocation.LocalMachine);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; readWriteMyStore2.Open(OpenFlags.ReadWrite);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; readWriteMyStore2.Add(newCert2);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; readWriteMyStore2.Close();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.IO.File.AppendAllText("log.txt", "\r\n cert 2 is installed. @" + DateTime.Now.ToString());</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var serverManager2 = new ServerManager();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var site2 = serverManager2.Sites[0];</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var binding2 = <span style="background-color: #ffff00;">site2.Bindings.Add(":443:www.test2.com", newCert2.GetCertHash(), "My");</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; binding2.SetAttributeValue("sslFlags", 1); //enables the SNI</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; serverManager2.CommitChanges();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.IO.File.AppendAllText("log.txt", "\r\n binding 2 is added. @" + DateTime.Now.ToString());</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="background-color: #ffff00;">RemoveDefaultIISSSL();</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception ee)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception ex)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.IO.File.AppendAllText("log.txt", "\r\n " + ex.Message + " @" + DateTime.Now.ToString());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return base.OnStart();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public <span style="background-color: #ffff00;">bool RemoveDefaultIISSSL()</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.IO.File.AppendAllText("log.txt", "\r\n start to get local ip. @" + DateTime.Now.ToString());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPHostEntry host;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string localIP = "127.0.0.1";</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; host = Dns.GetHostEntry(Dns.GetHostName());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (IPAddress ip in host.AddressList)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (ip.AddressFamily == AddressFamily.InterNetwork)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; localIP = ip.ToString();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string cmd = <span style="background-color: #ffff00;">string.Format("netsh http delete sslcert ipport={0}:443",localIP);</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.IO.File.AppendAllText("log.txt", "\r\n local ip is got. @" + cmd + " @"+ DateTime.Now.ToString());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Process p = new Process();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.StartInfo.FileName = <span style="background-color: #ffff00;">@"d:\Windows\System32\cmd.exe";</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.StartInfo.UseShellExecute = false;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.StartInfo.RedirectStandardInput = true;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.StartInfo.RedirectStandardOutput = false;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.StartInfo.RedirectStandardError = true;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.StartInfo.CreateNoWindow = true;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string Parameter = cmd;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.Start();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.StandardInput.WriteLine(cmd);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.StandardInput.WriteLine("exit");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.StandardInput.WriteLine("exit");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.WaitForExit();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.Close();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception e)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.IO.File.AppendAllText("log.txt", "\r\n " + e.Message + " @" + DateTime.Now.ToString());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p>【update in step 6】:</p>
<p>After double checking the issue and deep dive into IIS internal, I noticed a default SSL setting for IIS that impacted multi SSL bindings, so I updated the code as above and have verified it in sample cloud service.</p>
<p>7. Rebuild the project in local emulator. Then deploy it to azure cloud.</p>
<p>8.Verification: after deploying it to cloud, by Remote access, you can confirm the website is configured as below, that worked as expected.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/6204.222.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/6204.222.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/6204.222.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/6204.222.png" alt="" border="0" /></a></p>
<p>&nbsp;</p>
<ul>
<li>My testing deployment is here: <a href="https://9fdc9bd78f7b447580d154ab9e18fb6c.cloudapp.net/"><span style="color: #0000ff;">https://9fdc9bd78f7b447580d154ab9e18fb6c.cloudapp.net/</span></a></li>
<li>I changed my local hosts file in C:\Windows\System32\drivers\etc by adding 2 lines below, IP 104.40.95.228 is the public IP of <a href="https://9fdc9bd78f7b447580d154ab9e18fb6c.cloudapp.net/"><span style="color: #0000ff;">https://9fdc9bd78f7b447580d154ab9e18fb6c.cloudapp.net/</span></a>.</li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # localhost name resolution is handled within DNS itself.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 127.0.0.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; localhost</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; localhost</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="background-color: #ffff00;">104.40.95.228&nbsp;&nbsp; <a href="https://www.test1.com/"><span style="color: #0000ff; background-color: #ffff00;">www.test1.com</span></a></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="background-color: #ffff00;">104.40.95.228&nbsp;&nbsp; <a href="https://www.test2.com/"><span style="color: #0000ff; background-color: #ffff00;">www.test2.com</span></a></span></p>
<ul>
<li>In my local machine, I could access both <a href="https://www.test1.com/">https://www.test1.com</a> and <a href="https://www.test2.com/">https://www.test2.com</a>, they worked fine with the right certificates.</li>
</ul>
<p>More reference:</p>
<p>Appcmd command to add SSL binding: <a href="https://toastergremlin.com/?p=308">https://toastergremlin.com/?p=308</a></p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>Restrict Remote Access to Cloud VMs</title>
      <link>https://docs.microsoft.com/archive/blogs/jianwu/restrict-remote-access-to-cloud-vms</link>
      <pubDate>Wed, 03 Dec 2014 22:22:00 GMT</pubDate>
      <dc:creator><![CDATA[JIAN WU - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/jianwu/2014/12/03/restrict-remote-access-to-cloud-vms/</guid>
      <description><![CDATA[Recently we are working with a project intending to restrict the RDP access of Azure role (worker...]]></description>
      <content:encoded><![CDATA[<p><span style="font-family: Calibri; font-size: medium;">Recently we are working with a project intending to restrict the RDP access of Azure role (worker role/ web role) instance to some specific IP address (a special thanks to <em><strong>Ugo Meex</strong></em>). The tricky thing we should be careful is there is a port mapping for RDP access between public port (3889) and internal port (20000) for role instances. So instead of applying firewall rule restrictions to public port 3389 we need to apply it to internal port 20000. Please find more details below.</span></p>
<p><span style="font-size: medium;"><span style="font-family: Calibri;">About setting up remote access in Azure, please refer to </span><a href="https://msdn.microsoft.com/library/azure/hh124107.aspx/"><span style="color: #0563c1; font-family: Calibri;">https://msdn.microsoft.com/library/azure/hh124107.aspx/</span></a></span></p>
<p><span style="font-size: large;"><strong><span style="font-family: Calibri;">Requirement:</span></strong></span></p>
<p><span style="font-family: Calibri; font-size: medium;">Restrict RDP access to some specific IP address in Azure Role instances.</span></p>
<p><span style="font-size: large;"><strong><span style="font-family: Calibri;">Background: How Windows Azure RemoteForwarder works?</span></strong></span></p>
<p><span style="font-family: Calibri; font-size: medium;">The remote desktop feature is comprised of two imports: RemoteAccess and RemoteForwarder. The RemoteForwarder is working as follows:</span></p>
<ul>
<li><span style="font-family: Calibri; font-size: medium;">RemoteForwarder is imported on a single role and takes care of dealing with the fact that Windows Azure only provides load-balanced input endpoints.</span></li>
<li><span style="font-family: Calibri; font-size: medium;">The forwarder runs on every instance of the role in which it is imported and listens on port 3389 for remote desktop connections.</span></li>
<li><span style="font-family: Calibri; font-size: medium;">When a connection is received, it searches the first packet for a load balancing cookie which you can see if you open the Portal-supplied .rdp file in a text editor.</span></li>
<li><span style="font-family: Calibri; font-size: medium;">Using this cookie data it then opens a connection internally to the desired instance and forwards all traffic to that instance.</span></li>
</ul>
<p><span style="font-family: Calibri; font-size: medium;">So when we set up the RDP restrict firewall rule, instead on apply the restriction on public port 3389 we need to apply it to internal port 20000. By default the endpoint mapping between public and private for RDP access is 3889 to 20000, which you can find in the service config file located in C:/Config of your cloud VM&nbsp;.</span></p>
<p><span style="font-family: Calibri; font-size: medium;">Here is a default firewall initialization in a cloud service VM:</span></p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/0045.111.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/0045.111.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/0045.111.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/0045.111.png" alt="" border="0" /></a></p>
<p><span style="font-family: Calibri; font-size: medium;">More details about Azure Remote Access service in cloud service: </span></p>
<p><span style="font-size: medium;"><a href="https://blogs.msdn.com/b/avkashchauhan/archive/2011/12/06/how-does-remote-desktop-works-in-windows-azure.aspx"><span style="color: #0563c1; font-family: Calibri;">https://blogs.msdn.com/b/avkashchauhan/archive/2011/12/06/how-does-remote-desktop-works-in-windows-azure.aspx</span></a></span></p>
<p><span style="font-size: large;"><strong><span style="font-family: Calibri;">Solution 1: apply firewall rule by startup task</span></strong></span></p>
<p><span style="font-size: medium;"><span style="font-family: Calibri;">1.</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: Calibri;">In your web role project(where web.config exist), Create a file with content below and name it as <strong>SetFirewallRestrictions.ps1</strong></span></span></p>
<p><span style="font-size: small;"><em><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Get-NetFirewallPortFilter | ? LocalPort -eq '20000' | Get-NetFirewallRule | Set-NetFirewallRule -RemoteAddress &ldquo;Allowed IP Address&rdquo;</span></em></span></p>
<p><span style="font-size: small;"><em><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Get-NetFirewallRule &ndash;DisplayName &ldquo;WaRemoteForwarderService Rule&rdquo; | Set-NetFirewallRule -RemoteAddress &ldquo;Allowed IP Address&rdquo;</span></em></span></p>
<p><span style="font-size: medium;"><span style="font-family: Calibri;">2.</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: Calibri;">Also in the same web role project, create a file with content below and name it as <strong>SetFirewallRestrictions.cmd</strong></span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Powershell set-executionpolicy remotesigned &ndash;force</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Powershell .\SetFirewallRestrictions.ps1 &gt;&gt; SetFirewallRestrictions.out.log 2&gt;&gt; SetFirewallRestrictions.err.log</span></span></p>
<p><span style="font-size: medium;"><span style="font-family: Calibri;">3.</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: Calibri;">Set copy to output property of these 2 files above as &ldquo;copy always&rdquo; in Visual Studio</span></span></p>
<p><span style="font-size: medium;"><span style="font-family: Calibri;">4.</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: Calibri;">Add content below in service definition file to start the above commands as startup</span></span></p>
<p><em><span style="font-size: small;">&nbsp;&lt;WebRole name="WebRole1" vmsize="Small"&gt;</span></em></p>
<p><em><span style="font-size: small;">&nbsp;&nbsp; ...&nbsp;</span></em></p>
<p><em><span style="font-size: small; background-color: #ffff00;">&nbsp;&nbsp;&nbsp; &lt;Startup&gt;</span></em></p>
<p><em><span style="font-size: small; background-color: #ffff00;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Task commandLine="SetFirewallRestrictions.cmd" executionContext="elevated" taskType="simple" /&gt;</span></em></p>
<p><em><span style="font-size: small; background-color: #ffff00;">&nbsp;&nbsp;&nbsp; &lt;/Startup&gt;</span></em></p>
<p><em><span style="font-size: small; background-color: #ffff00;">&nbsp;&nbsp;&nbsp; &lt;Runtime executionContext="elevated" /&gt;</span></em></p>
<p><em><span style="font-size: small;">&nbsp; &lt;/WebRole&gt;</span></em></p>
<p><em><span style="font-size: small;">&lt;/ServiceDefinition&gt;</span></em></p>
<p><span style="font-size: medium;"><span style="font-family: Calibri;">Reference on running startup task in Azure cloud service: </span><a href="https://msdn.microsoft.com/en-us/library/azure/hh180155.aspx"><span style="color: #0563c1; font-family: Calibri;">https://msdn.microsoft.com/en-us/library/azure/hh180155.aspx</span></a></span></p>
<p><span style="font-family: Calibri; font-size: medium;"><strong><span style="background-color: #ffff00;">Tips:</span></strong> the IP address in file <strong>SetFirewallRestrictions.ps1 </strong>should be public IP address of the target client, but not its local IP address. How to get your client public IP address: <a href="https://whatismyipaddress.com/"><span style="color: #0563c1;">https://whatismyipaddress.com/</span></a> </span></p>
<p><span style="font-family: Calibri;">&nbsp;</span></p>
<p><span style="font-size: large;"><strong><span style="font-family: Calibri;">Solution 2: apply firewall rule by code part in WebRole.cs</span></strong></span></p>
<p><span style="font-size: medium;"><span style="font-family: Calibri;">1.</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: Calibri;">Add same file <strong>SetFirewallRestrictions.cmd</strong> and <strong>SetFirewallRestrictions.ps1 </strong>as above and set their property to &ldquo;copy always&rdquo;</span></span></p>
<p><span style="font-size: medium;"><span style="font-family: Calibri;">2.</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: Calibri;">Add content below in service definition file of your web role:</span></span></p>
<p><em><span style="font-family: Calibri; font-size: small;">&nbsp; &lt;WebRole name="WebRole1"&gt;</span></em></p>
<p><em><span style="font-family: Calibri; font-size: small; background-color: #ffff00;">&nbsp;&nbsp;&nbsp; &lt;Runtime executionContext="elevated"/&gt;</span></em></p>
<p><em><span style="font-family: Calibri; font-size: small;">&nbsp;&nbsp;&nbsp; &lt;Sites&gt;</span></em></p>
<p><span style="font-size: medium;"><span style="font-family: Calibri;">3.</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: Calibri;">Add codes below in OnStart():</span></span></p>
<p><span style="font-size: medium;"><strong><em><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // you can do some code to change the IP addresses in SetFirewallRestrictions.ps1</span></em></strong></span></p>
<p><span style="font-family: Calibri; font-size: medium; background-color: #ffff00;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string cmd = string.Format("SetFirewallRestrictions.cmd ");</span></p>
<p><span style="font-family: Calibri; font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Process p = new Process();</span></p>
<p><span style="font-family: Calibri; font-size: medium; background-color: #ffff00;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.StartInfo.FileName = @"d:\Windows\System32\cmd.exe";</span></p>
<p><span style="font-family: Calibri; font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.StartInfo.UseShellExecute = false;</span></p>
<p><span style="font-family: Calibri; font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.StartInfo.RedirectStandardInput = true;</span></p>
<p><span style="font-family: Calibri; font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.StartInfo.RedirectStandardOutput = false;</span></p>
<p><span style="font-family: Calibri; font-size: medium;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.StartInfo.RedirectStandardError = true;</span></p>
<p><span style="font-family: Calibri; font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.StartInfo.CreateNoWindow = true;</span></p>
<p><span style="font-family: Calibri; font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string Parameter = cmd;</span></p>
<p><span style="font-family: Calibri; font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try</span></p>
<p><span style="font-family: Calibri; font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p><span style="font-family: Calibri; font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.Start();</span></p>
<p><span style="font-family: Calibri; font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.StandardInput.WriteLine(cmd);</span></p>
<p><span style="font-family: Calibri; font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.StandardInput.WriteLine("exit");</span></p>
<p><span style="font-family: Calibri; font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.StandardInput.WriteLine("exit");</span></p>
<p><span style="font-family: Calibri; font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.WaitForExit();</span></p>
<p><span style="font-family: Calibri; font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.Close();</span></p>
<p><span style="font-family: Calibri; font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: Calibri; font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception e)</span></p>
<p><span style="font-family: Calibri; font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p><span style="font-family: Calibri; font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: Calibri; font-size: medium;">This solution may provide more options to VM owners to grant remote access. For example, VM owners can store permitted IP addresses in a blob storage file, then before the code above, some extra code can be added to access that target blob storage file and generate a corresponding file SetFirewallRestrictions.ps1. More than that, the code above can be added into a while loop in Run() rather than OnStart(), then the while loop will run the PowerShell command for its time, then in further round, it check blob file and determine sleep or run PowerShell again, by this way, any IP change in target blog file by VM owners can be applied immediately by the code logistics. Does that fun?</span></p>
<p>&nbsp;</p>
<p><span style="font-size: large;"><strong><span style="font-family: Calibri;">Solution 3: applying ACL(Access Control List) in Azure deployment</span></strong></span></p>
<p><span style="font-size: medium;"><span style="font-family: Calibri;">Tutorial for using ACL in Azure PaaS project: </span><a href="https://blogs.msdn.com/b/walterm/archive/2014/04/22/windows-azure-paas-acls-are-here.aspx"><span style="color: #0563c1; font-family: Calibri;">https://blogs.msdn.com/b/walterm/archive/2014/04/22/windows-azure-paas-acls-are-here.aspx</span></a></span></p>
<p><span style="font-family: Calibri; font-size: medium;">Key Points: as with IaaS ACLs, PaaS ACLs allow you to do the following:</span></p>
<ul>
<li><span style="font-family: Calibri; font-size: medium;">Selectively permit or deny incoming traffic based on remote subnet IPv4 address range to a virtual machine input endpoint </span></li>
<li><span style="font-family: Calibri; font-size: medium;">Blacklist IP addresses </span></li>
<li><span style="font-family: Calibri; font-size: medium;">Create multiple rules per virtual machine endpoint </span></li>
<li><span style="font-family: Calibri; font-size: medium;">Specify up to 50 ACL rules per virtual machine endpoint </span></li>
<li><span style="font-family: Calibri; font-size: medium;">Use rule ordering to ensure the correct set of rules are applied on a given virtual machine endpoint (lowest to highest) </span></li>
<li><span style="font-family: Calibri; font-size: medium;">Specify an ACL for a specific remote subnet IPv4 address</span></li>
</ul>
<p><span style="font-family: Calibri;">&nbsp;</span></p>
<p><span style="font-family: Calibri;"><span style="font-family: Calibri; font-size: medium;">Note: the sample was done in Azure Cloud Service VMs, for Azure IaaS VMs, similar command should also work, feel free to have a try and make your cloud VMs only accessible to your limited IP clients. </span></span></p>]]></content:encoded>
    </item>
    <item>
      <title>Azure Auto Scaling -- 设计强伸缩性的云方案</title>
      <link>https://docs.microsoft.com/archive/blogs/jianwu/azure-auto-scaling</link>
      <pubDate>Tue, 25 Nov 2014 04:51:00 GMT</pubDate>
      <dc:creator><![CDATA[JIAN WU - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/jianwu/2014/11/25/azure-auto-scaling/</guid>
      <description><![CDATA[云计算解决方案中，最大的一个特色就是强伸缩性。如果托管服务的工作流量骤增、骤减或者只需服役一段时间，Microsoft Azure可以提供自动化伸缩（Auto Scaling）的功能，Auto...]]></description>
      <content:encoded><![CDATA[<p>云计算解决方案中，最大的一个特色就是强伸缩性。如果托管服务的工作流量骤增、骤减或者只需服役一段时间，Microsoft Azure可以提供自动化伸缩（Auto Scaling）的功能，Auto Scaling可以依据开发者定义的扩容（缩容）规则来监视运行在云端的托管服务，一旦托管服务的运行达到规则生效条件，Microsoft Azure即启动自动化扩容（缩容）动作，完成扩容（缩容），使其在保证在线上服务的高质量时，使用的云资源最少。</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/6507.111.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/6507.111.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/6507.111.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/6507.111.png" alt="" width="417" height="424" border="0" /></a></p>
<p>本博文以Azure Cloud Service为例，就常用的基于Auto Scaling的设计和实施进行小结和分析，供Azure开发（架构）者参考。主要包含以下几个部分：</p>
<p>1. 使用Azure管理主页（portal）进行Auto Scaling设计和实现。</p>
<p>2. 高级使用Auto Scaling。</p>
<p>3. Auto Scaling性能调优及关键参数。</p>
<p>&nbsp;</p>
<p><span style="font-size: medium;"><strong>使用Azure管理主页实现Auto Scaling</strong></span></p>
<p>此方法非常简便，无需任何代码或编程操作，开发者登录Microsoft Azure管理门户<a href="https://manage.windowsazure.com">https://manage.windowsazure.com</a>，选择目标托管服务之后，在Scale页，开发者可以设置Auto Scaling。在默认情况下，Auto Scaling是关闭的（&ldquo;SCALE BY METRIC&rdquo;项是&ldquo;NONE&rdquo;），但开发者可以手动修改&ldquo;INSTANCE COUNT&rdquo;项，临时增加或者减少角色实例的数量。</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/4353.111.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/4353.111.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/4353.111.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/4353.111.png" alt="" width="620" height="432" border="0" /></a></p>
<p>若开发者选择使用CPU或者Queue Storage来实现Auto Scaling，可以将Scale By Metric置为CPU或者Queue，然后配置具体的Scaling细节，如下参考配置：</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/6433.222.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/6433.222.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/6433.222.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/6433.222.png" alt="" border="0" /></a></p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/8055.333.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/8055.333.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/8055.333.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/8055.333.png" alt="" border="0" /></a></p>
<p>更多关于此页面中Scaling设置的参数可以参考配置旁边的？中的提示信息，也可以参考以下文章和实践手册：<a href="https://azure.microsoft.com/en-us/documentation/articles/cloud-services-how-to-scale/">https://azure.microsoft.com/en-us/documentation/articles/cloud-services-how-to-scale/</a></p>
<p>&nbsp;</p>
<p><span style="font-size: medium;"><strong>&nbsp;高级使用Auto Scaling</strong></span></p>
<p>采用了上述方法实施Auto Scaling设计以后，开发者往往会发现这样一个问题，当外部流量很大，导致Cloud Service中的每个虚机内CPU使用率高于80%时，Scaling Up（自动化扩容）大约1小时以后才发生，这与预期的效果可能存在差异。对于此问题，需要详细了解一下Auto Scaling工作的机制和主要要点。</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/2555.111.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/2555.111.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/2555.111.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/2555.111.png" alt="" border="0" /></a></p>
<p>主要要点：</p>
<p>1. Role状态正常即指Role中的每一个虚机都正常工作</p>
<p>2. 默认情况下，CPU统计值来自于之前45分钟内该Role下所有虚机的CPU平均。</p>
<p>3. Azure平台中，虚机内部的性能指标，传输到Scaling模块有一定的时差（约15分钟）</p>
<p>鉴于此，可以预期：若0：00分设置基于CPU的Scaling方案，然后迅速将所有的虚机CPU使用率消耗到90%，需要持续将近45+15=60分钟才会有Scaling Up事件发生。</p>
<p>深入了解这个问题，还需要仔细看一下Auto Scaling工作所依赖的配置。使用上述方法在portal上实施Auto Scaling后开发者可以在management services里面找到添加的auto scaling内容。（操作类型为PutAutoscalingSetting）</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/1423.111.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/1423.111.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/1423.111.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/1423.111.png" alt="" border="0" /></a></p>
<p>AutoscaleSettings:<br />[<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; "Profiles": [<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Name": "Scale.WebApi.Cpu",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Capacity": {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Minimum": "1",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Maximum": "2",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Default": "1"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Rules": [<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "MetricTrigger": {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Name": "Percentage CPU",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Namespace": "CloudService",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Resource": "CloudService:test1205:Staging:WebRole1",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="background-color: #ffff00;">"TimeGrain": "PT15M",</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Statistic": "Average",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="background-color: #ffff00;">"TimeWindow": "PT45M",</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "TimeAggregation": "Average",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Operator": "GreaterThan",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Threshold": 80.0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "ScaleAction": {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Direction": "Increase",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Type": "ChangeCount",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Value": "1",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="background-color: #ffff00;">"Cooldown": "PT10M"</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "MetricTrigger": {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Name": "Percentage CPU",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Namespace": "CloudService",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Resource": "CloudService:test1205:Staging:WebRole1",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="background-color: #ffff00;">"TimeGrain": "PT15M",</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Statistic": "Average",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="background-color: #ffff00;">"TimeWindow": "PT45M",</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "TimeAggregation": "Average",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Operator": "LessThan",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Threshold": 60.0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "ScaleAction": {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Direction": "Decrease",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Type": "ChangeCount",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Value": "1",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="background-color: #ffff00;">"Cooldown": "PT10M"</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; ],<br />&nbsp;&nbsp;&nbsp; "SubscriptionId": "959bf13d-17fc-4cc2-9669-594&times;&times;&times;&times;&times;2b",<br />&nbsp;&nbsp;&nbsp; "Source": "CloudService:test1205:Staging:WebRole1",<br />&nbsp;&nbsp;&nbsp; "Version": "1.0",<br />&nbsp;&nbsp;&nbsp; "Enabled": true<br />&nbsp; }<br />]</p>
<p>Resource Name: CloudService:test1205:Staging</p>
<p>Resource Type: Autoscale</p>
<p>大部分的配置内容都来自于portal上的设置，都比较容易理解，其中有两个重要的参数不是来自于portal上的设置：TimeGrain和TimeWindow，TimeGrain表示Azure Auto Scaling计算平均值的样本时间，15分钟即表示CPU平均值按每15分钟做一次平均统计，如2：00～2：15得到一个CPU平均值，2：15～2：30得到一个CPU平均值。TimeWindow表示Azure Auto Scaling用于检验目标role的过去表现的时长。如TimeGrain=15和TimeWindow=45，即表示，过去45分钟内，若所得的CPU平均值均高于80%，即scaling up。</p>
<p>因此，在需要更高灵敏的自动化伸缩方案中，开发者需要对默认的Scaling规则进行优化，开发者可以通过代码的方式来配置TimeGrain和TimeWindow。注：以下代码需要在项目中使用Nuget添加Azure Management Service Library。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static void Main(string[] args)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Cloud Service and Role to be auto scaled.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var cloudServiceName = "test1205";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var isProduction = false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var roleName = "WebRole1";</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Azure Subscription ID and Management Certificate Thumbprint.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string subscriptionId = "959bf13d-17fc-4cc2-9669-5&amp;&amp;&times;&times;&times;&times;b";</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Get the certificate from the local store.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X509Certificate2 cert = GetCertificate();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="background-color: #ffff00;">// Genereate a resource Id for the cloud service and role.</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var resourceId = AutoscaleResourceIdBuilder.BuildCloudServiceResourceId(cloudServiceName, roleName, isProduction);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="background-color: #ffff00;">// Create the autoscale client.</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AutoscaleClient autoscaleClient = new AutoscaleClient(new CertificateCloudCredentials(subscriptionId, cert));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="background-color: #ffff00;">//Create an Autoscale Profile</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AutoscaleSettingCreateOrUpdateParameters createParams = new AutoscaleSettingCreateOrUpdateParameters()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Setting = new AutoscaleSetting()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enabled = true,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Profiles = new List&lt;AutoscaleProfile&gt;() <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new AutoscaleProfile()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Name = "Scale.WebApi.Cpu",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Capacity = new ScaleCapacity()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Default = "1",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Minimum = "1",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Maximum = "2"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Rules = new List&lt;ScaleRule&gt;()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background-color: #ffff00;"> //Create a ScaleRule to Scale Up</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var cpuScaleUpRule = new ScaleRule()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Define the MetricTrigger Properties<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MetricTrigger = new MetricTrigger()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MetricName = "Percentage CPU",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MetricNamespace = "",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MetricSource = AutoscaleMetricSourceBuilder.BuildCloudServiceMetricSource(cloudServiceName, roleName, isProduction),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="background-color: #ffff00;">TimeGrain = TimeSpan.FromMinutes(5),</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="background-color: #ffff00;">TimeWindow = TimeSpan.FromMinutes(15),</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TimeAggregation = TimeAggregationType.Average,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Statistic = MetricStatisticType.Average,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Operator = ComparisonOperationType.GreaterThan,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Threshold = 60.0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Define the ScaleAction Properties<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ScaleAction = new ScaleAction()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Direction = ScaleDirection.Increase,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Type = ScaleType.ChangeCount,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Value = "1",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cooldown = TimeSpan.FromMinutes(10)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Create a ScaleRule to Scale Down<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var cpuScaleDownRule = new ScaleRule()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Define the MetricTrigger Properties<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MetricTrigger = new MetricTrigger()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MetricName = "Percentage CPU",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MetricNamespace = "",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MetricSource = AutoscaleMetricSourceBuilder.BuildCloudServiceMetricSource(cloudServiceName, roleName, isProduction),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background-color: #ffff00;"> TimeGrain = TimeSpan.FromMinutes(5),</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background-color: #ffff00;"> TimeWindow = TimeSpan.FromMinutes(15),</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TimeAggregation = TimeAggregationType.Average,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Statistic = MetricStatisticType.Average,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Operator = ComparisonOperationType.LessThan,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Threshold = 25.0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Define the ScaleAction Properties<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ScaleAction = new ScaleAction()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Direction = ScaleDirection.Decrease,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Type = ScaleType.ChangeCount,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Value = "1",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cooldown = TimeSpan.FromMinutes(10)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Add the rules to the profile<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; createParams.Setting.Profiles[0].Rules.Add(cpuScaleUpRule);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; createParams.Setting.Profiles[0].Rules.Add(cpuScaleDownRule);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="background-color: #ffff00;">// Apply the settings in Azure to this resource</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; autoscaleClient.Settings.CreateOrUpdate(resourceId, createParams);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="background-color: #ffff00;">//Get Auto Scale Settings if you need to check what is&nbsp;the current scaling settings</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AutoscaleSettingGetResponse setting = autoscaleClient.Settings.Get(resourceId);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine("existing settins: " + setting.ToString());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static X509Certificate2 GetCertificate()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var certByteData = File.ReadAllBytes(@"E:\cie-jianw-managecert-pw1.pfx");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X509Certificate2 certificate = new X509Certificate2(certByteData, "password");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return certificate;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>运行完上述代码之后，开发者可以在portal上的management service中，确认自定义配置已生效：</p>
<p>AutoscaleSettings:<br />[<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; "Profiles": [<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Name": "Scale.WebApi.Cpu",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Capacity": {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Minimum": "1",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Maximum": "2",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Default": "1"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Rules": [<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "MetricTrigger": {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Name": "Percentage CPU",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Namespace": "CloudService",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Resource": "CloudService:test1205:Staging:WebRole1",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="background-color: #ffff00;">"TimeGrain": "PT5M",</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Statistic": "Average",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="background-color: #ffff00;">"TimeWindow": "PT15M",</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "TimeAggregation": "Average",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Operator": "GreaterThan",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="background-color: #ffff00;">"Threshold": 60.0</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "ScaleAction": {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Direction": "Increase",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Type": "ChangeCount",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Value": "1",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Cooldown": "PT10M"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "MetricTrigger": {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Name": "Percentage CPU",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Namespace": "CloudService",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Resource": "CloudService:test1205:Staging:WebRole1",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="background-color: #ffff00;">"TimeGrain": "PT5M",</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Statistic": "Average",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background-color: #ffff00;"> "TimeWindow": "PT15M",</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "TimeAggregation": "Average",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Operator": "LessThan",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Threshold": 25.0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "ScaleAction": {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Direction": "Decrease",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Type": "ChangeCount",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Value": "1",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Cooldown": "PT10M"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; ],<br />&nbsp;&nbsp;&nbsp; "SubscriptionId": "959bf13d-17fc-4cc2-9669-59&times;&times;&times;&times;ac2b",<br />&nbsp;&nbsp;&nbsp; "Source": "CloudService:test1205:Staging:WebRole1",<br />&nbsp;&nbsp;&nbsp; "Version": "1.0",<br />&nbsp;&nbsp;&nbsp; "Enabled": true<br />&nbsp; }<br />]</p>
<p>Resource Name: CloudService:test1205:Staging</p>
<p>Resource Type: Autoscale</p>
<p>在此配置下，scaling up将会在约 15分钟（time window） + 15分钟（后端性能数据延时） = 30分钟后发生。</p>
<p>&nbsp;</p>
<p><span style="font-size: medium;"><strong>Auto Scaling性能调优及关键参数</strong></span></p>
<p>针对上述使用代码进行的自定义Scaling配置，其运行过程如以下截图：</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/5126.111.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/5126.111.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/5126.111.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/5126.111.png" alt="" border="0" /></a></p>
<p>Azure中的Monitor数据较实际时间落后了将近15分钟。</p>
<p>鉴于Azure后端对目标虚机的性能采用传输到Scaling模块需要一定的时间（经反复测试，约15～25分钟），一个<span style="background-color: #ffff00;">较保险的TimeWindow的推荐值是25分钟</span>。若TimeWindow=15但数据延时是20分钟时，Auto Scaling会无法得到最新一次的数据（去平均值失败），即影响Auto Scaling的表现。<span style="background-color: #ffff00;">TimeGrain的最小单位是5分钟</span>，对于CPU类型的Scaling，可以取最小值，从而得到最快的表现。</p>
<p>基于上述Auto Scaling的讨论以及实际工作的场景，一个常见的伸缩性方案设计如下：</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/1754.111.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/1754.111.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/1754.111.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/1754.111.png" alt="" border="0" /></a></p>
<p>另外，若开发项目中，对于Scaling要求实时响应，如CPU超过80%，立即Scaling Up的需求，开发者可以考虑结合前面推荐的WAD自定义分析<a href="https://blogs.msdn.com/b/jianwu/archive/2014/09/23/windows-azure-storage-wad.aspx">https://blogs.msdn.com/b/jianwu/archive/2014/09/23/windows-azure-storage-wad.aspx</a> 和 REST操作<a href="https://msdn.microsoft.com/en-us/library/azure/ee460809.aspx">https://msdn.microsoft.com/en-us/library/azure/ee460809.aspx</a>来实现更高级的Scaling方案。</p>]]></content:encoded>
    </item>
    <item>
      <title>Windows Azure数据存储与比较</title>
      <link>https://docs.microsoft.com/archive/blogs/jianwu/windows-azure</link>
      <pubDate>Tue, 18 Nov 2014 06:48:00 GMT</pubDate>
      <dc:creator><![CDATA[JIAN WU - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/jianwu/2014/11/18/windows-azure/</guid>
      <description><![CDATA[对于绝大多数解决方案而言，数据都是至关重要的一部分，云计算中同样如此。在云计算里面，绝大多数传统存储的建议都可以直接拿来用，如数据冗余、数据加密等。但是云计算中的数据与传统的数据有所不同，主要体现在三...]]></description>
      <content:encoded><![CDATA[<p class="05"><span style="font-family: arial black,avant garde; font-size: small;">对于绝大多数解决方案而言，数据都是至关重要的一部分，云计算中同样如此。在云计算里面，绝大多数传统存储的建议都可以直接拿来用，如数据冗余、数据加密等。但是云计算中的数据与传统的数据有所不同，主要体现在三个方面。</span></p>
<p class="05"><span style="font-family: arial black,avant garde; font-size: small;">（1）数据可能存储在本地，也可能存储在云端</span></p>
<p class="05"><span style="font-family: arial black,avant garde; font-size: small;">对于存储在本地的数据，如果云端服务需要连接，则可以通过建立不同的渠道来实现数据访问或者同步，如图所示Windows Azure中的数据同步技术。</span></p>
<p class="05"><span style="font-family: arial black,avant garde; font-size: small;"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/3005.111.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/3005.111.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/64/3005.111.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-64/3005.111.png" alt="" border="0" /></a></span></p>
<ol>
<li>
<div class="a2"><span style="font-family: arial black,avant garde; font-size: small;"> 网络与网络互联：IaaS中的Virtual Network实现本地网络和云端网络的无缝整合，云端数据和本地数据都将成为局域网内部的数据，通过传统的局域网通信方式即可实现数据访问和管理。</span></div>
</li>
<li>
<div class="a2"><span style="font-family: arial black,avant garde; font-size: small;"> 计算机间互联：IaaS中的Point-to-Site实现单台计算机与云端计算机的安全连接，支持基于IPv4的通信。</span></div>
</li>
<li>
<div class="a2"><span style="font-family: arial black,avant garde; font-size: small;"> 应用程序互联：Service Bus实现应用程序间的互联，数据可以通过Service Bus暴露或传递于不同平台上的应用程序之间。</span></div>
</li>
<li>
<div class="a2"><span style="font-family: arial black,avant garde; font-size: small;"> 数据同步：基于互联网和软件产品本身的数据同步，如SQL Server和SQL Azure的同步、本地Active Directory和云端Windows Azure Active Directory的同步。</span></div>
</li>
</ol>
<p class="05"><span style="font-family: arial black,avant garde; font-size: small;">（2）数据访问主要依赖于Internet，但数据访问和安全性要求极高</span></p>
<p class="05"><span style="font-family: arial black,avant garde; font-size: small;">访问云端的数据或者通过建立云端连接来共享数据均需要保证数据安全性，Microsoft Azure中的数据服务大多数支持SSL通信加密，且提供多种不同安全级别的验证支持，对于SQL Azure和托管服务，开发者都可以自定义访问IP的&ldquo;白名单&rdquo;，实现更高级别的安全性保障。归纳起来，Microsoft Azure中的数据服务主要基于以下几个特性来实现数据安全：</span></p>
<ul>
<li>
<div class="a2"><span style="font-family: arial black,avant garde; font-size: small;"> SSL加密通信。</span></div>
</li>
<li>
<div class="a2"><span style="font-family: arial black,avant garde; font-size: small;"> 使用用户名、密钥管理数据。</span></div>
</li>
<li>
<div class="a2"><span style="font-family: arial black,avant garde; font-size: small;"> 使用SAS签名授权方式控制访问权限。</span></div>
</li>
<li>
<div class="a2"><span style="font-family: arial black,avant garde; font-size: small;"> 基于ACS或者WAAD的登录授权。</span></div>
</li>
<li>
<div class="a2"><span style="font-family: arial black,avant garde; font-size: small;"> IP白名单、黑名单。</span></div>
</li>
<li>
<div class="a2"><span style="font-family: arial black,avant garde; font-size: small;">证书加密数据访问密钥等关键信息</span></div>
</li>
</ul>
<p class="05"><span style="font-family: arial black,avant garde; font-size: small;">（3）数据访问客户端运行于世界各地，访问速度很重要</span></p>
<p class="05"><span style="font-family: arial black,avant garde; font-size: small;">云计算的数据可以存放在许多地方，而且WindowsAzure数据存储也是非常多样化的。为了实现高性能的数据服务，开发者可以选用最佳的数据存储/缓存来实践解决方案，同时对于公开的云端静态数据（如文件、视频等），选用较近的数据中心，并开启CDN加快访问速度。</span></p>
<p class="05"><span style="font-family: arial black,avant garde; font-size: small;">选择正确的数据类型时，应充分考虑项目需求和数据上下游的交互压力，除了常用的文件存储和缓存技术之外，对于队列存储和表存储，开发者应仔细分析Queue Storage和Service Bus Queue、Table Storage和SQL Azure的对比，选择最佳的数据类型来实践。</span></p>
<p class="05" style="text-align: left;">如下表所示是Queue Storage和Service Bus Queue的对比。</p>
<table style="width: 548px;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="60">
<p class="a0" align="center"><span style="font-family: arial black,avant garde; font-size: small;">服务特性</span></p>
</td>
<td valign="top" width="167">
<p class="a0" align="center"><span style="font-family: arial black,avant garde; font-size: small;">Queue Storage</span></p>
</td>
<td valign="top" width="227">
<p class="a0" align="center"><span style="font-family: arial black,avant garde; font-size: small;">Service Bus Queue</span></p>
</td>
</tr>
<tr>
<td valign="top" width="60">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">先进先出</span></p>
</td>
<td valign="top" width="167">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">不保证</span></p>
</td>
<td valign="top" width="227">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">保证</span></p>
</td>
</tr>
<tr>
<td valign="top" width="60">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据传输</span></p>
</td>
<td valign="top" width="167">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">至少传输一次</span></p>
</td>
<td valign="top" width="227">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">至少传输一次，至多传输一次</span></p>
</td>
</tr>
<tr>
<td valign="top" width="60">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">队列大小</span></p>
</td>
<td valign="top" width="167">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">最大可至200TB</span></p>
</td>
<td valign="top" width="227">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">最大不超过5GB</span></p>
</td>
</tr>
<tr>
<td valign="top" width="60">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">访问方法</span></p>
</td>
<td valign="top" width="167">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">读取 --&gt; 独享 --&gt; 删除</span></p>
</td>
<td valign="top" width="227">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">锁定 --&gt; 读取 --&gt; 删除</span></p>
</td>
</tr>
<tr>
<td valign="top" width="60">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">锁定时长</span></p>
</td>
<td valign="top" width="167">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">（lease）默认30s，最多为7天</span></p>
</td>
<td valign="top" width="227">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">（lock）默认60s，RenewLock API支持不断更新</span></p>
</td>
</tr>
<tr>
<td valign="top" width="60">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">锁定粒度</span></p>
</td>
<td valign="top" width="167">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">消息</span></p>
</td>
<td valign="top" width="227">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">整个队列</span></p>
</td>
</tr>
<tr>
<td valign="top" width="60">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">批量读取</span></p>
</td>
<td valign="top" width="167">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">支持，单次最多读取32条消息</span></p>
</td>
<td valign="top" width="227">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">支持，pre-fetch属性实现批量读取</span></p>
</td>
</tr>
<tr>
<td valign="top" width="60">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">批量写入</span></p>
</td>
<td valign="top" width="167">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">不支持</span></p>
</td>
<td valign="top" width="227">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">支持</span></p>
</td>
</tr>
<tr>
<td valign="top" width="60">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">读写效率</span></p>
</td>
<td valign="top" width="167">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">最优2000条消息/秒，平均延时10ms</span></p>
</td>
<td valign="top" width="227">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">最优2000条消息/秒，平均延时100ms</span></p>
</td>
</tr>
<tr>
<td style="text-align: left;" valign="top" width="60">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">存储成本</span></p>
</td>
<td style="text-align: left;" valign="top" width="167">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">经济</span></p>
</td>
<td valign="top" width="227">
<p class="a0" style="text-align: left;"><span style="font-family: arial black,avant garde; font-size: small;">一般</span></p>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;&nbsp;</p>
<p class="05">如下表所示是Table Storage和SQL Azure的对比。</p>
<table style="width: 548px;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="120">
<p class="a0" style="text-align: left;" align="center"><span style="font-family: arial black,avant garde; font-size: small;">服务特性</span></p>
</td>
<td style="text-align: left;" valign="top" width="153">
<p class="a0" align="center"><span style="font-family: arial black,avant garde; font-size: small;">Table Storage</span></p>
</td>
<td style="text-align: left;" valign="top" width="180">
<p class="a0" align="center"><span style="font-family: arial black,avant garde; font-size: small;">SQL Azure</span></p>
</td>
</tr>
<tr>
<td valign="top" width="120">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">关系型数据存储引擎</span></p>
</td>
<td valign="top" width="153">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">不是</span></p>
</td>
<td valign="top" width="180">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">是</span></p>
</td>
</tr>
<tr>
<td valign="top" width="120">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">服务端处理</span></p>
</td>
<td valign="top" width="153">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">不支持</span></p>
</td>
<td valign="top" width="180">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">支持存储过程、联合、触发器等</span></p>
</td>
</tr>
<tr>
<td valign="top" width="120">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">批量读取</span></p>
</td>
<td valign="top" width="153">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">同一个索引区支持</span></p>
</td>
<td valign="top" width="180">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">全库支持</span></p>
</td>
</tr>
<tr>
<td valign="top" width="120">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据表结构</span></p>
</td>
<td valign="top" width="153">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">动态定义</span></p>
</td>
<td valign="top" width="180">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">固定定义</span></p>
</td>
</tr>
<tr>
<td valign="top" width="120">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据形式</span></p>
</td>
<td valign="top" width="153">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">固定有限量数据类型</span></p>
</td>
<td valign="top" width="180">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">多种数据类型，且支持自定义类型</span></p>
</td>
</tr>
<tr>
<td style="text-align: left;" valign="top" width="120">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">存储成本</span></p>
</td>
<td style="text-align: left;" valign="top" width="153">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">经济</span></p>
</td>
<td valign="top" width="180">
<p class="a0" style="text-align: left;"><span style="font-family: arial black,avant garde; font-size: small;">一般</span></p>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p class="05">结合上述数据特性和前面讨论的Microsoft Azure开发技术，对于常用的数据共享和数据服务，作以下分析和对比（如下表）</p>
<table style="width: 548px;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="65">
<p class="a0" align="center"><span style="font-family: arial black,avant garde; font-size: small;">数据形式</span></p>
</td>
<td width="109">
<p class="a0" align="center"><span style="font-family: arial black,avant garde; font-size: small;">数据使用方</span></p>
</td>
<td width="119">
<p class="a0" align="center"><span style="font-family: arial black,avant garde; font-size: small;">解决方案</span></p>
</td>
<td width="75">
<p class="a0" align="center"><span style="font-family: arial black,avant garde; font-size: small;">数据公开</span><br /><span style="font-family: arial black,avant garde; font-size: small;">（互联网访问）</span></p>
</td>
<td width="181">
<p class="a0" align="center"><span style="font-family: arial black,avant garde; font-size: small;">备注性能</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据通信</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">云端服务、本地服务、跨平台服务等</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">Service Bus Queue、Service Bus Topic</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">实时传输，先进先出</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据通信</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">云端服务、本地服务、跨平台服务等</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">队列存储（Queue Storage）</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">高并发、不保证先进先出</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据通信</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">云端服务、本地服务、跨平台服务等</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">托管式缓存（Managed Cache Service）</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据缓存</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据通信</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">托管服务</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">In-Role Cache</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">不公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">托管服务内部使用</span></p>
</td>
</tr>
</tbody>
</table>
<p class="05">&nbsp;</p>
<table style="width: 548px;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="65">
<p class="a0" align="center"><span style="font-family: arial black,avant garde; font-size: small;">数据形式</span></p>
</td>
<td width="109">
<p class="a0" align="center"><span style="font-family: arial black,avant garde; font-size: small;">数据使用方</span></p>
</td>
<td width="119">
<p class="a0" align="center"><span style="font-family: arial black,avant garde; font-size: small;">解决方案</span></p>
</td>
<td width="75">
<p class="a0" align="center"><span style="font-family: arial black,avant garde; font-size: small;">数据公开</span><br /><span style="font-family: arial black,avant garde; font-size: small;">（互联网访问）</span></p>
</td>
<td width="181">
<p class="a0" align="center"><span style="font-family: arial black,avant garde; font-size: small;">备注性能</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据通信</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">托管服务</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">Internal Endpoint、WCF服务</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">不公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">托管服务内部通信</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据通信</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">虚拟网络</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">虚拟网络、局域网</span><br /><span style="font-family: arial black,avant garde; font-size: small;">通信</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">不公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">虚拟网络内部的托管服务、虚拟机、本地网络间的局域网通信</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据存储</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">云端服务、本地服务、跨平台服务等</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">Blob Storage</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">文件存储</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据存储</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">托管服务、IaaS虚拟机</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">Blob Storage （页式）</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">不公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">托管服务虚拟机或者IaaS虚拟机加载成本地磁盘</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据存储</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">云端服务、本地服务、跨平台服务等</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">Table Storage</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">非关系型数据存储、非固定数据结构类型的数据存储</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据存储</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">云端服务、本地服务、跨平台服务等</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">SQL Azure</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">云端关系型数据库引擎</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据访问</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">云端服务、本地服务、跨平台服务等</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">账户名+密钥</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">应用于WAS存储、SQL Azure存储、Managed Cache</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据访问</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">托管服务</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">指定Cache Role名称</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">不公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">In-Role Cache</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据访问</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">云端服务、本地服务、跨平台服务等</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">签名授权访问（Shared Access Signature）</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">应用于WAS存储、Service Bus消息</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据访问</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">云端服务、本地服务、跨平台服务等</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">直接访问</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">应用于CDN，设定为Public的WAS存储内容</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据访问</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">云端服务、本地服务、跨平台服务等</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">ACS、WAAD</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">集成ACS、WAAD实现项目中的登录验证</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据可用性</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">托管服务</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">多个实例、Auto-Scaling</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">负载均衡器实现高可用性</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据可用性</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">IaaS虚拟机服务</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">多台虚拟机、Load Balanced Endpoint</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">负载均衡</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据可用性</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">云端服务、本地服务、跨平台服务等</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">CDN（数据传输网络）</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">缓存静态文件</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据可用性</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">托管服务</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">Traffic Manager</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">实现多个托管服务的对外统一服务</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据可靠性</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">托管服务</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">多个实例、Upgrade Domain</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">公共</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">提高托管服务可靠性</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据可靠性</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">IaaS虚拟机服务</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">Availability Set</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">公共</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">提高虚拟机服务对外可靠性</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据可靠性</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">WAS存储、SQL Azure存储、WAAD等</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">异域备份、数据同步、虚拟网络</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">不公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">实现数据备份、数据同步</span></p>
</td>
</tr>
</tbody>
</table>
<div align="center">
<div align="center">&nbsp;</div>
<div align="center">&nbsp;</div>
<div align="center">&nbsp;</div>
</div>
<table style="width: 548px;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="65">
<p class="a0" align="center"><span style="font-family: arial black,avant garde; font-size: small;">数据形式</span></p>
</td>
<td width="109">
<p class="a0" align="center"><span style="font-family: arial black,avant garde; font-size: small;">数据使用方</span></p>
</td>
<td width="119">
<p class="a0" align="center"><span style="font-family: arial black,avant garde; font-size: small;">解决方案</span></p>
</td>
<td width="75">
<p class="a0" align="center"><span style="font-family: arial black,avant garde; font-size: small;">数据公开</span><br /><span style="font-family: arial black,avant garde; font-size: small;">（互联网访问）</span></p>
</td>
<td width="181">
<p class="a0" align="center"><span style="font-family: arial black,avant garde; font-size: small;">备注性能</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据通信</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">托管服务</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">Internal Endpoint、WCF服务</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">不公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">托管服务内部通信</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据通信</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">虚拟网络</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">虚拟网络、局域网</span><br /><span style="font-family: arial black,avant garde; font-size: small;">通信</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">不公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">虚拟网络内部的托管服务、虚拟机、本地网络间的局域网通信</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据存储</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">云端服务、本地服务、跨平台服务等</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">Blob Storage</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">文件存储</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据存储</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">托管服务、IaaS虚拟机</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">Blob Storage （页式）</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">不公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">托管服务虚拟机或者IaaS虚拟机加载成本地磁盘</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据存储</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">云端服务、本地服务、跨平台服务等</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">Table Storage</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">非关系型数据存储、非固定数据结构类型的数据存储</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据存储</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">云端服务、本地服务、跨平台服务等</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">SQL Azure</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">云端关系型数据库引擎</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据访问</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">云端服务、本地服务、跨平台服务等</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">账户名+密钥</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">应用于WAS存储、SQL Azure存储、Managed Cache</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据访问</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">托管服务</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">指定Cache Role名称</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">不公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">In-Role Cache</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据访问</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">云端服务、本地服务、跨平台服务等</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">签名授权访问（Shared Access Signature）</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">应用于WAS存储、Service Bus消息</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据访问</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">云端服务、本地服务、跨平台服务等</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">直接访问</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">应用于CDN，设定为Public的WAS存储内容</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据访问</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">云端服务、本地服务、跨平台服务等</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">ACS、WAAD</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">集成ACS、WAAD实现项目中的登录验证</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据可用性</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">托管服务</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">多个实例、Auto-Scaling</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">负载均衡器实现高可用性</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据可用性</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">IaaS虚拟机服务</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">多台虚拟机、Load Balanced Endpoint</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">负载均衡</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据可用性</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">云端服务、本地服务、跨平台服务等</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">CDN（数据传输网络）</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">缓存静态文件</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据可用性</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">托管服务</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">Traffic Manager</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">实现多个托管服务的对外统一服务</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据可靠性</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">托管服务</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">多个实例、Upgrade Domain</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">公共</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">提高托管服务可靠性</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据可靠性</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">IaaS虚拟机服务</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">Availability Set</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">公共</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">提高虚拟机服务对外可靠性</span></p>
</td>
</tr>
<tr>
<td width="65">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">数据可靠性</span></p>
</td>
<td width="109">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">WAS存储、SQL Azure存储、WAAD等</span></p>
</td>
<td width="119">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">异域备份、数据同步、虚拟网络</span></p>
</td>
<td width="75">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">不公开</span></p>
</td>
<td width="181">
<p class="a0"><span style="font-family: arial black,avant garde; font-size: small;">实现数据备份、数据同步</span></p>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
  </channel>
</rss>