2012年11月25日,星期日

谨防!使用SPHostUrl参数的SharePoint 2013 RTM应用双色球推荐一注错误/陷阱

有一个有趣的行为 SharePoint托管的应用 (或具有SharePoint托管组件的应用双色球推荐一注),许多应用双色球推荐一注开发人员有时会遇到这种情况。我在较早的文章中提到了它-当时,我说这是SP2013的预览版中的一个错误,该错误可能会在RTM版本中修复。但是它没有’!因此,开发人员需要意识到此问题,并取决于您的应用双色球推荐一注执行的操作,有可能编写特殊的代码来解决该问题。

旁注:未来的Visual Studio更新 可能 通过注入类似于以下变通办法的代码为您解决此问题(如果发生这种情况, 在此处更新此文章)。但是目前,开发人员必须自己解决问题–相关的Microsoft人士都同意,在此期间提高对这一问题的意识将是一件好事,因此,本文对我有帮助!

在这些情况下,’ll need to care:

  • 您的app is SharePoint-hosted (or 在 least has 一些 它是SharePoint托管的一部分,因此使用应用双色球推荐一注网站– 可能be it’主要是一个云应用双色球推荐一注[自动托管/提供商托管],但使用 一些 应用双色球推荐一注网络中的列表/页面)
  • 您的app accesses data in the host web, and uses the SPHostURL 为此的querystring参数

问题

To ‘enter’一个应用双色球推荐一注,最终用户点击该应用双色球推荐一注’“网站内容”页面中的s图标–我认为这是应用双色球推荐一注的大门。当他们这样做时,他们访问了一个名为appredirect.aspx的系统页面,该页面(毫不奇怪)将其重定向到应用双色球推荐一注’s home page –这样做时,它会将一些信息作为URL中的querystring参数传递给应用双色球推荐一注,包括:

  • SPHostUrl –托管网站的完整网址(即我们刚刚从中重定向到的网址)
  • SPAppWebUrl –应用网站的完整网址(即我们重定向到的网址)
  • 语言 –应用双色球推荐一注支持的语言环境
  • SPClientTag / SPProductNumber –用于识别应用双色球推荐一注的其他令牌

通常,该应用’的代码将利用这些。例如,在我的时间跟踪应用双色球推荐一注中 SPHostUrl 在某些JavaScript CSOM代码中,因为’是主机网络中的列表,我从中读取了一些信息。当用户从主机网络重定向到应用双色球推荐一注时,所有这些参数均已正确填充。但是,一旦在应用双色球推荐一注中,如果用户在其中浏览某些页面, 使用内置的面包屑链接返回到应用双色球推荐一注’s home page –参数由应用双色球推荐一注框架放回原处,但是 SPHostUrl parameter now contains the 错误 value. 具体来说,它现在具有应用双色球推荐一注Web网址的值(也位于 SPAppWebUrl 参数),这可以为您的代码带来各种乐趣!

在讨论解决方法之前,让’只需考虑这在代码中如何体现出来。 

错误的可能症状

症状1–要求在网络上列出‘wrong’ set:

让’s说您有一些代码可以在您的主机网络中提取列表(即最终用户数据)。使用Developer Site模板,如果将它们打印到屏幕上,我会看到此信息(此代码取自上一篇文章的示例3):

Lists_1stPageLoad 
..但是当我在应用双色球推荐一注中的页面/列表之间移动时,当我使用此代码返回页面时,我现在得到了一套完全不同的列表!

Lists_2ndPageLoad

症状2–通过名称引用列表会导致错误:

同样,让’s consider 一些 ‘real’我的学习者应用中的代码–这要求一个清单‘Utilisation targets’使用以下CSOM代码行:

var targetHoursList = hostWebContext.get_web().get_lists().getByTitle('Utilisation targets');

有一次,我’得到列表后,我查询与当前用户关联的项目,并最终显示‘Target’ field on the page:

FetchListData_1stPageLoad
但是,当我浏览我的应用双色球推荐一注并返回到该应用双色球推荐一注时 ’的首页,我发现相同的代码给出了错误,’m suddenly in the ‘failure handler’此代码的方法–这使用一个简单的JavaScript警报向用户显示错误:

FetchListData_2ndPageLoad

为了清楚起见,这里’s that code:

function onGetTargetHoursByRESTFail(data, errorCode, errorMessage) {
alert('Failed to get host site. Error:' + errorMessage);
}

您可以想象,这种行为会使开发人员感到困惑!而且,当然’除了这两个I之外,还有一系列潜在症状’ve listed here –这实际上取决于您的代码在做什么。什么’那是在说什么?如果它看起来像一个错误并且感觉像一个错误…!

解决方法

