Windows Azure

Windows Azure 前来解围

Mark Kromer

下载代码示例

我们在 Microsoft 中大西洋地区的市场营销部门在今年春季举办了一个活动,有大约 90 位 Fortune 500 强的管理人员、Microsoft 合作伙伴和 Microsoft 员工参加。 他们需要一个注册系统以便强调最新和最棒的 Microsoft 技术,并且让与会者深刻体验到这些最新的 Microsoft 技术。 我过去作为解决方案架构师和顾问,已经建立了成功的解决方案,在紧要关头它们可用来救急。 这是因为对于展示哪些技术或如何展示,在当时还没有清晰的方向。 哦,顺便说一下,那时距离会议召开只差一个月了!

我在 Microsoft 的主要工作就是处理与在 SQL Server 和 Windows Azure SQL Database(就是通常所说的 Microsoft 数据平台)的基础上构建的解决方案有关的大型业务。 因此,我立即就想到了 Windows Azure 的平台即服务 (PaaS) 功能,作为我可能满足该市场营销部门的要求的唯一方法。 通过利用 Windows Azure 的功能来快速交付在 Microsoft 应用程序平台(Microsoft .NET Framework、SQL Server 和 Windows Server)的基础上建立的解决方案,我成功实现了目标。 通过 Windows Azure PaaS 模型,Microsoft 可以从位于世界各地的 Microsoft 数据中心处理基础结构、电源、服务器、维护、修补和升级等,使其成为不占用任何空间、无需任何基础结构的完全适合我的要求的选项。

我与该市场营销部门和我的经理达成的协议的一部分是,我只能用我的空闲时间和周末来完成此项目。 因此,我把目光投向了那些已经证明可迅速投入生产的已知技术,包括 Silverlight、Windows Communication Foundation (WCF) 和 SQL Server。 最终,使用常见的 Microsoft 技术,我能够交付一个可靠的解决方案,这个解决方案的反响很积极并且结果也很好,还未花分文并且没有占用很长时间。 我希望您将能够从我付出很少努力而通过 Windows Azure、Windows Azure SQL Database 和 Windows Phone 利用的技术中,获得一些指导和启迪。

对于此项目,我主要需要针对两个特定的要求。 一个要求就是吸引与会者并且让与会者轻松地与会议合作伙伴的新装置和设备(例如平板电脑和手机)交互。 第二个要求就是要强调 Microsoft 在所有设备中使用的新的 Metro 设计方法。 我没有时间加载 Windows 8 的社区预览版和 Visual Studio 11 来生成本机 Metro 应用程序。 但几个月以来我一直在 Windows Phone 7.5 上进行开发,因此,我决定结合使用 Silverlight 方法,因为该方法适用于 Windows 8 桌面模式和 Windows Phone 本机应用程序。

为了满足这两个要求,我决定创建一个与会者签入应用程序,以便在登记的来宾到达登记台时进行交互。 这涵盖了功能性和交互式应用程序的要求。 为了打造 Metro UI 体验,我利用了 Silverlight 5.0 PivotViewer 控件。 为了切合交互式主题以及展现不同形式的体验,我在 Panorama 控件的基础上创建了一个 Windows Phone 应用程序。 使用该应用程序,参与该活动的 Microsoft 员工可允许来宾使用自己的设备签入或查看活动照片。 如果来宾还是 Windows Phone 用户,则可以从 Marketplace 下载该应用程序。 一个显而易见的技术选项是 Windows Azure,并且我将 Windows Azure SQL Database 用作了数据库,将 Windows Azure SQL Reporting 用来跟踪报告,将 Windows Azure WCF Services 用来数据交换,并且将 Windows Azure 二进制大型对象 (BLOB) 存储用来存储现场活动照片。

解决方案概述

