Category Archives: Розвиток SharePoint

HTTP 406 Помилка при використанні кутових $http.get проти SharePoint відпочинку кінцевих точок

Оновлення: Марк оголошення ndersson вказав на цей великий шматок інформація: http://Blogs.Office.com/2014/08/13/JSON-Light-support-Rest-SharePoint-API-Released/. Це багато що пояснює :).

Що може бути коли-небудь найгірших заголовок повідомлення в блозі! Anyhoo.

Я зазвичай робити всі мої Прототипування проти O365 екземпляр. У мене є моє особисте екземпляр так що я не повинні бути турбуюся про зачіпають будь-хто інший. Як у бік – пам'ятаєте, коли ми закликаємо рознесену навколо віртуальних машин наші ноутбуки з МОСС-SQL Server, IIS, Вирішивши проти Hyper-V. VMWare? Anyhoo...

Я розробив програму за допомогою кутових в цьому середовищі, що робить, серед іншого, Це:

$HTTP.Get(serverUrl)
.успіх(функція(дані, статус, заголовки, Config) {

VAR getLinksResponse = даних;

getLinksResponse.value.forEach(функція(theResult) {

// і так далі і так піни

Це працює лише штрафом у двох різних середовищах онлайн SharePoint. Однак, Коли, мій колега портовано на Cloudshare екземпляр, він отримував послугами HTTP 406 помилка (яка була в перший раз я коли-небудь отримав що один, так.. Яй, Я гадаю). Ми зробили кілька досліджень і зауважив, що заголовку «Прийняти» був відключений. SharePoint онлайн була абсолютно щаслива зі:

Прийняти: застосування/json

Але cloudshare екземпляр (яка містить SP прем, відбулася у віртуальному сервері) хотів класичний "odata = verbose" додані також:

Прийняти: застосування/json;odata = verbose

Щоб виправити, що, Ми додали заголовка таким чином:

VAR config = {заголовки: {
"Приймати": ' застосування/json;odata = verbose'
}
};

$HTTP.Get(serverUrl,Config)
.успіх(функція(дані, статус, заголовки, Config) {

VAR getLinksResponse = даних;

getLinksResponse.value.forEach(функція(theResult) {

// і так далі і так піни

Що позбулися на 406, але це також змінив формат відповідь. Це було більше.. verbose. (Ха-ха!) Більше змін були необхідні і ось кінцевий результат:

VAR config = {заголовки: {
"Приймати": ' застосування/json;odata = verbose'
}
};

$HTTP.Get(serverUrl,Config)
.успіх(функція(дані, статус, заголовки, Config) {

VAR getLinksResponse = даних;

getLinksResponse.d.results.forEach(функція(theResult) {

// і так далі і так піни

Це тільки перетворився на 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) або переміщення більше до кутової, Нокаут, Ембер, д?

У мене є зростаюча упередженість бік ці рамки корпорації Майкрософт. Я думаю, MSFT речі все важче і важче для роботи з, вимагаючи майже стільки, кривий навчання як старий стиль серверної dev.

Опублікувати коментар тут або на більш Big Apple SharePoint Якщо ви хочете, щоб обговорити (Big Apple буде мати більше ймовірність гарним обговорення).

</кінець>

Спінінг завдань таймера SharePoint із сайту колекції конфігурації

Мій колега, Ashish Патель, Написав в блозі Описуючи гнучким таймер роботу архітектура що дає деякі nice гнучкість для підтримки тривалої завдань та/або звіти.  З його слів:

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", так що я створив HTML-сторінку під назвою "QuizUtil_test.html", як показано:

image Фігура 2

Ось код:

<!DOCTYPE HTML>
<HTML xmlns= "http://www.w3.org/ 1999/xhtml">
<Голова>
    <Назва>QuizUtil тест з Qunit</Назва>
    <посилання REL= "таблиця стилів" href="../CSS/qunit-1.13.0.CSS" />
    <сценарій тип= текст/javascript"" НДЦ="QuizUtil.js" дані палітурці></сценарій>
    <скрипт типу ="текст/javascript" src ="qunit-1.13.0.js"></сценарій>
    <скрипт типу ="текст/javascript" src ="blanket.min.js"></сценарій>

    <сценарій>
        модуль("getIDFromLookup");
        тест("QuizUtil getIDFromLookupField", функція () {
            VAR goodValue = "1;#Paul Galvin";

            Рівне(getIDFromLookupField(goodValue) + 1, 2), "Ідентифікатор [" + goodValue + "] + 1 повинно бути 2";
            Рівне(getIDFromLookupField(не визначено), не визначено, "Невизначений вхідного аргументу слід повернути undefined результат.");
            Рівне(getIDFromLookupField(""), не визначено, "Порожні вхідного аргументу слід повернути невизначене значення.");
            Рівне(getIDFromLookupField("gobbledigood3-thq;dkvn Ада;skfja sdjfbvubvqrubqer0873407t534piutheqw;в. н."), не визначено,"Завжди прем'єр результат кабріолет на ціле число");
            Рівне(getIDFromLookupField("2;#деякі інші особи"), "2", "Перевірка [2;#деякі інші особи].");
            Рівне(getIDFromLookupField("9834524;#довгого вартість"), "9834524", "Велике значення тест.");
            notEqual(getIDFromLookupField("5;#хто-небудь", 6), 6, "Тестування на notEqual (5 Це не дорівнює 6 для цього зразка: [5;#хто-небудь]");

        });

        модуль("htmlEscape");
        тест("QuizUtil htmlEscape()", функція () {
            Рівне(htmlEscape("<"), "&lt;", "Втечі на менш ніж оператор ('<')");
            Рівне(htmlEscape("<DIV клас =  "someclass">Частина тексту</DIV>"), "&lt;DIV клас =&quot;SomeClass&quot;&gt;Частина тексту&lt;/DIV&gt;", "Більш складні тестовий рядок.");
        });

        модуль("getDateAsCaml");
        тест("QuizUtil getDateAsCaml()", функція () {
            Рівне(getDateAsCaml(нові Дата("12/31/2013")), "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("не існує"), не визначено, "Спробувати отримати значення параметра, коли ми знаємо, що не існує параметра.");

        });

        модуль(«Печиво");
        тест("QuizUtil різні функції cookie.", функція () {
            Рівне(setCookie("тест", "1", -1), getCookieValue("тест"), «Get я встановив cookie повинен працювати.");
            Рівне(setCookie("anycookie", "1", -1), Істина, "Налаштування дійсні приготування слід повернути значення" true".");
            Рівне(setCookie("crazy 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()”.  Це не дуже перевіряються, оскільки необхідне немає вхідного аргументу і протестувати його за рівність, Ми повинні постійно оновлювати тестовим кодом з урахуванням поточної дати.  Я реструктурувати, шляхом додавання даних вхідний параметр потім проходить поточну дату, коли я хочу поточну дату у форматі CAML.
  • Qunit рамках документи свого випробування, і здається досить надійною.  Це можна зробити прості речі, як тестування за рівність і також має підтримку стилю ajax дзвінки ("реального" або mocked, використовуючи ваш улюблений насмішник).
  • Також проходять через процес змушує вас думати, через край випадках – що відбувається з "невизначені" або 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"" НДЦ="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 і "значення не може бути null”

Сьогодні я виявив, що в GetList() метод в lists.asmx веб-служба має називатися дуже ретельно або вона схильна до кинути таємничий "Значення не може бути невизначеним" виняток (і що передбачається, що ви можете отримати минулих ще гірше загальні помилки повідомлення, "Виняткова ситуація типу ' Microsoft.SharePoint.SoapServer.SoapServerException’ був кинутий.")  Зокрема, Я виявив, що ви не можете надати будь-які префікс GetList методом.  Наступний фрагмент jQuery ілюструє точка:

image

У цьому випадку, веб-служба реагує з "Значення не може бути пусте" відповідно до цього Скрипаль-надані HTTP Стенограма:

<?XML версія = "1,0" кодування = "utf-8"?>
  <мило:Конверт
     xmlns:мило ="
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 в кінцевому рахунку перетворюється в HTML за допомогою XSLT.  Існує багато jQuery участь, один біт, який реалізує деякі табуляції функціональність.  При натисканні на вкладці (Справді, на <DIV>), jQuery викликає .hide() і .show() різні Діви (первинного завантаження сторінки завантажує всі вміст, щоб там не без зворотної передачі при цьому).

Купу години тому, вкладці перемикання логіка почав працювати з помилками, і він не буде показувати один з моїх вкладки.  Я в кінцевому підсумку відслідковуються його аж до того, що internet explorer (по крайней мере) думав, що в <DIV> Мітки вкладені далеко, набагато глибше, ніж передбачалося.Б показати панель інструментів розробника:

-<DIV id = "Tab1Content">
  -<DIV>
    -<DIV>
      -<DIV id = "Tab2Content">
        -<DIV>
           …………………………
                   </DIV>  <— Нарешті, показуючи його закрили весь шлях вниз тут!

Так, Якщо я зробив це $("#Tab1Content").приховати(), Я також хотів би приховати Tab2, і я ніколи не міг би показати Tab2 якщо я також не показують Tab1.  Я скопіювати і вставити код в visual studio та його показали все у div підкладку до красиво, точно так само, як вони повинні були робити, дивлячись, як це:

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

Я бив мою голову об стіну на деякий час і зауважив, що фактичні HTML код було створення купу порожній <DIV> Мітки, як:

<тіло>

  <DIV id = "Tab1Content">

    <DIV id = "row1" />
    <DIV id = "row2" />

  </DIV>

  <DIV id = "Tab2Content">

    <DIV id = "row1" />
    <DIV id = "row2" />

  </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 кинули одна з моїх улюблених коли-небудь runtime виключення:

"Творець цього вина не уточнив привід."

Мені особливо подобається Капітал "R" по розуму.  Це звучить для мене як .NET еквівалент"У мене немає рота, і я повинна кричати.”

</кінець>

Підписатися на мій блог.

Йди за мною на Twitter в http://www.twitter.com/pagalvin

Handy посилання: За промовчанням результати пошуку KeywordQuery

Коли ви посилатися на виконання() метод на на KeywordQuery, Ви можете створити ResultTable на основі ResultType.RelevantResults.  Цей фрагмент коду свідчить про те, що я маю на увазі:

ResultTableCollection-resultsTableCollection = myKeywordQuery.Execute();

ResultTable-searchResultsTable = resultsTableCollection[ResultType.RelevantResults];

Результуючі таблиці буде мати такі стовпці відомостей: 

Ідентифікатор завдання
Ранг
Назва
Автор
Розмір
Шлях
Опис
Писати
Ім'я сайту
CollapsingStatus
HitHighlightedSummary
HitHighlightedProperties
ContentClass
IsDocument
PictureThumbnailURL
ServerRedirectedURL

Я основі цього списку SharePoint 2010 навколишнє середовище, Enterprise edition.  Сподіваюся, це буде зручно, щоб хтось в майбутньому.

</кінець>

Підписатися на мій блог.

Йди за мною на Twitter в http://www.twitter.com/pagalvin

Одна з причин: "Не вдалося витягти кабіна файлу в рішення”

Під час роботи на visual studio веб-частини проекту сьогодні, Я зробив, що дрібних re-org деякі файли, щоб покласти в _layouts папку в процесі розгортання. Зокрема, Я перейменував JS з "TypeAhead.js" до "машинописний(старі).JS"  Я збираюся видалити її, як тільки його наступник "TypeAhead.js" виявляється правильним.  Вона подивилася, як це:

image

Це відразу ж викликало проблеми з visual studio, коли я спробував розгорнути проекту:

Сталася помилка під час розгортання кроці додати рішення: Не вдалося вилучити файл кабіни в рішення.

Виявляється, що ви не повинні покласти дужкою в іменах файлів.  Я видалив в parens і що проблема вирішена.

</кінець>

Підписатися на мій блог.

Йди за мною на Twitter в http://www.twitter.com/pagalvin