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 ,http://az25311.vo.msecnd.net/GetNumber?number=2, CDN将会首先检查是否有内容使用“GetNumber?number=2”进行缓存。如果有,CDN会直接返回内容,否则,它会连接托管服务,http://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的两个元素里缓存:
- http://az25311.vo.msecnd.net/GetNumber?number=2&page=1
- http://az25311.vo.msecnd.net/GetNumber?page=1&number=2
在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
本文翻译自:http://geekswithblogs.net/shaunxu/archive/2011/03/10/cdn-on-hosted-service-in-windows-azure.aspx