分類存檔: 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), 真正的, "設置有效的烹飪應返回 '真正的'。");
            平等(setCookie("瘋狂的 cookie 名稱 !@#$%"%\^&*(()?/><.,", "1", -1), 真正的, "設置壞 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"的原因。  這聽起來對我來說像.net 等效于"我有沒有嘴, 和我必須尖叫.”

</結束>

訂閱我的博客.

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

便利的參考: KeywordQuery 搜索的預設結果

當您調用執行() KeywordQuery 方法, 您可以創建基於 ResultType.RelevantResults 的 ResultTable。  此代碼片段說明了我的意思是:

ResultTableCollection resultsTableCollection = myKeywordQuery.Execute();

ResultTable searchResultsTable = resultsTableCollection[ResultType.RelevantResults];

生成的表將有以下各列的資訊: 

作業識別碼
排名
標題
作者
大小
路徑
說明
寫入
網站名稱
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