使用WindowsAzure和W.doc_第1页
使用WindowsAzure和W.doc_第2页
使用WindowsAzure和W.doc_第3页
使用WindowsAzure和W.doc_第4页
使用WindowsAzure和W.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

使用 Windows Azure 和 Windows原文链接:Diaz和Max Zilberman在过去30年,我们经历了计算机硬件行业的爆炸式增长。从大型机到台式机再到手持设备,虽然硬件的体积缩小了,但功能却越来越强大。开发人员在某种程度上有点被计算能力的这种持续增长宠坏了,现在他们希望自己为其编写应用程序的每台设备都拥有无限的计算机资源。过去,代码的大小和效率曾经是编程的重要考虑因素,很多年轻的开发人员对这段历史没有任何印象。最新的开发趋势是追随智能手机日益流行的脚步。在为智能手机设备编写代码时,许多开发人员必须适应这样一个现实:尽管今天的手机功能要比几年前的设备强大很多,但还是面临限制。这些限制与大小、处理器能力、内存和连接性有关。您需要了解在创建移动应用程序时如何突破这些限制,从而确保提供良好的性能和最佳的用户体验。导致应用程序的性能不甚理想的某些原因与开发人员糟糕的设计决策有直接的关系。但在其他情况下,其中有些因素不受开发人员的直接控制。第三方服务较慢或脱机、移动宽带连接断开或您所处理数据的特性(如流媒体文件或大型数据集)可能会导致应用程序性能较差。无论原因是什么,应用程序最终用户感知的性能必须是任何软件开发人员所关注的头等大事之一。在本文中,我们将介绍一些有关以一种可提供完美用户体验和轻松缩放功能的方式设计可靠的数据驱动Windows Phone 7应用程序的首要注意事项。让我们先花一点时间设置一种方案,我们可以在这个方案中考察一些设计和编码选择。举个例子,我们将使用一个虚构的旅行信息应用程序,该应用程序提供有关用户选择的航班的信息。如图1所示,该应用程序的主屏幕上显示一些数据元素,包括当前的天气和航班状态。您可以看到,随着应用程序变得更具表现力且越来越以数据为中心,开发这样的应用程序也变得更具挑战性。在越来越多的方面,您的代码已经无能为力了。图1航班信息示例应用程序UI线程阻塞首先,我们来看一下UI。如果像对台式机编码那样设计应用程序,那么很容易就会将模式搞错,因此让我们先了解一些手机特定的UI问题。当应用程序未按预期对用户命令做出响应时,此时给整体用户体验带来的影响是显著的。对滑擦、点按或挤压操作响应缓慢可能会对应用程序的整体吸引力不利。但这些是可以预期并解决的相当简单的问题,正如您将要看到的。考虑使用ListBox。当ItemTemplate包含图像或从源加载数据时,UI线程很有可能将被阻塞,UI在请求或计算完成前将一直暂停。因此,当您开发UI时,一种方法就是在UI线程外执行长时间计算(包括WebRequest)。实际上,这对任何应用程序(移动或非移动)来说都是一种好方法。当您将大量的项目绑定到ItemSource而对注入ListBox控件的项目数没有限制时,也可能会产生性能问题。一种更好的方法是绑定一个ObservableCollection,然后每隔20至30毫秒向该集合填充一些项。这将解除UI线程的锁定以响应用户。在我们的示例应用程序中,我们还在屏幕上使用了大量图像。ListBox需要实际下载图像才能显示相应数据。这种方法看似不错,但在UI线程上执行此工作将阻止用户进行任何手势输入。在后台线程上加载图像将解决很多内存要求和释放UI线程方面的问题,同时也使应用程序速度加快。必须呈现我们向用户显示的全部内容。呈现需要布局、对齐和计算才能正确显示。随着越来越多的层添加到UI中,计算和整体呈现成本也随之增加。尽管Silverlight已虚拟化UI,但未虚拟化要绑定的数据。这意味着,如果我们将10,000个项目绑定到ListBox,Silverlight将需要实例化所有10,000个ListItem,然后它们才会呈现出来。请注意您正在数据绑定的项目并保持绑定集尽可能小。如果需要处理大型数据绑定项目集,请考虑在后台动态处理呈现。当然,桌面应用程序同样如此,只是这些选择的影响在手机上有所扩大而已。ValueConverter可能会对呈现性能产生巨大的影响,因为它们是使用自定义代码定义的,无法在实际元素呈现和布局之前预先确定和缓存呈现。处理数据接下来,我们需要讨论Windows Phone 7中的数据存储。让我们直奔主题:没有任何关系数据库引擎可供开发人员使用。SQL Server Compact(SQL CE)随Windows Phone 7操作系统一起安装,但当前没有任何API可供开发人员使用。因此,创建一个数据库用来存储应用程序数据(在我们的示例中为旅行信息)行不通。也就是说,可使用各种不同的选项使数据进出我们的应用程序。常用方法是使用云服务(如Windows Azure)来持久保留数据。用于生成应用程序的服务层的技术有很多,REST和SOAP是最受欢迎的。很多开发人员都首选SOAP,但我们认为REST可提供一种更高效且更易于实现的方法用来生成数据请求。我们采用几种方法向应用程序提供数据,通过使用下面这样的REST表达式可以访问这些方法:/Trip/Create/PHL-BOS-SEA/xxxx/2010-04-10/Flight/CheckStatus/US743利用REST,我们可将XML或JSON用作消息格式。从Web前端的角度出发,我们选择了ASP.NET MVC框架(/mvc),因为它允许我们使用自定义视图处理请求并返回任何类型的标记。我们的示例应用程序需要处理旅行和航班信息,因此,我们创建一个FlightController和一个TripController,用来截获对此类信息的请求:/GET:/Flight/CheckStatus/US743public ActionResult CheckStatusByFlight(string flightNumber)return CheckStatus(flightNumber,DateTime.Now);/GET:/Flight/RegisterInterest/US743/2010-04-12public ActionResult CheckStatus(string flightNumber,DateTime date)Flight f=new Flight(flightNumber,date);GetFlightStatus(f);return new XmlResultView Flight(f);为了提供简化的访问方法并节省几个字节的带宽,若日期是今天,我们可能会设计一种快捷方法用来获取此数据,而不用隐式指定今天的日期。缓存和持久的数据航班状态服务是我们应用程序中不受我们控制的一个元素,因此它将是性能难题的一部分。由于一个成功的应用程序可能会接收到相当多的请求,因此考虑使用缓存策略十分重要。通常,航班越临近起飞,对航班信息的请求数量预计也会越来越多。较多的几乎并发的请求不仅影响应用程序的性能,还会影响存储和操作数据关联的成本。一般而言,Windows Azure应用程序会累计请求和返回时的带宽费用,而航班信息服务也会带来访问费用。返回的数据量需要不超过应用程序所需的数量。Windows Azure平台提供范围广泛的数据存储选项,从表、Blob和队列到通过SQL Azure实现的类似关系数据库的存储。我们决定使用SQL Azure,因为它使用熟悉的SQL Server编程技术,并且使我们能够轻松存储和访问缓存的航班数据和持久的旅行信息。图2显示我们使用实体框架设计的简单存储层。图2航班数据存储架构返回数据我们通过自定义视图将数据返回到客户端。由于我们使用的是ASP.NET MVC,因此每个视图都需要从ActionResult派生并实现ExecuteResult。前面曾提到,我们可以通过REST服务提供XML或JSON表示形式的航班信息。首先,我们看一下XML选项。生成XML的序列化程序需要一种类型,因此我们创建一个泛型类,如图3中所示。图3序列化XML public class XmlResultView T:ActionResultobject _model=null;public XmlResultView(object model)this._model=model;public override void ExecuteResult(ControllerContext context)/Create where to write MemoryStream mem=new MemoryStream();/Pack characters as compact as possible,/remove the decl,do not indent.XmlWriterSettings settings=new XmlWriterSettings()Encoding=System.Text.Encoding.UTF8,Indent=false,OmitXmlDeclaration=true;XmlWriter writer=XmlTextWriter.Create(mem,settings);/Create atype serializer XmlSerializer ser=new XmlSerializer(typeof(T);/Write the model to the stream ser.Serialize(writer,_model);context.HttpContext.Response.OutputStream.Write(mem.ToArray(),0,(int)mem.Length);我们同样可以轻松地将JSON用于我们的数据。解决方案中唯一会改变的元素将是ExecuteResult方法的内容。使用JsonResult,只需几行代码即可从我们的服务中生成JSON返回结果:/Create the serializervar result=new JsonResult();/Enable the requests that originate from an HTTP GETresult.JsonRequestBehavior=JsonRequestBehavior.AllowGet;/Set data to returnresult.Data=_model;/Write the data to the streamresult.ExecuteResult(context);将数据保存到实际设备中会怎么样?每次用户需要访问旅行信息时都强制应用程序从服务中提取数据没有意义。虽然Windows Phone 7中不存在关系数据存储,但开发人员却可以访问一种称为独立存储的功能。此功能的工作方式与Silverlight 4独立存储相似,但没有大小限制。在手机上保存和检索数据需要两种主要方法:SaveData和GetSavedData。图4中所示示例演示我们如何将这两种方法用于航班信息应用程序。图4保存并检索本地数据public static IEnumerable Trips GetSavedData()IEnumerable Trips trips=new List Trips();tryusing(var store=IsolatedStorageFile.GetUserStoreForApplication()string offlineData=Path.Combine(TravelBuddy,Offline);string offlineDataFile=Path.Combine(offlineData,offline.xml);IsolatedStorageFileStream dataFile=null;if(store.FileExists(offlineDataFile)dataFile=store.OpenFile(offlineDataFile,FileMode.Open);DataContractSerializer ser=new DataContractSerializer(typeof(IEnumerable Trips);/Deserialize the data and read it trips=(IEnumerable Trips)ser.ReadObject(dataFile);dataFile.Close();else MessageBox.Show(No data available);catch(IsolatedStorageException)/Fail gracefullyreturn trips;public static void SaveOfflineData(IEnumerable Trips trip)tryusing(var store=IsolatedStorageFile.GetUserStoreForApplication()/Create three directories in the root.store.CreateDirectory(TravelBuddy);/Create three subdirectories under MyApp1.string offlineData=Path.Combine(TravelBuddy,Offline);if(!store.DirectoryExists(offlineData)store.CreateDirectory(offlineData);string offlineDataFile=Path.Combine(offlineData,offline.xml);IsolatedStorageFileStream dataFile=dataFile=store.OpenFile(offlineDataFile,FileMode.OpenOrCreate);DataContractSerializer ser=new DataContractSerializer(typeof(IEnumerable Trip);ser.WriteObject(dataFile,trip);dataFile.Close();catch(IsolatedStorageException)/Fail gracefully处理网络故障移动设备使用的网络可能有各种可变的连接,有时会因位置、拥塞甚至是用户手动断开连接而变得完全不可用(例如,当使用航班模式时)。作为生活中的现实情况,您必须接受这一点。作为移动应用程序开发人员,我们必须在生成应用程序时将这点考虑在内。另一种类型的网络故障是服务层失败。很多移动应用程序都使用第三方服务的数据。这些服务可能没有附带服务级协议,这样您的应用程序就受控于提供商了。换句话说,它不受您的控制,您必须准备好处理中断情况。无论网络故障的来源是什么,您都仍然需要尽可能提供最佳用户体验。发生任意类型的网络故障时,您都需要提供某一级别的功能。对于我们的航班状态应用程序,这意味着我们希望允许用户访问尽可能多的信息,即使在服务器或客户端的网络连接断开的情况下。可通过多种方法实现这一点。现在,我们将集中讨论三种可用来实现这一点的简单方法:在数据可用时获取数据,本地缓存数据,在您控制的服务器上缓存数据。使用推送通知当用户将旅行信息输入到应用程序时,该信息将上载到云服务。然后,该服务将不断轮询提供其航班和天气数据的各种服务。它还查找随时间变化的数据更改,如航班状态更改或报告延误的机场。发现更改时,您需要尽可能迅速高效地将该信息提供给用户。为此,一种方法是让该服务将信息推送至客户端应用程序。这将在数据变得可用时为用户提供对最新可用数据集的访问。由于将数据推送至了客户端,因此即使用户丢失其网络连接,数据也可用。我们可借助Windows Azure服务通过使用Windows Phone推送通知实现这一点。Windows Phone推送通知功能由三部分组成:监视服务、Microsoft推送通知服务和消息处理方法。监视服务是一种云服务,它不断查找有关我们的应用程序的新信息。我们将在稍后详细讨论这个问题。推送通知服务是Microsoft托管服务的一部分,用于将消息中继到Windows Phone 7设备。该服务可供所有Windows Phone 7应用程序开发人员使用。消息处理程序方法执行其名称所暗示的操作:只接收来自推送通知服务的消息。Windows Phone 7中存在三种默认通知类型:Tile、Push和Toast通知。通知是用户体验中的重要组成部分,您需要仔细考虑它的使用方式。重复通知或侵入式通知会降低您的应用程序及设备上运行的其他程序的性能。这些通知还会打扰用户。请考虑发送通知的频率以及您希望引起用户注意的事件类型。在Windows Phone 7中,通知是通过批处理方式传递的,因此事务可能不是即时的。通知的及时性将得不到保证,而且将由该服务决定如何将通知传递给客户端;该服务会尽力确定要多快才能将消息传递到手机。推送通知的工作流是:客户端应用程序请求与推送通知服务建立通道连接。推送通知服务使用通道URI响应。客户端应用程序向监视服务发送包含推送通知服务通道URI以及负载的消息。当监视服务检测到信息更改时(在我们的示例应用程序中为航班取消、航班延期或天气警报),它会终止向推送通知服务发送消息。推送通知服务将消息中继到Windows Phone 7设备。消息处理程序处理设备上的消息。本地缓存数据使数据可用于应用程序的另一种方法是本地缓存数据,这样UI中将始终存在一些数据。然后,您可以通过其他方式在后台更新本地数据(如果可能)。此方法的好处是,应用程序在加载后迅速可用,即使必须在后台以异步方式更新信息也是如此。简而言之,使用独立存储可保存最新的数据集。当应用程序打开时,它立即获取本地独立存储中可用的所有数据并进行呈现。与此同时,应用程序还调用Windows Azure服务来获取更新的信息。如果发现新信息,则序列化新信息并传送至设备,独立存储得到更新,而您再次用更新后的信息呈现UI。为了获得更好的用户体验,您可能需要在UI中指定刷新信息的时间和日期。顺便提下,如果应用程序使用的是Model-View-ViewModel(MVVM)设计模式,则可通过Silverlight数据绑定功能自动更新UI。有关MVVM和Silverlight的详细信息,请参阅Robert McCarter的文章使用Model-View-ViewModel的问题和解决方案(位于/magazine/ff 798279上)。在服务器上缓存数据在数据变得可用时将数据直接推送到应用程序与将数据存储在设备上之间还有一个中间过程:从第三方服务获取数据,并将数据缓存在云应用程序中,直到Windows Phone 7应用程序请求数据。这项技术要求在应用程序中有一个新的抽象层。实际上,这里的目标是从应用程序中删除第三方服务的依赖项。您的服务提取并缓存第三方服务依赖项的数据。如果第三方服务出现故障,您至少在缓存中有一些数据可提供给设备上的应用程序。像这样的服务很容易克隆或扩展,以便从各种服务中提取数据,这样可减少对任一供应商或数据源的依赖,从而使得更换供应商容易多了。有关如何在Windows Azure中设置注重数据的解决方案的详细信息,请参阅Kevin Hoffman和Nathan Dudek发表的使用Windows Azure存储增强应用程序的引擎(/magazine/ee 335721)。此外,Paul Stubb的文章创建用于SharePoint 2010的Silverlight 4Web部件虽然未直接重点介绍Windows Phone 7方案,但对于了解Silverlight和Web服务的数据绑定设计来说也是一篇好文章(/magazine/ff 956224)。监视服务前面曾提到,通知功能是航班状态应用程序的重要组成部分。这项功能实际由该应用程序中的几种不同服务组成。监视服务对于该应用程序发挥作用可能最为重要,该服务定期轮询第三方数据服务,并将像航班延期、机场延误和天气警报这样的信息中继到设备。在我们的应用程序中,监视服务读取航班和机场代号的当前列表并使用此信息来收集相关数据。然后,将此信息作为缓存项存储回SQL Azure数据库中,以便可

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论