Категория Архивы: Разработки SharePoint

HTTP 406 Ошибка при использовании угловых $http.get против SharePoint остальные конечные точки

Обновление: Марк AD ndersson указал этот большой кусок информации: HTTP://blogs.Office.com/2014/08/13/JSON-Light-Support-REST-SharePoint-API-Released/. Это объясняет много :).

Это может быть когда-нибудь худшее название блога! Anyhoo.

Обычно я все мои прототипирования против экземпляра O365. У меня есть мой личный экземпляр, так что я не придется беспокоиться о затрагивающих никому. Как в сторону – Помните, когда мы называем осуществляется вокруг виртуальных машин на наших ноутбуков с Мосс – SQL Server, IIS, решение Hyper-V vs. VMWare? Anyhoo...

Я разработал приложение с помощью угловых в этой среде, что делает, среди прочего, Это:

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

var getLinksResponse = данные;

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

// и так далее и так пены

Это отлично работает в двух различных средах SharePoint онлайн. Однако, Когда мой коллега перенес его в экземпляр Cloudshare, он становится HTTP 406 Ошибка (который был в первый раз, я когда-либо получил что один, так что... Ура, Наверное). Мы сделали несколько исследований и заметил, что заголовок «Принять» был выключен. SharePoint онлайн был совершенно счастлив с:

Примите: применение/json

Но cloudshare экземпляра (который является SP на Прем, виртуальный сервер) хотели классический «odata = verbose» также добавлен в:

Примите: применение/json;OData = подробный

Чтобы это исправить, Мы добавили заголовка как таковой:

var config = {заголовки: {
«Accept»: ' приложение/json;OData = verbose'
}
};

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

var getLinksResponse = данные;

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

// и так далее и так пены

Что избавился от 406, но он также изменил формат ответа. Это было больше... подробный. (Ха-ха!) Необходимы дополнительные изменения и вот окончательный результат:

var config = {заголовки: {
«Accept»: ' приложение/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) или больше к угловое перемещение, Нокаут, Эмбер, и т.д.?

У меня растет уклон в сторону этих рамок не Microsoft. Я думаю, что вещи MSFT все труднее и труднее работать с, требует почти столько же, сколько кривой обучения как старого стиля серверного dev.

Оставить комментарий здесь или более чем на Big Apple SharePoint Если вы хотите обсудить (Big Apple будет иметь больше вероятность хорошей дискуссии).

</конец>

Спиннинг задания таймера SharePoint из коллекции конфигурации сайта

Мой коллега, Ашиш Патель, Написал в блоге Описание архитектуры задания гибкого таймера что дает некоторые Ницца гибкость для поддержки длительно выполняемых задач или отчеты.  По его словам:

1. Анализ возвращенных файлов и отправки напоминаний лицам, если число дней (Поскольку файл был извлечен) превышать определенные пороговые пределы

2. Удаление ссылок из другого содержимого, когда конкретное содержание удаляется или Архив из системы

3. Пользователь хочет видеть все сигналы, которые он подписался в все веб-узлы в семействе узлов

4. Отправка напоминания для авторов пересмотреть содержание, когда время обзор был указан в содержании и что приближается дата

Колодец, Этот список можно продолжать...

– Смотрите больше на: HTTP://www.bigapplesharepoint.com/ страниц/вид-ан-Insight.aspx?BlogID=40#sthash.7cKuiwly.dpuf

Есть раз в моем прошлом, когда что-то подобное было бы очень полезно.

</конец>

Инструкции: Настройка модульного теста и тестового покрытия с QUnit.js и Blanket.js для офиса 365 Приложение SharePoint

Интро

Я изучали модульного тестирования и испытания покрытия для JavaScript, как я работаю над новым приложением SharePoint для SharePoint online в офисе 365 Люкс.  Очевидным исследования путей привело меня к QUnit.js и сразу после, Кому Blanket.js.

QUnit позвольте мне создать модульные тесты и сгруппировать их в модули.  Модуль-это всего лишь простой способ организовать соответствующие тесты. (Я не уверен, что я использую его, как предполагалось, но это работает для меня пока небольшой набор тестов, которые я пока определили).

Blanket.js интегрируется с Qunit и он покажет мне фактической строки JavaScript, которые были – и что более важно – не были фактически выполняются в ходе выполнения тестов.  Это «покрытие» – линии, которые выполнены покрыты теста, в то время как другие являются не.

Создание хорошей тестовых случаев и просмотр покрытия, Мы можем уменьшить риск, что наш код имеет скрытые дефекты.  Хорошие времена.

QUnit

Если у вас есть Visual Studio проект создан, Начните с загрузки пакета JavaScript из http://qunitjs.com.  Добавьте в решение соответствующего CSS и JavaScript.  Шахта выглядит так:

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" />
    <сценарий Тип= text/javascript"" src="QuizUtil.js" данные Обложка></сценарий>
    <сценарий типа =«text/javascript" src =«qunit-1.13.0.js"></сценарий>
    <сценарий типа =«text/javascript" src =«blanket.min.js"></сценарий>

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

            равных(getIDFromLookupField(goodValue) + 1, 2), «Идентификатор [" + goodValue + "] + 1 должно быть 2";
            равных(getIDFromLookupField(не определено), не определено, «Undefined входной аргумент должен возвращать неопределенный результат.");
            равных(getIDFromLookupField(""), не определено, «Пустой входной аргумент должен возвращать неопределенное значение.");
            равных(getIDFromLookupField(«gobbledigood3-thq;dkvn ада;skfja sdjfbvubvqrubqer0873407t534piutheqw;VN"), не определено,«Всегда должны возвращать результат кабриолет в целое число");
            равных(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-05Т: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("тест"), «Получить файл cookie, я должен работать.");
            равных(setCookie(«anycookie", «1", -1), Истина, «Установка действительный приготовления должен возвращать 'true'.");
            равных(setCookie(«имя сумасшедший cookie !@#$%"%\^&*(()?/><.,", «1", -1), Истина, «Плохой cookie имя параметра ли должен возвращать 'false'.");
            равных(setCookie(не определено, «1", -1), не определено, «Проходя определено как имя файла cookie.");
            равных(getCookieValue(«не существует"), "", «Сookie не существует теста.");
        });

    </сценарий>
</голова>
<тело>
    <Div ID= «qunit"></Div>
    <Div ID= «qunit светильник"></Div>

</тело>
</HTML>

Есть несколько вещей, здесь происходит:

  1. Ссылка на мой код (QuizUtil.js)
  2. Ссылки на Qunity.js
  3. Определение некоторых модулей (getIDFromLookup, Печенье, и другие)
  4. Размещение <Div> Идентификатор которого является «qunit».

Затем, Я просто подтянуть эту страницу и вы получите нечто вроде этого:

image

Рисунок 3

Если вы посмотрите в верхней, у вас есть несколько вариантов, два из которых интересны:

  • Скрыть прошли испытания: Довольно очевидно.  Может помочь ваш глаз просто увидеть проблемные области и не много беспорядка.
  • Модуль: (падение вниз): Это будет фильтровать тесты до только те группы тестов, которые вы хотите.

Что касается самих – несколько замечаний тестов:

  • Само собой разумеется, что необходимо написать свой код таким образом, что это в первую очередь для тестирования.  С помощью инструмента может помочь обеспечить соблюдение дисциплины. К примеру, Я имел функцию под названием "getTodayAsCaml()”.  Это не очень для тестирования, так как он принимает без ввода аргументов и для проверки на равенство, Мы должны постоянно обновлять код теста для отражения текущей даты.  Я переделать его, добавив параметр ввода данных, а затем передавая на текущую дату, когда я хочу текущая дата в формате CAML.
  • Qunit рамки документы свои собственные испытания и кажется довольно надежные.  Это можно делать простые вещи, как проверки на равенство и также имеет поддержку для вызовов ajax стиль («реальные» или издевались, используя ваш любимый насмешник).
  • Также переживает процесс заставляет вас думать через крайние случаи – что происходит с «неопределенный» или в функцию передается значение null.  Это делает его мертвым простой для тестирования этих сценариев вне.  Хорошие вещи.

Покрытие с Blanket.js

Blanket.js дополняет Qunit путем отслеживания фактических строк кода, которые выполняются во время выполнения тестов.  Она интегрирует право в Qunit даже если это совершенно отдельные приложения., Он играет красиво – это действительно выглядит, как будто это один бесшовных app.

Это blanket.js в действии:

image Рисунок 4

image

Рисунок 5

(На самом деле вы должны нажать на флажок «Включить освещение» в верхней [рис. 3] для этого.)

Выделенные линии на рисунке 5 не были выполнены любым из моих тестов, Поэтому необходимо разработать тест, который заставляет их выполнять, если я хочу полный охват.

Получить blanket.js работает, выполните следующие действия:

  1. Скачать его из http://blanketjs.org/.
  2. Добавьте его в проект
  3. Обновление тестовой страницы Упряжь (QuizUtil_test.html в моем случае) следующим:
    1. Код ссылки
    2. Украсьте ваш <сценарий> ссылка, как это:
    <сценарий Тип= text/javascript"" src="QuizUtil.js" данные Обложка></сценарий>

Blanket.js забирает атрибут «данных Обложка» и делает свое волшебство.  Крючки в Qunit, обновляет пользовательский интерфейс для добавления параметра «Включить освещение» и вуаля!

Резюме (TL; Д-Р)

Использовать Qunit для написания тестовых случаев.

  • Скачать его
  • Добавьте его в проект
  • Написать тестовую страницу Упряжь
  • Создание тестов
    • Переделать некоторые из кода быть проверяемым
    • Быть творческим!  Думать ума, невозможно сценариев и проверить их все равно.

Используйте blanket.js для обеспечения охвата

  • Убедитесь, что работает Qunit
  • Скачать blanket.js и добавить его в ваш проект
  • Добавить его в тестовую страницу Упряжь:
    • Добавьте ссылку на blanket.js
    • Добавьте атрибут «данных крышка» для вашего <сценарий> Тег
  • Qunit тесты выполнять.

Я никогда не делал этого раньше и имел некоторые элементарные вещи, работающие в несколько часов. 

Счастливый тестирования!

</конец>

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

Следуй за мной по щебетать на http://www.twitter.com/pagalvin

Lists.asmx, GetList и "не может иметь значение null”

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

image

Если вы сделаете это, веб-служба отвечает с «Не может иметь значение null» в соответствии с этой скрипач-предоставляет протокол 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» на ваших, Однако некоторые инструменты склонны делать это (как Eclipse).

Это тем более запутанным / сложно, потому что другие методы терпеть префиксы.  К примеру, в GetListCollection метод не против, если он имеет префикс, имена даже с абсурд как «xyzzy»:

image

Это «не может иметь значение null» кажется довольно часто с lists.asmx так надеюсь это поможет кто-то в будущем.

</конец>

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

Следуй за мной по щебетать на http://www.twitter.com/pagalvin

Бесконечно вложенности <Div> Теги и jQuery

Это кажется такой теме oddball, Я не уверен, что это действительно стоит блог о, но это никогда не остановили меня до, Поэтому здесь мы идем Улыбка

Я работаю над проектом, где я потянув некоторые данные из поиска, Упаковка его в XML-сообщения, а затем XML в конечном итоге превращается в HTML через XSLT.  Существует много jQuery, один бит из которых реализует некоторые tabbing функцию.  При нажатии на вкладку (действительно, в <Div>), jQuery вызывает .hide() и .show() на различных DIV (Начальная страница загрузки загружает все содержимое в этом случае нет никаких обратных передач).

Куча часов назад, закладке Коммутационная логика начал работать с ошибками, и он не будет показывать один из моих плат.  Я в конечном итоге отслеживать его вниз на тот факт, что 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 очереди, красиво и моя вкладка переключения начал работать.

Как всегда, Я надеюсь, что это помогает кто-то в крайнем случае.

</конец>

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

Следуй за мной по щебетать на http://www.twitter.com/pagalvin

Одной из причин для "создатель этой сбоев не указали причину.”

Я делаю много работы с последнее время поиска SharePoint и специально класс KeywordQuery, свойства и методы.

Если вы хотите, чтобы результирующий набор для возвращения результатов помимо обычных подозреваемых (Смотрите здесь), Добавьте его к коллекции SelectedProperties, как и в:

myKeywordQuery.SelectProperties.Add(«xyzzy»);

Большое спасибо и кончик шляпе с Corey рот и Это чрезвычайно полезно блога (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 эквивалент"У меня не рот, и я должен кричать.”

</конец>

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

Следуй за мной по щебетать на http://www.twitter.com/pagalvin

Удобный ссылка: По умолчанию результаты поиска KeywordQuery

При вызове Execute() метод на KeywordQuery, можно создать ResultTable, основанный на ResultType.RelevantResults.  Этот фрагмент кода иллюстрирует то, что я имею в виду:

ResultTableCollection resultsTableCollection = myKeywordQuery.Execute();

ResultTable searchResultsTable = resultsTableCollection[ResultType.RelevantResults];

Результирующая таблица будет иметь следующие столбцы информации: 

WorkId
Ранг
Название
Автор
Размер
Путь
Описание
Написать
Имя_узла
CollapsingStatus
HitHighlightedSummary
HitHighlightedProperties
ContentClass
IsDocument
PictureThumbnailURL
ServerRedirectedURL

Я вывел этот список из SharePoint 2010 Окружающая среда, Выпуск Enterprise edition.  Надеюсь это будет удобно для кого-то в будущем.

</конец>

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

Следуй за мной по щебетать на http://www.twitter.com/pagalvin

Одна из причин для: «Не удалось извлечь CAB-файла в решение”

Во время работы с visual studio веб-части проекта сегодня, Я сделал незначительными ре org некоторых файлов будет введен в папке _layouts в рамках процесса развертывания. Специально, Я переименовал файл .js от «TypeAhead.js» до "TypeAhead(Старый).АО"  Я планирую удалить его после того, как ее преемником «TypeAhead.js» оказывается правильным.  Он посмотрел, как это:

image

Это сразу же вызвало проблемы с помощью visual studio, когда я попытался развернуть проект:

Произошла ошибка в шаге развертывания «Добавление решения»: Не удалось извлечь CAB-файла в решение.

Оказывается, что вы не должны поставить скобки в именах файлов.  Я удалил parens и что решить эту проблему.

</конец>

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

Следуй за мной по щебетать на http://www.twitter.com/pagalvin