在本文中,我将要把这个解决方案的体系结构划分为三个主要的方面: Windows Azure Web 应用程序、Windows Azure SQL Database 和报告以及 Windows Phone 应用程序。 完整的解决方案还包括了其他几个起辅助作用、但很棒的应用程序和功能,但由于篇幅有限,我将不会在本文中详述。 但是,如果您正打算为规模相当(与会者人数少于 300)的会议或活动构建自定义解决方案,其他这些方面也很重要,值得您考虑:

  1. 照片上载和共享: 我利用了 Windows Azure Toolkit 中的图像上载器工具,它可以获取本地存储中的图像并且将它们上载到 Windows Azure BLOB 存储中。 它是一种现成的功能,效果很好。 您只需插入您的 Windows Azure 存储密钥并且将 Default.aspx 文件修改为您自己的设计。 图像已上载,这样,用户可以在活动中的大屏幕上或演示台上通过照片库分享在活动中拍摄的照片。 我建议下载一个工具以便浏览您的 Windows Azure 存储中的文件,这样,您可以在上载后轻松地管理这些文件。 在 CodePlex 上(网址为 bit.ly/H3rOC)提供一个此类工具,即 Azure 存储浏览器。
  2. 社交网络: 这是针对此特性的应用程序的要求。 对于公开的会议和活动,请确保您包括了一个方法以便共享这些照片以及与会者意见、Tweet、更新和讨论等。 在 Windows Phone 应用程序中,我只是链接到了我创建的 Facebook 组,而在 Web 应用程序(后面我将介绍这个应用程序)中,我使用了 Facebook C# SDK for ASP.NET,您可以从 bit.ly/J5D2zI 获取此工具。
  3. Silverlight 照片库查看器: 我现在将不会全面介绍这个工具,但我选择使用这个工具来作为一种快速的解决之道,以便满足在主会议室的头顶屏幕上显示图像的要求。 在图像放入 Windows Azure 存储中后,可以手动刷新此页并且不休止地循环显示图像,或者在客户可与之交互的笔记本电脑上显示。 该控件和 XML 配置均来自 CodePlex (slideshow.codeplex.com)。 还有许多您可以使用的照片查看器。 如果您的解决方案采用了 Windows Azure 存储,则决定使用何种照片查看器的重要条件就是该组件必须能够从 Web URL 呈现图像。 在以前对 Windows Azure 存储的使用中,我使用了直接链接到 JPG 和 PNG 图形文件的普通的“http://”链接。

由于很快就要投入使用,因此留给我的工作时间有限,而 Windows Azure 提供了一个方法来通过使用所有这些不同的组件迅速地逐步完善。 其原因在于,该 PaaS 产品是由 .NET、Windows Server、Windows Azure 存储和 Windows Azure SQL Database 构成的。 这意味着,一旦我了解了将 Windows Azure 项目添加到 Visual Studio 2010 解决方案的细微差别后,我在 .NET、SQL Server 和 Windows Server 中的经验基本上就够用了。 我将在后面的解决方案说明中介绍其中一些技术。 最后,因为这是一个一次性的活动,所以我不需要购买基础设施。 我而是将这些组件部署到了我的 Windows Azure 帐户中,并且在完成后收回。 我在今年夏天有一个 SQL 周六的活动,因此届时将很可能继续利用这些组件,以便重复使用此会议活动系统。 因为 Windows Azure 作为一个强大的实用工具将每月计费,所以,将只基于我的使用情况对我计费,并且我可以根据用户要求进行扩展,而无需为了应对最糟糕的局面而过量供应基础设施。

Windows Azure Web 应用程序

我将从针对注册应用程序的主要入口屏幕开始,该应用程序是一个 C# .NET Web 应用程序,承载在 Windows Azure 中托管的 Silverlight 5.0 XAML 控件。 在您针对 Windows Azure 进行开发,而不是在 Visual Studio 中针对传统 .NET 项目进行开发时,您将会发现一些差异,就是在 Windows Azure 中将托管 WCF 服务和 Web 应用程序的托管服务的框架。 在我的顶层命名空间的 C# 类中有一些自定义类,用来处理从 Windows Azure SQL Database 到 Silverlight 属性的数据转换。 在 Web 层中,您将看到典型的 XML 文件(例如 crossdomain.xml),以便允许从 Web 层(即 Silverlight)到后端数据服务的跨域调用。 此 Web 应用程序现在成为我的 Windows Azure 服务中的主要角色,因为我选择了它作为我的项目中的 Web 角色。