自从 SPHostUrl 当用户最初进入应用双色球推荐一注时,该值是正确的,解决方法是此时保存该值并从此开始引用保存的字符串。您可以将其保存在客户端的Cookie中,也可以使用带有适当密钥的服务器端持久性。我的学习者应用采用JavaScript / cookie方法。首先,我们需要一些帮助双色球推荐一注方法来获取/设置Cookie- 互联网上有很多示例,因此要么找到一个不错的jQuery插件,要么使用其他可以完成此任务的工具。一世’m使用以下代码设置会话cookie,其中包括一个jQuery插件,可简化从URL实际获取querystring参数的过程 (为缺乏信誉而道歉,但对任何作者都表示感谢):

编辑一月2013–更新了此代码,以便cookie具有PATH并进行了一些整理:

然后在我的 sharePointReady() 方法,我检测这是第一个入口(并从cookie中的查询字符串/存储中获取主机URL)还是随后的页面加载(并使用存储在cookie中的值):

希望这可以说明可能的解决方法。在生产中,您可能需要考虑服务器端选项,或者如果使用客户端cookie,则至少要加密该值–这样,使用该应用双色球推荐一注的SharePoint网站的URL’在许多客户端计算机上以纯文本形式徘徊。当然,向‘public’通过商店特别要记住这一点。

下载此代码

我已将完整的JavaScript放入.txt文件中,您可以下载- 解决SPHostUrl问题的JavaScript代码

概要

我个人觉得这很奇怪,直到到达了SP2013的发行版本,但是您就可以了。我猜’一旦发现问题,解决该问题的可能性就不会太大。总而言之,一个使用 SPHostUrl 参数可能会遇到问题,但是可以使用一些保留初始值的自定义代码来解决此问题。

正如我所说,如果Microsoft提供了修复双色球推荐一注,’会随时通知您,并且也会更新本文。

6条评论:

匿名 said...

克里斯,非常感谢您写的文章写得很全面!
I'm working on a Bing Maps app demo myself created as SharePoint-hosted, and one of my ideas is to to use data stored in lists on the host web as parameters for calling web services to eg. find locations and calculate routes to destinations. You can see the startup here: http://spviking.com/2012/11/18/a-sharepoint-2013-bing-map-app-part-1/ .
我的问题是:SPHostUrl参数是从主机Web上的列表中将数据读取到您的应用双色球推荐一注中的首选方法,还是有其他替代方法?最好的问候Bjoern H Rapp

未知说过...

Tnx的人

匿名 said...

您什么时候要了解Microsoft是基于收入需求而不是基于该软件是否真的准备发布而发布SharePoint 2013之类的软件?

这已经持续了数十年,坦率地说,'我对您(所有人中的MVP)感到失望'还没想到。

您必须为诸如跟踪url和查询字符串信息之类的简单代码编写变通方法的事实不仅令人失望,而且'这很危险:人们将在未来几年内复制/粘贴您的变通方法,因为他们要么赢了'无法知道问题何时已完全解决,或者看不到大量的注释,这些注释描述了何时/如何删除一个Microsoft解决此问题的变通方法代码。

您的"work-around"将成为危险的,永久的"fixture"在各种生产代码中。

克里斯·奥'Brien说过...

@匿名,

嗯,我想我们对此有不同的看法。

我真正能做的就是突出问题,提供解决方法的示例,并讨论处理该问题时的注意事项。也许我'是错的,但我认为'是一个积极的贡献。另外,从对话中我'与Microsoft在一起,这听起来很像是开发人员可以清楚地看到Microsoft正在提供解决方法,因为一些额外的JavaScript代码将与现有的入门代码一起添加到app.js中(开发人员必须删除/修改他们正在构建一个真正的应用双色球推荐一注)。还有什么'值得,听起来他们的代码可能与我的代码不太相似。

在我是否需要了解Microsoft如何发布软件方面-好吧,我'我已经学到了足够的知识,不会让我彻夜难眠。一世'我没有为微软辩护。一世'我什至没有说他们在这种情况下做对了。但是,我不'为帮助消除其中的一些差距并提供信息可能对那些经历同样的事情而有用的人感到很不好。对我来说'对社区的积极贡献。

谢谢,

克里斯。

未知说过...

克里斯,
感谢您再次保存我们的培根!很棒的文章,简单易行且易于修复,并且全面都有良好的编码习惯。
我看不到您的方法有任何内在的危险。跟踪用户并不是什么新鲜事,我认为太多的开发人员变得懒惰了,他们期望他们使用什么框架来为他们做太多的工作。

同样,尊重一个人甚至不会站出来发表自己的负面和毫无意义的评论。

克里斯·奥'Brien说过...

@Alex,

谢谢-感谢信任票。

干杯,

克里斯。