locked
[常见问题回答] 如何迁移你的Silverlight应用到Windows应用商店应用? RRS feed

  • 常规讨论

  • 近年来,出现了很多由Silverlight编写的应用程序。毫无疑问,很多开发人员希望将这些程序迁移至Windows Store程序。以下给出了一些指导性建议,帮助开发人员完成程序的迁移。

    问:将Silverlight应用程序迁移到Windows Store平台时需要注意什么?

    问:将Silverlight应用程序迁移到平台的方式是什么?


    • 已编辑 Dino He 2012年9月26日 4:31
    2012年9月26日 3:26

全部回复

  • 问:将Silverlight应用程序迁移到Windows Store平台时需要注意什么?

    答:虽然大多数 ASP.NET Web Forms程序都使用以服务器为中心的模式,但是大多数Silverlight程序都使用以客户端为中心的模式。Silverlight客户端程序展现UI,处理用户交互,并且发送HTTP请求到一个后台服务处理业务逻辑。Windows Store程序使用相同的模式。此外,Silverlight使用XAML框架,而XAML也是Windows Store程序所支持的框架之一,因此将Silverlight程序迁移至Windows Store程序要比迁移ASP.NET程序容易得多。现有的架构以及很多代码都可以复用。

                                                    图一

    (图一为Windows RT框架图,目前给予windows RT的程序都被命名为Windows应用商店应用)

    但是区别还是有的。

    首先,Silverlight既支持浏览器集成模式,又支持无浏览器模式(OOB)。但是全部Windows Store程序都使用无浏览器模式。很多Silverlight程序并不支持OOB,因此要将它们迁移到Windows Store,开发人员就不能再依赖于浏览器的功能,例如自动cookie管理,了。

    此外,很多复杂的Silverlight控件,例如DataGrid,在Windows Store程序中并没有。Windows Store程序有一套自己的复杂控件。

    最后,Windows 8提供了很多特有的功能,例如application bar, contracts, live tiles, 等等。在合适的场合下,Windows Store程序应该使用这些功能。

    开发人员可以选择HTML或者XAML框架开发Windows Store程序。使用XAML时,可以选择.NET或者C++。通常Silverlight程序使用XAML + .NET,因此本文主要讨论XAML + .NET的模型,这是推荐的将Silverlight程序迁移至Windows Store程序的方式。如果有必要,可以使用C++构建对性能要求极高的组件(例如使用DirectX显示复杂的图形),并且在.NET程序中使用那些组件。C++也可以用来访问无法直接在.NET中访问的库,例如Media FoundationC++程序不能使用.NET程序集,但是可以使用很多C++库。如果跨平台是优先考虑的事项,开发人员可以选择HTML + JavaScript,因为几乎所有平台都支持它。但是在绝大多数场合下,最好将Silverlight程序迁移至使用XAML + .NET开发的Windows Store程序。



    • 已编辑 Dino He 2012年9月26日 4:42
    2012年9月26日 4:21
  • 问:将Silverlight应用程序迁移到平台的方式是什么

    答:总结来说,使用以下几个步骤完成迁移。     

      • 修改命名空间和程序集
      • 迁移导航模式
      • 迁移控件
      • 移除依赖于浏览器的代码
      • 修改访问服务的代码
      • 如果有必要,修改服务
      • 添加Windows 8特有的功能
      • 迁移身份验证

    修改命名空间和程序集

    开发人员需要做一些高层次的修改。例如,SilverlightWindows Store程序使用的很多命名空间都是不同的。Silverlight命名空间通常以System开头,而Windows Store的命名空间通常以Windows开头。

    XAML命名空间也需要修改。

    Silverlight使用如下语法:

    xmlns:local="clr-namespace:TheNamespace"

    Windows Store的语法是:

    xmlns:local="using:TheNamespace"

    程序集引用也需要修改。很多Windows Store引用都是使用C++编写的WinRT组件而不是CLR程序集。开发人员引用.winmd文件而不是.dll文件。某些CLR程序集也可以在Windows Store程序中使用,包括常用的第三方程序集,例如Json.NET。但是如果一个CLR程序集依赖于WinRT所不支持的功能(例如Workflow FoundationGDI+),就不能使用了。好在绝大多数这类程序集本身也无法在Silverlight中使用。另一方面,Silverlight特有的程序集也无法在Windows Store程序中使用。开发人员必须寻找类似的桌面版的程序集。使用Visual Studio创建新的Windows Store程序时,正确的文件已经被引用好了。

    迁移导航模式

    Silverlight导航模式和Windows Store程序稍有差异。Silverlight使用URI,但是Windows Store使用类型。

    考虑一行典型的Silverlight导航代码:

    this.NavigationService.Navigate(new Uri("/Read", UriKind.Relative));

    Windows Store程序中应该写:

    this.Frame.Navigate(typeof(Read));

    因为使用了类型而不是URI, URI mapper就不再需要了。

    Windows Store程序并不是基于浏览器的,因此没有现成的后退/前进按钮。如果有必要,开发人员可以提供他们自己的后退/前进按钮,并实现相关功能。

    如果使用Visual StudioGrid Application项目模版创建项目,会生成一个基本的导航框架以及一个LayoutAwarePage。这个类包含了一个功能全面地后退按钮。LayoutAwarePage还可以帮助程序在不同的布局下正常显示,例如不同的设备方向和snapped view。开发人员可以使用Basic Page模版(不是Blank Page)创建自LayoutAwarePage继承的页面。

    迁移控件

    Silverlight提供了很多服务器控件,有些在Silverlight runtime中提供,也有些在额外的类库,例如Silverlight SDKToolkit,中提供。

    很多在Silverlight runtime中提供的控件也在Windows Store程序中提供了,而且用法几乎是完全一样的。例如,ButtonTextBox就完全一样,Windows Store程序的ListBox想要使用自定义ItemTemplate的方式也和Silverlight程序一致。

    但是大多数在Silverlight SDKToolkit中提供的控件并无法在Windows Store程序中找到。尤其是DataGrid特别需要注意。DataGrid不仅仅常常被用于面向企业的应用程序,也常常用于面向消费者的应用程序。Windows Store提供了自己的一系列控件,例如GridView就提供了展示一组数据的功能,它支持诸如分组之类的高级功能。一个只读的DataGrid可以很方便地被迁移至ListBox或者GridView。如果DataGrid需要内置编辑,开发人员应当考虑这个场景是不是适合被迁移到Windows Store程序。Windows Store程序可以被用于平板电脑,有些平板电脑可能没有物理键盘,因此通常不应该要求太多用户输入。在Windows 8上,开发人员可以继续使用Silverlight开发只需要支持PC的程序。

    虽然有些控件不同,但是控件模型是很相似的。Windows Store程序的ContentControl也可以用来展现任何contentItemsControl使用相同的数据绑定模型以及data template写法,样式和template模型也几乎完全一致。因此开发人员并不需要学习一套新的框架,而只需要学习一些新的控件。

    请自http://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh780615.aspx开始学习Windows Store程序中用于展示数据的控件。

    移除依赖于浏览器的代码

    某些Silverlight程序依赖于浏览器的功能,但是Windows Store程序并不是在浏览器中运行的,因此那些功能必须被移除或者修改。常见的场景有:

    • 基于浏览器的导航模式:请参考上述说明迁移导航模式。
    • 依赖于cookie,例如常用的session ID开发非浏览器程序时,推荐使用无状态的服务访问模式。某些有状态服务其实是可以被迁移成无状态服务的。例如,很多有状态场景都需要用户登录网站,并且建立一个session。现代程序则常常使用token而不是session处理身份验证。之后,本文会介绍如何迁移身份验证相关的代码。
    • HTML页面集成:开发人员必须使用纯HTML模式(选择HTML + JavaScript),或者纯XAML模式,它们不能被同时使用。但是和UI无关的组件是可以复用的。例如,开发人员可以使用.NET或者C++开发一个自定义WinRT组件,然后再一个JavaScript程序中使用。

    修改访问服务的代码

    Silverlight既支持browser HTTP stack,也支持client HTTP stackBrowser HTTP stack有很多局限性,例如只支持GETPOST,并且无法正确识别status code。但是它有一个很好的功能:自动管理cookie。一个典型的使用forms authentication验证的Silverlight程序依赖于cookie,因此很多开发人员选择了browser HTTP stack

    Windows Store程序只支持client HTTP stack它支持全部HTTP methods和全部status code,但是它不会自动管理cookie。如前所述,通常推荐使用无状态服务,因此cookie就不是必要的了。

    Silverlight同时支持SOAPRESTWindows Store程序也是如此。在访问和Silverlight兼容的SOAP服务时,开发人员可以像平常一样添加服务引用,然后使用WCF客户端类库访问服务。大多数代码和Silverlight都是一样的,而且同样只能使用异步方式访问服务注意只有使用.NET的程序可以使用这种方式,C++程序必须使用Windows Web Services,而JavaScript程序必须寻找第三方SOAP类库。

    在访问REST服务时,开发人员可以继续使用HttpWebRequest,但是WebClient就不能使用了。不过,Windows Store程序可以使用HttpClient,它比WebClient强大很多,使用起来又比HttpWebRequest简单很多。和async/await这样的新关键词结合使用的话,开发人员就不需要考虑回调了。在很多情况下它都可以代替HttpWebRequest。更多信息请参考http://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh781239.aspx。还是要注意HttpClient只能在.NET中使用,C++开发人员必须使用IXMLHTTPRequest2JavaScript开发人员可以使用xhrXMLHttpRequest,或者jQueryajax等第三方类库。

    为了解析自服务返回的数据,开发人员可以使用现有的技能,例如使用LINQ to XML解析XML数据,使用Json.NET解析JSON数据。

    如果一个REST服务符合OData规范,开发人员还是可以使用Visual Studio的添加服务引用功能以及WCF Data Services客户端类库来访问该服务。

    某些Silverlight程序使用了WCF RIA ServicesWCF RIA Services不能直接和Windows Store程序集成。但是WCF RIA Services可以有限地公开SOAP/OData端点,因此开发人员还是可以使用那一部分的功能。

    修改服务

    上面已指出,Silverlightbrowser HTTP stack只支持GETPOST,并且识别大多数的status code。因此现成的针对Silverlight开发的REST服务很可能采用了一些workaround

    但是一个设计良好的REST服务应该符合一定的规约。例如,通常一个REST服务至少会使用4HTTP methods: GET/POST/PUT/DELETE,而且应该返回一个合适的status code(例如400代表bad request)。这些功能在Windows Store程序中都是支持的,所以开发人员可以考虑修改现有的服务,让它们符合REST规约。不要总是用POST,不要总是返回200

    此外,对于依赖于WCF RIA servicesSilverlight程序,开发人员必须修改服务以公开SOAP/OData端点,或者索性直接将服务用SOAP/REST/OData改写。考虑到今后的扩展,推荐使用REST或者OData,因为几乎所有平台都支持它们。

    添加Windows 8特有的功能

    Windows Store程序不只是普通的应用程序。它们提供了很多特有的功能和丰富的用户体验。下面列出常见的功能。

    • Application bar: Application bar提供了一个标准的用户交互模型。用户不需要在页面上寻找各式各样的超链接/按钮,而可以到统一的地方去找。更多信息请参考http://msdn.microsoft.com/en-us/library/windows/apps/xaml/Hh781230(v=win.10).aspx
    • Live tile: Live tile是固定在Windows开始页面上的图标。它们不是静态的图片,用户看一眼这个图标,就可以知道应用程序的内容。即使应用程序不在运行,这些tile也可以定时从本地存储或云云服跟新数据。除了主tile外,每个程序还可以创建多个secondary tile。更多信息请参考http://msdn.microsoft.com/en-us/library/windows/apps/xaml/Hh868259(v=win.10).aspx
    • Search contract: 对于很多网络程序而言,搜索都是很关键的。常见的做法是在每个页面的上方加一个搜索框。在Windows 8中,search contract提供了统一的地方供用户搜索。使用search contract,用户不仅仅可以搜索当前程序的内容,还可以搜索其它地方,例如文件。更多信息请参考http://msdn.microsoft.com/en-us/library/windows/apps/xaml/Hh868180(v=win.10).aspx
    • Share contract: 大多是程序都不是孤立的。它们可以通过共享的方式和其它程序打交道。share contract提供了一个通用的地方让应用程序们可以共享内容。例如,假设一个用户想要在某个程序内共享一个链接,只要 share contract被启用,所有支持接受链接的程序都会被列出来。加入这个用户常常使用Facebook,他/她很可能已经安装了一个Facebook程序,那么这个链接就能被共享到Facebook上了,用户不需要打开Facebook网站。更多信息请参考 http://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh871363.aspx
    • Settings contract: Settings contract提供了一个统一的地方设置应用程序。用户不需要为每个程序学习一个新的打开设置的方法。更多信息请参考 http://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh770543.aspx
    • 内置的主题动画: Windows Store程序使用和Silverlight一样的动画框架,但是在这个基础上还提供了很多主题动画,它们进一步方面了动画的开发。使用得当的话,动画可以大幅提高用户体验。更多信息请参考 http://msdn.microsoft.com/en-us/library/windows/apps/xaml/Hh452701(v=win.10).aspx

    迁移身份验证

    很多Silverlight程序使用ASP.NET membership实现身份验证,使用 roles来授权。如果程序只需要支持浏览器,那就足够了。浏览器可以将身份验证和授权全部移交给服务器。Cookie可以用来存储token,每个请求都包含这个可以被服务器验证的cookie

    另一方面,非浏览器客户端就没有cookie可以使用了。为了让登录的过程更安全,客户端程序绝对不能直接要求用户在自己的程序中输入用户名和密码。一个常见的做法是在程序中嵌入一个浏览器控件,让浏览器处理身份验证,使用JavaScript notification将包含token的结果通知宿主程序。然后宿主程序就可以使用这个token和服务器进行交互了。

    Windows Store程序(更确切的说是WinRT)提供了一个系统组件来简化这一流程。开发人员可以使用WebAuthenticationBroker登录任何符合OAuth标准的服务。使用WebAuthenticationBroker,开发人员不需要考虑如何和浏览器交互,同时WebAuthenticationBroker还简化了SSO (single sign on)。更多信息请参考http://msdn.microsoft.com/en-us/library/windows/apps/xaml/Hh465283(v=win.10).aspx

    在服务器端,身份验证的逻辑也需要进行修改。ASP.NET MVC 4新的项目模版内置了和常见的网络身份验证供应商(例如Windows Live IDFacebook)集成的功能,开发人员只需要写一点点代码就可以将身份验证的任务托管给它们。这些项目模版使用DotNetOpenAuth这个开源的类库。开发人员可以将MVC项目模版迁移至ASP.NET Web API,虽然这需要一些工作。本文提供的示例程序已经做好了这些工作。

    2012年9月26日 4:27