对于此应用程序,我利用了来自 Windows Live 实验室的我喜欢的 Silverlight 控件之一(现在是 Silverlight 5.0 的一部分),即 PivotViewer 控件。

该 PivotViewer 控件通常适用于这样的应用场景:您需要实现轻松地导航和交互式 UI,以便最终用户可以很容易地对大量数据进行分类、排序和导航(参见图 1)。

The PivotViewer Control Utilized as a Tile Interface for Registered Attendees
图 1 作为注册的与会者的磁贴界面使用的 PivotViewer 控件

该 PivotViewer 还可以实现用户操作的自定义,这样,当与会者在磁贴中发现其姓名后,可以通过单击带其姓名的磁贴(参见图 2)进行签入。 Microsoft 会议的组织者选择了 PivotViewer 的基于颜色的磁贴 UI,因为它对 Windows 8 Metro 界面和 Windows Phone 磁贴界面表现出相似的主题。 对于会议的登记台,此用户体验很好,并且对于在大型触摸屏监视器上自行签入的用户,这些磁贴表现出了极佳的交互式触摸机制。 此外,该控件具有内置功能,可基于您的数据属性更改排序顺序,因此可以轻松地按姓氏对姓名进行排列。

The PivotViewer Zooms in on a Selected Name So the User Can Check In
图 2 PivotViewer 放大所选姓名,以便用户可以签入

若要修改 PivotViewer 中磁贴的外观,您需要向 PivotViewerItemTemplate 添加属性。 请注意我是如何添加颜色转换器和使用“ShortName”属性设置与会者姓名的:

<conv:TextToSolidColorConverter x:Key="colorConverter"/>
<pivot:PivotViewerItemTemplate x:Key="DemoTemplate">
  <Border Width="300" Height="300" 
    Background="{Binding Color,
    Converter={StaticResource colorConverter}}">
  <TextBlock Text="{Binding ShortName}" 
    FontWeight="ExtraBold"
    FontSize="42"HorizontalAlignment="Center" 
    VerticalAlignment="Center"
    TextWrapping="Wrap" />
 </Border>           
</pivot:PivotViewerItemTemplate>

只需遍历与会者列表,然后修改项号属性,便可以设置颜色。 在转换器类中设置针对颜色的 XAML:

var xaml = "<LinearGradientBrush xmlns='https://schemas.microsoft.com/client/2007' 
  StartPoint=\"0.5,0\" EndPoint=\"0.5,1\">" +
  "<GradientStop Color=\"Black\" Offset=\"0.0\" />" +
  "<GradientStop Color=\""+value.ToString()+"\" Offset=\"0.15\" />" +
  "<GradientStop Color=\"SlateGray\" Offset=\"0.85\" />" +
  "</LinearGradientBrush>";

为了将来自 Windows Azure SQL Database 的数据绑定到 Silverlight 前端,我创建了一个在 Windows Azure 中托管的 WCF 服务。 当您在 Windows Azure 上开发 Web 应用程序时,可以选择在您的 Windows Azure 帐户上存储您的 WCF Web 服务。 我出于充当解决方案的中间层的特定目的创建了我的 WCF 服务,并且公开来自 Windows Azure SQL Database 的数据库数据。 图 3 显示当在 Visual Studio 2010 中为 Windows Azure 创建新的 WCF 服务时您选择的项。

The WCF Service Web Role in Windows Azure
图 3 Windows Azure 中的 WCF 服务 Web 角色

