我可以从Azure Blob或CDN托管我的Silverlight XAP文件吗?

时间:2014-11-17 21:00:50

标签: silverlight silverlight-5.0 cdn azure-storage-blobs

让客户遍布全球,我们遇到了一些严重的加载延迟,最初从各个位置检索XAP。希望我们可以在云端托管已编译的XAP,根据最终用户的位置提供更紧密的下载。

我们正在使用RIA服务,但由于数据连接,与内部服务的连接等,服务端点需要保留在本地服务器上。

我们如何使用基于云的服务分发XAP,同时让它继续像目前一样运行?

编辑:由于我自己完成了这个并找到了答案,所以我已经完成了我之前完成的步骤,并且提出了更好的Q&答案。 ;一种格式,以及其他任何从第0步接近问题的人。

1 个答案:

答案 0 :(得分:0)

在对此进行锤击之后,我找到了解决方案,使其几乎完全正常工作。

  1. 使用绝对URI更新RIA服务端点,以返回托管页面,而不是相对于XAP位置本身。
  2. 确保从XAP中的任一资源加载所有图像(等)内容,或确保将其上载到Azure存储Blob。 任何相对路径都会尝试解析到XAP位置。
  3. 生成XAP文件并上载到Azure存储Blob。您需要确保XAP的Content-Typeapplication/x-silverlight-app。我使用Azure Storage Explorer完成了这项工作。您可以通过双击打开项目的属性来设置Content-Type,但是,甚至更好的是,您可以点击“设置”设置为“编辑内容类型”并添加.xap为{的规则{1}}以便在您上传时自动设置。
  4. 确保您有适当的跨域政策。
  5. 更新您的托管页面以提供新的application/x-silverlight-app。此外,如果尚未设置,则需要添加source参数,因为对于跨域,此值默认为false。

  6. 对于第1项,我完成了使用如下代码:

    enablehtmlaccess

    对于第4项,我的代码如下:

    var u = HtmlPage.Document.DocumentUri;
    Site = u.AbsoluteUri.Substring(0, u.AbsoluteUri.LastIndexOf('/'));
    MyServiceUri = new Uri(Site + "/ClientBin/My-Namespace-MyService.svc", UriKind.Absolute);
    

    最后要注意的一点是:如果使用自定义初始屏幕,那么请弄清楚如何使其工作。我不知道怎么回事。我发现如果你将<param name="source" value="<%= Request.Url.Scheme %>://mytest.blob.core.windows.net/my-container/MySilverlightApp.xap"/> <param name="enablehtmlaccess" value="true" /> 设置为splashscreensource文件的位置,那么它就不会加载。它只显示基本的silverlight负载百分比屏幕,这至少可以正确地报告负载%。为了加载自定义启动画面,它似乎仅在包含内联时才起作用。您可以通过以下方式执行此操作:

    .xaml

    但是,虽然这将显示自定义初始屏幕,但如果您在初始屏幕上有任何进度报告,它将无法工作。 <script id="xamlSplash" type="text/xaml"> <%= System.IO.File.ReadAllText(Context.Server.MapPath("~/Loading.xaml")) %> </script> <object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%"> <param name="splashscreensource" value="#xamlSplash" /> 引用的javascript函数永远不会触发。我找不到为什么会这样,也找不到解决方法。您只需要使用旋转动画等代替实际的%进度指示器。