分类存档: SharePoint 发展

HTTP 406 使用角 $http.get 针对 SharePoint 休息结束点时的错误

更新: 马克 AD ndersson 指出信息这个伟大的作品: http://blogs.office.com/2014/08/13/json-light-support-rest-sharepoint-api-released/. 这也解释了很多 :).

这可能是最糟糕的一篇博客文章标题过! 安美居.

我通常做所有我针对 O365 实例的原型. 我有我个人的实例,所以,我不需要担心影响别人. 顺便说一句 — — 记得当我们称之为进行虚拟机周围长满了苔藓 — — 我们笔记本电脑上 SQL Server, IIS, 决定 HYPER-V vs. VMWare? 安美居......

已经开发了一个应用程序,在这种环境不使用角, 除其他外, 这:

$http.get(serverUrl)
.成功(功能(数据, 状态, 标题, 配置) {

var getLinksResponse = 数据;

getLinksResponse.value.forEach(功能(结果) {

// 和这么泡沫

这两种不同 SharePoint 在线环境中工作正常. 不过, 当我的同事将其移植到一个 Cloudshare 实例时, 他正 HTTP 406 错误 (其中第一次我收到过那个, 所以...耶, 我想). 我们做了一些研究,发现"接受"标题关闭. SharePoint 在线感到满意:

接受: 应用程序/json

但 cloudshare 实例 (即 SP prem, 在虚拟服务器中承载) 想要经典"odata = 详细"以及在中添加:

接受: 应用程序/json;odata = 详细

要解决这个问题, 我们添加了这样的标题:

var config = {标题: {
接受: 应用程序/json;odata = 详细 '
}
};

$http.get(serverUrl,配置)
.成功(功能(数据, 状态, 标题, 配置) {

var getLinksResponse = 数据;

getLinksResponse.value.forEach(功能(结果) {

// 和这么泡沫

那摆脱 406, 但它也改变了响应的格式. 它是更多......详细. (哈哈!) 需要更多的变化,这里是最后的结果:

var config = {标题: {
接受: 应用程序/json;odata = 详细 '
}
};

$http.get(serverUrl,配置)
.成功(功能(数据, 状态, 标题, 配置) {

var getLinksResponse = 数据;

getLinksResponse.d.results.forEach(功能(结果) {

// 和这么泡沫

这只变成 30 我们的小问题, 所以我们很幸运. 希望有人发现这很有用.

</结束>

意识不断增强 / 采用各种 JavaScript 框架

我的同事, 贾韦德 · 安萨里 (http://www.bigapplesharepoint.com/team?showExpertName=Javed%20Ansari&rsource=pgblog), 在他喜欢或至少一直在使用与 SharePoint 的框架写了简短的摘要博客帖子: http://www.bigapplesharepoint.com/pages/View-An-Insight.aspx?BlogID=53&rsource=PGBlog).

jQuery 似乎一直在球场上的胜利者, 这么说, 现在年, 但其他人都更多的新和剧照排序的对抗它, 像角. (SPServices, 答案是肯定的, 多年来一直是一个生活的程序并将继续是因此,我认为).

人们在使用什么? 他们主要集中在微软的工具吗 (CSOM / JSOM) 或移动更多角, 淘汰赛, 余烬, 等?

我有这些非微软框架越来越偏向. 我认为微软的东西是与工作越来越难, 要求几乎一样的旧式服务器端开发人员的学习曲线.

在这里发表评论或以上 大苹果 SharePoint 如果你想讨论一下 (大苹果将会有一个很好的讨论的更多可能性).

</结束>

纺纱从网站集配置 SharePoint 计时器作业

我的同事, Ashish · 帕特尔, 写了一篇博客文章 描述一种灵活的定时器工作体系结构 可以提供一些很好的灵活性,以支持长时间运行的任务和/或报告。  用他的话说:

1. 分析签出文件并向个人发送提醒,如果该数目的天 (由于该文件已签出) 超过一定阈值限制

2. 删除链接从其他内容特定的内容被删除或存档从系统时

3. 用户想要看到他订阅了站点集合中的所有站点中的所有警报

4. 将提醒发送到作者审查内容时,在内容中指定审查时间和日期临近

井, 列表中继续下去......

– 查看更多在: http://www.bigapplesharepoint.com/ 页/视图-安-Insight.aspx?BlogID=40#sthash.7cKuiwly.dpuf

有次在我的过去,当有这样的事情会是很有帮助.

</结束>

如何: 配置单元测试和测试覆盖率与 QUnit.js 和 Blanket.js 办公室 365 SharePoint 应用程序

简介

我都一直在探索单元测试和测试覆盖率的 JavaScript 作为我为 SharePoint 在线在办公室工作一个新的 SharePoint 应用程序 365 套房。  明显的研究路径带我去 Qunit.js 在那之后的权利, 自 Blanket.js.

QUnit 让我设置了单元测试,并将其组合为模块。  一个模块只是简单方式组织相关的测试. (我用它作为不肯定, 但它为我工作到目前为止与迄今定义了的测试的小集).

Blanket.js 与 Qunit 集成,它将显示我的实际行的 JavaScript 是 — — 和更重要的是 — — 不实际执行过程中运行测试。  这是"覆盖"— — 执行的行测试覆盖的,有些则不.

设置好的测试用例和查看覆盖范围之间, 我们可以减少我们的代码已隐藏缺陷的风险。  好的时候.

Qunit

假设你有你的 Visual Studio 项目设置, 通过下载从 JavaScript 包开始 http://qunitjs.com.  向解决方案中添加的 JavaScript 和 CSS 相应。  我的看起来像这样:

image

图 1

如您所见, 我正在使用 1.13.0 当时我写了这篇博客. 别忘了下载和添加的 CSS 文件.

这让开, 下一步是创建某些种类的测试工具和参考的 Qunit 位。  我在一个叫"QuizUtil.js",所以,创造了一个叫"QuizUtil_test.html",如图所示的 HTML 页面的脚本文件中测试一堆函数:

image 图 2

下面是代码:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/ 1999/xhtml">
<>
    <标题>QuizUtil 试验与 Qunit</标题>
    <链接 区域快线="样式表" href="../CSS/qunit-1.13.0.css" />
    <脚本 类型="文本/javascript" src="QuizUtil.js" 数据覆盖></脚本>
    <脚本类型 ="文本/javascript" src ="qunit 1.13.0.js"></脚本>
    <脚本类型 ="文本/javascript" src ="blanket.min.js"></脚本>

    <脚本>
        模块("getIDFromLookup");
        测试("QuizUtil getIDFromLookupField", 功能 () {
            var goodValue = "1;#保罗 · 高尔文";

            平等(getIDFromLookupField(goodValue) + 1, 2), "ID 的 [" + goodValue + "] + 1 应该是 2";
            平等(getIDFromLookupField(未定义), 未定义, "未定义输入的参数应返回未定义的结果。");
            平等(getIDFromLookupField(""), 未定义, "空输入的参数应返回未定义的值。");
            平等(getIDFromLookupField("gobbledigood3-thq;dkvn ada;skfja sdjfbvubvqrubqer0873407t534piutheqw;vn"), 未定义,"应始终返回结果可转换为整数");
            平等(getIDFromLookupField("2;#一些其他人"), "2", "检查 [2;#一些其他人].");
            平等(getIDFromLookupField("9834524;#长整型值"), "9834524", "大值测试。");
            notEqual(getIDFromLookupField("5;#任何人", 6), 6, "测试 notEqual (5 不等于 6 对于此示例: [5;#任何人]");

        });

        模块("htmlEscape");
        测试("QuizUtil htmlEscape()", 功能 () {
            平等(htmlEscape("<"), "&这是;", "逃离小于运算符 ('<')");
            平等(htmlEscape("<div 类 = "someclass">一些文本</div>"), "&这是;div 类 =&quot;此处将有机可乘&quot;&gt;一些文本&这是;/div&gt;", "更复杂的测试字符串。");
        });

        模块("getDateAsCaml");
        测试("QuizUtil getDateAsCaml()", 功能 () {
            平等(getDateAsCaml(新增功能 日期("2013/12/31")), "2013年-12-31T:00:00:00", "测试硬编码的日期: [12/31/2013]");
            平等(getDateAsCaml(新增功能 日期("01/05/2014")), "2014年-01-05T:00:00:00", "测试硬编码的日期: [01/05/2014]");
            平等(getDateAsCaml(新增功能 日期("01/31/2014")), "2014年-01-31T:00:00:00", "测试硬编码的日期: [01/31/2014]");
            平等(getTodayAsCaml(), getDateAsCaml(新增功能 日期()), "getTodayAsCaml() 应等于 getDateAsCaml(新的日期())");
            平等(getDateAsCaml("一派胡言价值"), 未定义, "尝试获取一个废话值的日期。");
            平等(getDateAsCaml(未定义), 未定义, "尝试获取的日期 [未定义] 日期。");
        });

        模块("getParameterByName");
        测试("QuizUtil getParameterByName (从查询字符串)", 功能 () {
            平等(getParameterByName(未定义), 未定义, "尝试获取未定义的参数应返回未定义。");
            平等(getParameterByName("不存在"), 未定义, "尝试获取参数值,当我们知道该参数不存在。");

        });

        模块("Cookie");
        测试("QuizUtil 各种 cookie 功能。", 功能 () {
            平等(setCookie("测试", "1", -1), getCookieValue("测试"), "让我设置一个 cookie 应该工作。");
            平等(setCookie("anycookie", "1", -1), true, "设置有效的烹饪应返回 '真正的'。");
            平等(setCookie("疯狂的 cookie 名称 !@#$%"%\^&*(()?/><.,", "1", -1), true, "设置坏 cookie 的名称应返回 false。");
            平等(setCookie(未定义, "1", -1), 未定义, "传递作为该 cookie 的名称未定义。");
            平等(getCookieValue("不存在"), "", "Cookie 不存在测试。");
        });

    </脚本>
</>
<正文>
    <div id="qunit"></div>
    <div id="qunit 夹具"></div>

</正文>
</html>

有几个这里发生的事:

  1. 引用我的代码 (QuizUtil.js)
  2. 引用 Qunity.js
  3. 定义某些模块 (getIDFromLookup, 饼干, 和其他人)
  4. 放置 <div> 其 ID 是"qunit".

然后, 我只是把这页和你这样的东西:

image

图 3

如果你看的顶部, 你有几个选项, 其中两个是有趣:

  • 隐藏通过的测试: 很明显。  可以帮助您的眼睛只看到问题的范围和不多的杂波.
  • 模块: (下拉列表): 这将筛选到测试你想要的只是那些组测试.

至于测试本身 — — 几个评论:

  • 不用说您需要编写代码,它是可测试的放在第一位。  使用该工具可以帮助执行的纪律. 例如, 我有一个称为"getTodayAsCaml 函数()”.  这并不是非常可测试因为它需要没有输入的参数,并测试是否相等, 我们将需要不断更新的测试代码,以反映当前的日期。  我重构它通过添加数据输入的参数,然后传递时我想今天的日期加枫格式的当前日期.
  • 它看起来非常坚固和 Qunit 框架文件自行测试。  它可以做简单的事情,像相等性测试,并还提供了对支持 ajax 样式调用 ("真正"或嘲笑使用您最喜爱的亵).
  • 经历过程也会迫使你想通过边缘情况 — — 发生了什么"未定义"或 null 传递到一个函数。  它使死了简单的测试了这些方案。  好的东西.

覆盖面 Blanket.js

Blanket.js 是 Qunit 补充通过跟踪代码的执行过程中运行测试的实际行数。  它集成右 Qunit 即使它是整个单独的应用程序, 它很好地扮演 — — 它看起来真的像它是一个无缝的应用程序.

这是 blanket.js 在行动:

image 图 4

image

图 5

(你实际上必须单击顶部的"启用覆盖范围"复选框 [见图 3] 要启用此功能。)

在图中突出显示的行 5 我的测试中的任何没有执行过, 所以我需要设计一种测试不会导致他们能够执行如果我想要全覆盖.

获取 blanket.js 工作按照下面的步骤:

  1. 它从下载 http://blanketjs.org/.
  2. 将它添加到您的项目
  3. 更新您的测试线束页 (在我的案子中 QuizUtil_test.html) 如下所示:
    1. 引用的代码
    2. 装饰你 <脚本> 像这样的引用:
    <脚本 类型="文本/javascript" src="QuizUtil.js" 数据覆盖></脚本>

Blanket.js 拾取"的数据覆盖"属性并不会它的魔力。  它的挂接 Qunit, 更新的用户界面,若要添加"启用覆盖范围"选项和瞧!

摘要 (TL; 博士)

使用 Qunit 来编写测试用例.

  • 下载
  • 将它添加到您的项目
  • 写测试线束页
  • 创建您的测试
    • 重构您的代码可测试的一些
    • 有创意!  疯狂的想, 不可能的情况下,无论如何进行测试.

使用 blanket.js,以确保覆盖范围

  • 确保工作 Qunit
  • 下载 blanket.js 并将其添加到您的项目
  • 将它添加到您的测试线束页:
    • 将引用添加到 blanket.js
    • "数据-盖"将属性添加到您 <脚本> 标记
  • 运行 Qunit 测试.

我从来没有做之前,有一些基本的东西,在少数几个小时的工作。 

幸福测试!

</结束>

undefined订阅我的博客.

跟我在 Twitter 上 http://www.twitter.com/pagalvin

Lists.asmx, GetList 和"的值不能为空”

我今天发现的 GetList() 中的方法 lists.asmx web 服务已非常仔细地调用或很容易引发一种神秘"的值不能为空"的异常 (这是假设你过去的更糟的一般错误消息, "类型的异常 ' Microsoft.SharePoint.SoapServer.SoapServerException’ 引发了。")  具体, 我发现你不能提供任何种类的前缀的 GetList 方法。  下面的 jQuery 片断阐释了点:

image

如果你这样做, 以"值不能为空"按此 web 服务响应 小提琴手-提供 HTTP 谈话全文:

<?xml 版本 ="1.0" 编码 ="utf-8"?>
  <肥皂:信封
     xmlns:soap ="
http://schemas.xmlsoap.org/soap/envelope/"    
     xmlns:xsi ="
http://www.w3.org/2001/XMLSchema-instance
     xmlns:xsd ="
http://www.w3.org/2001/XMLSchema">

  <肥皂:正文>
    <肥皂:故障>
      <faultcode>肥皂:服务器</faultcode>
      <faultstring>
        类型的异常 ' Microsoft.SharePoint.SoapServer.SoapServerException’ 引发了.
      </faultstring>
      <详细>
        <errorstring xmlns ="
http://schemas.microsoft.com/sharepoint/soap/">
值不能为空.
        </errorstring>
      </详细>
    </肥皂:故障>
  </肥皂:正文>
</肥皂:信封>

答案是肯定的, 您很可能不会添加该"s0"前缀你自己, 但是一些工具是容易做这件事 (像日食).

这是更令人困惑 / 令人沮丧,因为其他的方法能容忍前缀。  例如, " GetListCollection 方法不介意是否它前缀, 即使使用像"xyzzy"废话前缀:

image

这"的值不能为空"似乎相当常见,所以希望这会帮助别人,在将来的 lists.asmx 与.

</结束>

订阅我的博客.

跟我在 Twitter 上 http://www.twitter.com/pagalvin

无止境地嵌套 <div> 标记和 jQuery

这似乎是一个古怪的话题, 我不确定这的确值得有关的博客, 但是,从未停止过我, 所以在这里我们去 微笑

我正在那里我揪一些数据从搜索一个项目, 打包成一条 XML 消息,然后该 XML 是最终转换为 XSLT 通过 HTML。  有很多的 jQuery 涉及, 其中一位实现一些制表符的功能。  当您单击某个选项卡上 (真的, 一 <div>), jQuery 调用.hide() 和.show() 对各种 div (初始页面加载下载的所有内容,所以在这种情况下有没有回发).

一群小时前, 选项卡切换逻辑开始运行不稳定,它不会显示我的选项卡中的一个。  我最终跟踪它的事实,ie 浏览器 (至少) 原以为, <div> 远嵌套标签, 远远超过预期。开发商工具栏将显示:

-<div id ="Tab1Content">
  -<div>
    -<div>
      -<div id ="Tab2Content">
        -<div>
           …………………………
                   </div>  <— — 最后展示它关闭一路了这里!

所以, 如果我做了 $("#"Tab1Content).隐藏(), 我还会隐藏前台,我可能永远不会告诉前台是否我还没显示标签页 1。  我复制并粘贴代码到 visual studio 和它很好地显示所有 div 的衬砌起来的, 就像他们应该做的事情, 看起来像这:

-<div id ="Tab1Content">
  +<div>
  +<div>
-<div id ="Tab2Content">
  +<div>
  +<div>

我的头靠在墙上打了一会儿,并注意到在实际的 HTML 代码产生大量的空 <div> 标签, 像:

<正文>

  <div id ="Tab1Content">

    <div id ="第一行"/>
    <div id ="行 2"/>

  </div>

  <div id ="Tab2Content">

    <div id ="第一行"/>
    <div id ="行 2"/>

  </div>

</正文>

(以上是过于简单化的 waaaaaaaaaaaay。  空的 div 标签都是完全有效. 一些我 <div> 标记是内容的完整, 但更多的不是。  我认识到,那我 <xsl:为每个> 指令发出短型 div 标签时 xsl:对于每个才 ' 找到的任何数据。  被迫输出的 HTML 注释, 如图所示:

image

 

毕竟这样做, 所有 div 的很好地都排队和我选项卡切换开始工作.

如往常一样, 我希望这将有助于在必要时有人.

</结束>

订阅我的博客.

跟我在 Twitter 上 http://www.twitter.com/pagalvin

原因之一为"此故障的创建者不指定的原因。”

我一直在做很多工作与 SharePoint 搜索最近和专门的 KeywordQuery 类, 属性和方法.

如果你想要的结果集返回结果超出嫌犯 (请看这里), 您将它添加到 SelectedProperties 集合, 如在:

myKeywordQuery.SelectProperties.Add(""xyzzy);

许多感谢和提示的这顶帽子, 科里 · 罗斯这很有帮助的博客 (http://www.dotnetmafia.com/blogs/dotnettipoftheday/archive/2008/02/19/how-to-use-the-moss-enterprise-search-keywordquery-class.aspx)

以我为例, "xyzzy"并不是实际托管的属性。  当我添加到 SelectedProperties 无论如何, SharePoint 扔我最喜欢的一个曾经运行库异常:

此故障的创建者做不指定一个理由。

我特别喜欢资本"R"的原因。  这听起来很喜欢我。净额相当于"我有没有嘴, 和我必须尖叫.”

</结束>

订阅我的博客.

跟我在 Twitter 上 http://www.twitter.com/pagalvin

便利的参考: KeywordQuery 搜索的默认结果

当您调用执行() KeywordQuery 方法, 您可以创建基于 ResultType.RelevantResults 的 ResultTable。  此代码片段说明了我的意思是:

ResultTableCollection resultsTableCollection = myKeywordQuery.Execute();

ResultTable searchResultsTable = resultsTableCollection[ResultType.RelevantResults];

生成的表将有以下各列的信息: 

作业标识符
排名
标题
作者
大小
路径
说明

SiteName
CollapsingStatus
HitHighlightedSummary
HitHighlightedProperties
ContentClass
IsDocument
PictureThumbnailURL
ServerRedirectedURL

我从 SharePoint 派生此列表 2010 环境, 企业版。  希望它在未来将再给人方便.

</结束>

订阅我的博客.

跟我在 Twitter 上 http://www.twitter.com/pagalvin

其中一个原因: "提取解决方案中的 cab 文件失败”

Visual studio web 部件上工作时项目今日 (星期三), 我做了一些文件作为部署过程的一部分被放入的 _layouts 文件夹中次要再 org. 具体, 我改名.js 文件从"TypeAhead.js"到"TypeAhead(老)."js  我打算将其删除作为其继任者的"TypeAhead.js"证明是正确的。  它看起来像这样:

image

这立即引起 visual studio 的问题,当我想要将项目部署:

在 '添加解决方案' 的部署步骤中发生错误: 提取解决方案中的 cab 文件失败.

事实证明你不应该把一个括号中文件的名称。  我删除了 parens,解决了问题.

</结束>

订阅我的博客.

跟我在 Twitter 上 http://www.twitter.com/pagalvin