在 Windows Azure 上部署解决方案时,您将需要访问 Windows Azure 管理控制台的不同区域(参见图 4)。 就 PivotViewer Web 应用程序、WCF 服务和签入 Web 应用程序而言,所有组件都部署并存储于“托管服务”部分下。 在本文的后面,我还将使用数据库、报告和存储部分。 在 Windows Azure 术语中,部署 Web 应用程序通称为使用 ASP.NET Web 角色创建托管服务,而我为访问 Windows Azure SQL Database 创建的 WCF 数据服务也是一种托管服务,但改用了 WCF 服务 Web 角色。 在每种情况下,您都将接收一个 cloudapp. net 域名,并且您的自定义服务名称将追加到该 URL 的前面。 若要使用您自己的域名,您将需要使用 MSDN 库文章“如何为 Windows Azure 托管服务配置自定义域”(bit.ly/MfSBaD) 中说明的技术,将您的域名映射到 Windows Azure 友好的 DNS 名称。

The Windows Azure Management Console
图 4 Windows Azure 管理控制台

该 WCF 服务是一个相当简单的 Web 服务,它从 Windows Azure SQL Database 查询数据以便报告与会者信息。 它还包含用于更新与会者状态的方法。 通过在 PivotViewer 磁贴上选择其姓名,用户可以在签入或签出之间切换状态。

若要访问 Windows Azure SQL Database 中的数据库,您需要使用一个连接字符串,这实际上与访问典型的 SQL Server 数据库没有区别。 将代码、代码段和以前的代码移到 Windows Azure 非常容易,因为连接类型和机制相同。 在图 5 所示的代码中(来自我的 WCF 服务,从中,我访问 Windows Azure SQL Database 中的数据库),我在利用 Entity Framework Register 类,该类采用与连接到任何其他 SQL Server 数据库所用的相同方法连接到 Windows Azure SQL Database。

图 5 使用 WCF 服务与 Windows Azure SQL Database 交互

namespace WCFServiceConference
{
  public class Service1 : IService1
  {
    // MyData is used to retrieve the attendee list      
    public List<String> MyData(int value)
    {       
      List<String> results = new List<String>();
      using (retreatEntities context = new retreatEntities())
      {
        IQueryable<Register> sortedContacts = context.registers
          .OrderBy(c => c.lastname)
          .ThenBy(c => c.org);
        // Register is the EF class
        foreach (Register sortedContact in sortedContacts)
        {
          results.Add(sortedContact.lastname + ", " + 
            sortedContact.email +
            "    (" + sortedContact.firstname + ") : " + 
            sortedContact.org);
        }
      }
      return results;
    }
    // Use this method to check in attendees and check out
    public void ToggleRegister(String lname, String fname)
    {           
      using (retreatEntities context = new retreatEntities())
      {
        IQueryable<register> sortedContacts = context.registers;
        try
        {
          Register qry = (from register in context.Registers
                          where Register.lastname == @lname &&
                          Register.firstname == @fname
                          select Register).First();
          // checkinis a binary SQL Server field, so I’m using byte array to set it
          byte[] s1 = qry.checkin;
          // We’re going to toggle the checkin value where 1 == checked-in
          if (s1[0] == 0)
          {
            s1[0] = 1;
            // Set the check-in date/time field in SQL
            qry.checkdate = DateTime.Now.ToString();
          }
          else
          {
            s1[0] = 0;
            qry.checkdate = null;
          }
          qry.checkin = s1;
          // Now let’s save our changes
          context.SaveChanges();
        }
        catch (Exception) { }
      }
    }
  }
}

在您将您的服务分布到 Windows Azure 后,可以在您的 Visual Studio 项目中引用它们,就像您通常通过服务引用所做的一样(参见图 6),使得 Windows Azure 很适合于承载您的公共 Web 服务。

Referencing the Windows Azure-Hosted WCF Service in the Web App
图 6 在 Web 应用程序中引用 Windows Azure 托管的 WCF 服务

现在,我们完成并发布了云数据库(以及要与数据交互的云服务),我可以通过使用异步服务从我的 Silverlight PivotViewer 应用程序与这些服务交互。 因为与数据服务的交互是异步的,所以,您将需要设置相应的本地事件方法,以便在数据到达时捕获这些数据并填充客户端组件。 这仅是我的例子中字符串的列表。 在更新我的类的 snames 属性时,该 Silverlight 组件将通过数据绑定接收更新,如图 7 中所示。

