Windows Azure 上的托管服务CDN

 昨天我告诉正坐在我边上的一个同事,怎样在Windows Azure上发布的网站上对静态内容启用CDN。方法如下:

1.将静态内容(如图片,CSS文件等)移到博客中存储。

2.在他的存储账户中启用CDN。

3.把这些静态文件的URL改为CDN URL。 

我想这是使用CDN的最普通的步骤了。但是今天早上我在Windows Azure 博客上发现新版本Windows Azure SDK 1.4 和新版本Windows Azure Developer Portal 已经被发布了。此CDN的发行版本的一个新特性是:我们不仅可以为存储账户启用CDN,也可以为托管服务启用CDN。这个新特性给我的启示是上面的步骤将变得简单了许多

启用托管服务CDN

 我们只需要登录 Windows Azure Developer Portal 就可以启用托管服务CDN了。在“Hosted Services, Storage Accounts & CDN” 项下面我们可以发现左边的一个叫CDN的新菜单,在这里我们可以管理存储账户和托管服务CDN。我们可以看到托管服务和存储账户都被列在订阅中。

 启用托管服务CDN是很简单的,只需在顶端选择一个托管服务,然后点击 New Endpoint 按钮即可。

 

在这个对话框里,我们可以选择我们希望启用CDN的订阅,存储账户或是托管服务。例如上图中,如果我选择了托管服务,“Source URL for the CDN endpoint”就会自动显示。这意味着Windows Azure 平台将使“/cdn”文件夹下所有内容启用CDN。但是此时我们不能改动它的值。

 下面紧挨着URL的3个复选框是:

1.启用CDN:启用或不启用CDN。

2.HTTPS:如果我们需要使用HTTPS连接,选中它。

3.查询字符串:如果我们缓存托管服务内容或使用查询字符串来指定被恢复的内容,选中它。

 只需点击 “Create”按钮就可以让Windows Azure 为我们创建托管服务CDN。系统会提醒你CDN在60分钟内可用。我觉得大约15分钟CDN可以使用,我们也可以在网页中找到CDN URL。

 

在托管服务CDN中添加内容

我们使用MVC2网站框架在Visual Studio上创建一个Windows Azure 项目。当我们创建CDN时,系统提醒CDN端点的源URL将放在”/cdn"文件夹下。所以我们在网站上用Visual Studio创建一个命名为"/cdn"的文件夹来存放静态文件。然后如果我们使用CDN端点,所有的文件将被CDN缓存。

 

 托管服务CDN在查询字符串特性被启用时可以缓存一些"动态的"内容。我们在它上创建了一个叫做CdnController 的控制器和GetNumber action 。这个控制器的URL路径为 /Cdn/GetNumber ,这个路径也可以使用CDN因为URL说明了它存放在"/cdn"文件夹下。 在GetNumber action 里我们只需要把一个被参数指定的数值放到视图模型中,然后URL就会形如 /Cdn/GetNumber?number=2. 

  1: using System;
  2: using System.Collections.Generic;
  3: using System.Linq;
  4: using System.Web;
  5: using System.Web.Mvc;
  6:  
  7: namespace MvcWebRole1.Controllers
  8: {
  9:     public class CdnController : Controller
  10:     {
  11:         //
  12:         // GET: /Cdn/
  13:  
  14:         public ActionResult GetNumber(int number)
  15:         {
  16:             return View(number);
  17:         }
  18:  
  19:     }
  20: }

 我们添加视图来显示数值,非常简单,方法如下:

  1: <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<int>" %>
  2:  
  3: <asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
  4:     GetNumber
  5: </asp:Content>
  6:  
  7: <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
  8:  
  9:     <h2>The number is: <%
  1: : Model.ToString() 

%></h2>

  
  10:  
  11: </asp:Content>

 

因为这个action是在CdnController 下,所以URL也会在"/cdn"文件夹下,这意味着它可以使用CDN。因为我们选中了 “Query String” ,动态页面内容根据它的query string来进行缓存,所以如果我们使用了CDN URL ,https://az25311.vo.msecnd.net/GetNumber?number=2,   CDN将会首先检查是否有内容使用“GetNumber?number=2”进行缓存。如果有,CDN会直接返回内容,否则,它会连接托管服务,https://aurora-sys.cloudapp.net/Cdn/GetNumber?number=2, 然后返回结果给浏览器并且在CDN中缓存。

 

But to be notice that the query string are treated as string when used by the key of CDN element. This means the URLs below would be cached in 2 elements in CDN:

但是需要注意的是当查询字符串被CDN元素键使用时应作为字符串看待。这意味着下面的URL将在CDN的两个元素里缓存:

 在Azure上发布项目以后,我们在网站上使用CDN。我们创建的CDN端点是az25311.vo.msecnd.net 所以在“/cdn”文件夹下可以被请求到。让我们在 sample.htm页面和 c_great_wall.jpg静态文件中试一下。

 

 

 

我们在CDN端点上使用查询字符串也可以请求到动态页面GetNumber

 

 因为来自CDN的内容不需要MVC服务器的处理,所以如果我们刷新这个页面它就会迅速显示出来。

          我们这个页面风格丢失了,这是因为CSS文件不包含在“/cdn”文件夹里所以页面不能在CDN URL 中检索到CSS。

  总结

在这个帖子中,我介绍了Windows Azure SDK 1.4 发行版本和新Developer Portal 中的 Windows Azure CDN 新特性。使用托管服务CDN,我们可以只在“/cdn”文件夹中存放静态资源,所以CDN可以自动缓存他们,不需要让它们在blob中存储。使用查询字符串特性也可以支持动态内容缓存。所有我们可以使用 UserController 和 CDN可以缓存网页的一部分内容。例如:我们可以在母板面中的用户控件上缓存日志,使得日志可以更迅速的显示出来。

 发行版本的其他新特性请点击这里。更多的Windows Azure CDN详细信息请点击这里

 希望以上对你有所帮助,

Shaun

  本文翻译自:https://geekswithblogs.net/shaunxu/archive/2011/03/10/cdn-on-hosted-service-in-windows-azure.aspx