图 7 通过 WCF 服务借助于 Silverlight 组件中的数据绑定接收更新

public static Service1Client _sc;
// This init method is in my MainPage.xaml file
// and is called right after InitializeComponent()
public static void init()
{
  _sc = new Service1Client();
  _sc.MyDataCompleted +=
    new EventHandler<MyDataCompletedEventArgs>(_sc_MyDataCompleted);
  _sc.MyDataAsync(1);
}
public static void _sc_MyDataCompleted(object sender, 
  MyDataCompletedEventArgs e)
{
  // How many rows were returned?
snamescnt = e.Result.Count;
  snames = new List<string>();
  for (int i = 0; i < snamescnt-1; i++)
  {
    snames.Add(e.Result[i].ToString());
  }
}

该解决方案还包含一个小的 ASP.NET Web 应用程序,该应用程序显示确认、发出签入请求并且链接到 Facebook,以便与会者可以通过一个 Facebook 组链接到一起。 为更新数据库而对 WCF 服务进行的调用要简单得多,因为 ASP.NET 包括 Silverlight 所不具备的服务器端功能。 下面的代码显示使用该服务是如何容易:

String lname = Request["lname"];
String fname = Request["fname"];
// No need to use async event calls from ASP.NET // Just reference the Web service and call the method directly
Service1Client sc = new Service1Client();
sc.ToggleRegister(lname, fname);
Label1.Text = "CHECKING IN " + fname.ToUpper() + " " + lname.ToUpper();

然后,直接将此 ASP.NET 页部署到我的 Windows Azure 帐户作为 Web 角色(参见图 8)。

Adding an ASP.NET Web Role for Simple Web Pages
图 8 为简单的网页添加 ASP.NET Web 角色

Windows Phone 应用程序

Windows Phone 应用程序是使用 Silverlight 以及 Visual Studio 2010 中的 Silverlight for Windows Phone 项目模板生成的(参见图 9)。 因为该应用程序是 Silverlight,所以,我能够在 Windows Phone 上迅速生成第二种形式的应用程序,以便补充前面所述的 Web 应用程序。 其原因在于,我用来在 XAML 中绑定 Silverlight 客户端控件的技术同样用来连接到我用于 Web 应用程序的在 Windows Azure 中托管的 WCF 服务,这使得该服务可高度重复使用。

The Windows Phone Silverlight App Project Template
图 9 Windows Phone Silverlight 应用程序项目模板

我为该 Windows Phone 应用程序打造了适合会议的全方位功能,这意味着您可以查看所有登记的与会者、针对与会者运行报告并且允许 Facebook 和电子邮件交互。 因此,为了允许签入(与前述 ASP.NET 方法相反),我需要异步事件回调方法,以便用于从 Windows Azure 接收数据和更新行:

public MainViewModel() {
  this.Items = new ObservableCollection<ItemViewModel>();
  _sc = new Service1Client();
  // Same as earlier in the Silverlight PivotViewer app
  _sc.MyDataCompleted +=
    new EventHandler<MyDataCompletedEventArgs>(_sc_MyDataCompleted);
  // Used to update the row
  _sc.CheckInCompleted +=
    new EventHandler<CheckInCompletedEventArgs>(_sc_CheckInCompleted);
  // Get the data
  _sc.MyDataAsync(1);         
}

该技术与我在前面演示的在 Silverlight Windows 应用程序中使用的技术相同。 但在本例中,我使用了 ViewModel 类。

我利用了 Windows Phone“纵向”页(参见图 10)中的 ListBox 控件作为我的 MainPage,它将在该应用程序在 Windows Phone 上加载时加载(参见图 11)。

Bind Data to Silverlight in Windows Phone Apps in XAML the Same Way as in a Silverlight App
图 10 采用与 Silverlight 应用程序中相同的方法,在 XAML 中将数据绑定到 Windows Phone 应用程序中的 Silverlight

Windows Phone App with Attendee List and Menu Button Navigation
图 11 具有与会者列表和菜单按钮导航的 Windows Phone 应用程序

我从 Windows Azure SQL Database 检索了数据,并且通过遍历从我的 Windows Azure WCF 服务返回的每一行以及查询结果,从 ViewModel 填充了 ListBox:

public void _sc_MyDataCompleted(object sender, MyDataCompletedEventArgs e)
{           
  for (int i = 0; i < e.Result.Count - 1; i++)
            {
  // Parse the incoming text for attendee name, e-mail address and company name
  string strMain = e.Result[i].ToString();
  string strName = strMain.Substring(0, strMain.IndexOf('(') - 1);
  string strEmail = strMain.Substring(
    strName.Length + 2, strMain.IndexOf(')')-strName.Length-2);
  string strCompany = strMain.Substring(strMain.IndexOf(':') + 2);
  this.Items.Add(new ItemViewModel()
    {LineOne=strName, LineTwo=strCompany, LineThree=strEmail });
}

我为会议活动发布的 Windows Phone 应用程序的一个颇受欢迎的功能就是照片查看器。 在本文的开头,我提到我提供了一个图像上载工具,它用于获取图像并将图像保存到 Windows Azure BLOB 存储中。 为了在 Windows Phone 上显示它们,我只是添加了另外一页(Windows Phone 导航使用基于 Web 的页模式),用户可以从主页底部的菜单按钮导航到该页(参见图 11)。 这很简单。 只需将如下代码添加到菜单项的按钮单击事件上:

NavigationService.Navigate(new Uri("/PivotPage1.xaml", UriKind.Relative));

对于照片库页,我使用了 Windows Phone 中的 Pivot(是的,又说了 pivot 这个词)页类型,它允许用户顺畅地滚动浏览项的列表。 该 Pivot 控件获取 XAML 中 PivotItem 的列表,您使用它们在水平滚动时打造流畅的用户体验。 在本例中,我只需添加一系列 Web 浏览器控件作为 Photo 1、Photo 2、Photo 3,依此类推,如图 12 中所示。

图 12 添加一系列 Web 浏览器控件

<controls:Pivot Title="Microsoft Executive Technology Retreat">
  <controls:PivotItem Header="Photo 1">
    <Grid>
      <phone:WebBrowser HorizontalAlignment="Left" Margin="6,3,0,0"
        Name="MyWebBrowserControl" VerticalAlignment="Top" Height="605"
        Width="452" />
    </Grid>
  </controls:PivotItem>
  <controls:PivotItem Header="Photo2">
    <Grid>
      <phone:WebBrowser HorizontalAlignment="Left" Margin="6,3,0,0"
        Name="MyWebBrowserControl1" VerticalAlignment="Top" Height="605"
        Width="452" />
    </Grid>
  </controls:PivotItem>
...
<controls:PivotItem Header="Photo10">
    <Grid>
      <phone:WebBrowser HorizontalAlignment="Left" Margin="6,3,0,0"
        Name="MyWebBrowserControl9" VerticalAlignment="Top" Height="605"
        Width="452" />
    </Grid>
  </controls:PivotItem>
</controls:Pivot>

因为针对该项目的时间和资源受到约束,所以我力求其简单,令 Windows Phone 浏览器控件为每张照片指向 Windows Azure BLOB 存储的 URI。 这使得用户交互可以包含大小调整,而这在 Windows Phone Image 控件中不会自然发生。

用于向与会者发送电子邮件说明的电子邮件部分的编码也很简单。 它使用了 Windows Phone 中内置的 EmailComposeTask API:

private void ApplicationBarEmailButton_Click(object sender, 
  EventArgs e)
{
  EmailComposeTask emailComposeTask = new EmailComposeTask();
  emailComposeTask.To = ContentText.Text;
  emailComposeTask.Body = "Hi There!";
  emailComposeTask.Subject = 
    "Microsoft Executive Technology Retreat";
  emailComposeTask.Show();
}

此 API 使用用户手机上的现有联系人列表(参见图 13)。

The Windows Phone E-Mail Contact List
图 13 Windows Phone 电子邮件联系人列表

Windows Azure SQL Database 和 Windows Azure SQL Reporting Services

我为此应急解决方案创建的数据库十分简单。 因为我使用了 Windows Azure SQL Database,所以,我能够直接在典型的 SQL Server 内部工具(包括 SQL Server Management Studio、SQL Server Data Tools 和 Business Intelligence Development Studio)中生成架构。

此解决方案有一个方面尚未完成: 在线登记注册部分,它已由现有 Microsoft 托管的解决方案处理。 有趣的是,对于一家技术公司,没有现成的可为与会者提供现场交互式体验的产品,因此我在这里将介绍如何满足这个要求。 话虽如此,为此项目填充 Windows Azure SQL Database 中的数据库的方法是通过 SQL Server Integration Services (SSIS),如图 14 中所示。 这是一个相当简明的 SSIS 包,它采用已登记用户的 Excel 转储并且将它们映射到 Windows Azure SQL Database 中我的数据库架构中的字段。 在这里使用了派生列转换来修改某些字段中可能与我的架构没有完全匹配的数据。 在此类型的解决方案中,这个领域可能需要比我在本文中向您展示的内容稍微复杂一点。 但是,我希望您能够从本文中学到一些,就是在基于云的解决方案(例如此 Windows Azure 事件系统)中,SSIS 等常见工具就可以表现得很出色了,因此您不需要了解新工具。

Using SQL Server Integration Services
图 14 使用 SQL Server Integration Services

到现在为止您应该得出的结论是,用于 Windows Azure 的当前开发人员和数据管理工具就可以实现解决方案,例如这个混合解决方案。 另一个领域也表明 Microsoft 进入云计算,这就是 Windows Azure SQL Reporting,我使用该工具来提供有关会议签入人员以及时间戳和联系信息的最新报告(参见图 15)。 过去生成了任何类型的 SQL Server Reporting Services (SSRS) 报告的任何人都将熟悉此格式。 实质上,Windows Azure SQL Reporting 就是在 Windows Azure 平台上运行的云中的 SSRS。 我真的很欣赏这个事实,即 Windows Azure SQL Reporting 是纯粹基于 Web 的,无需 Silverlight。 这意味着,我能够在 Windows Phone 中呈现这个完全相同的报告,而无需为移动应用程序重新创建报告。 我只是从一个 Web 浏览器控件引用了它:

 

webBrowser1.Navigate(new 
  Uri("https://fxnxxajmxx.reporting.windows.
net/ReportServer?
%2fAttendees&rs:
  Command=Render&rc:Toolbar=false", UriKind.Absolute));

Windows Azure SQL Reporting Was Used to Provide Reports on Attendee Check-Ins图 15 使用 Windows Azure SQL Reporting 提供针对与会者签入的报告

请注意,用于 Windows Azure SQL Reporting 的 Web 服务与内部 SSRS 服务完全相同,这意味着我可以使用 URL 参数修改报告外观。 图 15 显示签入台前的志愿者在其笔记本电脑和 Windows Phones 上看到的网页视图。 一位与会者已到达并签入,此报告让志愿者可以从签入桌后找到每位与会者的正确的贴纸和徽章。

我想讲的大体上就这么多了。 有很多的移动部件,因为我需要使用尽可能多的现有技术(从而可以快速地进行配置并使用非常少的基础设施)迅速整合成一个解决方案。 这就产生了利用云计算的完美用例。 通过将 Windows Azure 用于存储、托管和网页,我可以继续使用 ASP.NET、WCF 服务和具有 Windows Azure SQL Reporting(凭借我在内部使用它的经验,我已经对它很熟悉了)的云数据库。 并且通过继续将 Silverlight 用作针对网页的 UI 技术,我可以轻松快捷地对多种机型重复使用相同的技术。

Mark Kromer 是 Microsoft SQL Server 技术专家,他在费城工作。 他以前是 Microsoft 和 Oracle Corp. 的 Microsoft BI 解决方案产品经理,以及 AT&T 和 Agilent Technologies Inc. 的软件工程师和数据库顾问。

衷心感谢以下技术专家对本文的审阅: David Ateek