Категория Архиви: Развитие на 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)
.успех(функция(данни, статус, заглавки, довереник) {

var getLinksResponse = данни;

getLinksResponse.value.forEach(функция(Резултатът) {

// и така нататък и така пяна

Това е движение прав глоба в две различни среди SharePoint онлайн. Въпреки това, Когато колегата ми го пренесли на копие на Cloudshare, Той се HTTP 406 грешка (който е за първи път, аз винаги имам една, така... Уау, Предполагам). Направихме малко изследвания и забелязах, че заглавния блок на "Приемат" е изключено. SharePoint онлайн е напълно щастлив с:

Приемете: приложение/json

Но на cloudshare съд (което е SP на prem, домакин на виртуален сървър) Исках на класическия "odata = многословно" прибавка in както и:

Приемете: приложение/json;oData = многословно

Да се определи, че, Ние добавя заглавието като такива:

var довереник = {заглавки: {
"Приемат": "приложение/json;oData = многословно "
}
};

$http.get(serverUrl,довереник)
.успех(функция(данни, статус, заглавки, довереник) {

var getLinksResponse = данни;

getLinksResponse.value.forEach(функция(Резултатът) {

// и така нататък и така пяна

Че се отървах от 406, но това също се промени формата на отговор. Това беше повече... многословен. (Haha!) Ето крайния резултат и повече промени са били необходими:

var довереник = {заглавки: {
"Приемат": "приложение/json;oData = многословно "
}
};

$http.get(serverUrl,довереник)
.успех(функция(данни, статус, заглавки, довереник) {

var getLinksResponse = данни;

getLinksResponse.d.results.forEach(функция(Резултатът) {

// и така нататък и така пяна

Това само се превърна в 30 минута проблем за нас, така че ние lucked. Надявам се някой намери тази полезна.

</край>

Нарастващото осъзнаване / Приемане на 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, Разбира се, е живот спасявам за години и ще продължи да бъде така мисля).

Какви са хора използват? Са те се фокусира повече върху инструменти на Microsoft (CSOM / JSOM) или по-скоро към Ъгловата преместване, Нокаут, Въглен, н?

Имам нараства пристрастия към тези не Microsoft рамки. Мисля, че MSFT неща е по-трудно да работи с, изискващи почти по-голямата част от кривата на обучение като стар стил от страна на сървъра dev.

Публикувай коментар тук или в продължение на Big Apple SharePoint Ако искате да обсъдят (Big Apple ще има повече вероятността от една добра дискусия).

</край>

Предене SharePoint Timer работни места от сайта колекция конфигурация

Моят колега, Нели Пател, написах един блог пост описание на таймер за гъвкава работа архитектура Това позволява някои хубаво гъвкавост в подкрепа на задачи и/или доклади на дълго бягане.  По думите му:

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

2. Премахване на връзките от друго съдържание, когато определено съдържание се отстранява или архивирани от системата

3. Потребителят иска да видите всички сигнали, които той абонирали във всички уеб сайтове в колекцията от сайтове

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

Ами, Списъкът продължава...

– Вижте повече на: HTTP://www.bigapplesharepoint.com/ страници/изглед-Ан-Insight.aspx?BlogID=40#sthash.7cKuiwly.dpuf

Има моменти, в моето минало, когато като нещо като това би било много полезно.

</край>

Как да: Конфигуриране на единица тест и тест покритие с QUnit.js и Blanket.js за офис 365 SharePoint App

Интро

Аз съм бил проучване на единица тестване и тест покритие за 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</заглавие>
    <връзка отн= "стилове" 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;#Пол 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 клас =&как много;SomeClass&как много;&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 различни бисквитка функции.", функция () {
            равни(setCookie("тест", "1", -1), getCookieValue("тест"), "Get бисквитка задам трябва да работи.");
            равни(setCookie("anycookie", "1", -1), вярно, "Определяне на валиден готвене трябва да се върне"истина".");
            равни(setCookie("луд Бисквитеното име !@#$%"%\^&*(()?/><.,", "1", -1), вярно, "Въвеждане на лош бисквитка име трябва да се върне"неистина".");
            равни(setCookie(неопределен, "1", -1), неопределен, "Минаваща неопределени като името на бисквитката.");
            равни(getCookieValue("не съществува"), "", "Бисквитката не съществува тест.");
        });

    </скрипт>
</главата>
<тяло>
    <DIV ИД= "qunit"></DIV>
    <DIV ИД= "qunit-приспособление"></DIV>

</тяло>
</HTML>

Има няколко неща, случва тук:

  1. Съотнасяне ми код (QuizUtil.js)
  2. Съотнасяне Qunity.js
  3. Определяне на някои модули (getIDFromLookup, Бисквитки, и други)
  4. Поставяне <DIV> чието име е "qunit".

След това, Аз просто дръпнете тази страница и да получите нещо подобно:

image

Фигура 3

Ако погледнете в началото, имате няколко опции, две от които са интересни:

  • Скрий преминали тестове: Доста очевидно.  Може да помогне на очите си просто вижте на проблемните области и не е много елементарно.
  • Модул: (падащо меню): Това ще филтрира тестовете до само тези групи тестове искате.

Що се отнася до тестовете се – няколко коментари:

  • Разбира се че трябва да напишете кода си, така че на първо място е проверимо.  С помощта на инструмента може да ви помогне да наложат тази дисциплина. Например, Имах функция, наречена "getTodayAsCaml()”.  Това не е много проверимо, тъй като тя отнема не входен аргумент и да го тестват за равенство, Ние ще трябва да обновяваме изпитване код, за да отрази текущата дата.  Аз го refactored чрез добавяне на параметър за въвеждане на данни след това преминаване на текущата дата, когато искате днешна дата в CAML формат.
  • Qunit рамка документи собствените си изследвания и изглежда доста здрав.  Тя може да направи прости неща като проверка за равенство и също така има поддръжка за Аякс стил повиквания ("истински" или подиграване използването любимите си mocker).
  • Преминава през процеса и ви принуждава да мисли чрез крайни случаи – какво се случва с "неопределен" или 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, за да напишете вашия тест случаи.

  • Изтеглете го
  • Го добавите към вашия проект
  • Пишете тест впрегне страница
  • Създайте си тестове
    • Някои от вашите код да бъде проверими refactor
    • Бъдете креативни!  Мисля на луд, невъзможно сценарии и ги тест все пак.

Използвайте blanket.js, за да осигури покритие

  • Проверете дали Qunit работи
  • Изтегляне blanket.js и да го добавите към вашия проект
  • Го добавите към вашия тест впрегне страница:
    • Добавяне на препратка към blanket.js
    • Добавяне на "данни-корица" атрибут към вашия <скрипт> етикет
  • Направи свой тестове за Qunit.

Аз никога не е направил това преди и има някои елементарен неща работи в няколко часа. 

Честит тестове!

</край>

undefinedАбонирайте се за моя блог.

Следвайте ме на Twitter в http://www.twitter.com/pagalvin

Lists.asmx, GetList и "стойност не може да бъде нулев”

Аз открих днес, че 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" по своему, но някои инструменти са склонни да го направя (като затъмнение).

Това е още по-объркващо / разочароващ, защото други методи толерира представки.  Например, на GetListCollection метод няма нищо против, ако той е бил предварително фиксиран, дори и с глупости представки като "xyzzy":

image

Това "стойност може да бъде null" изглежда доста често с lists.asmx, така че се надяваме това ще помогне на някой, в бъдеще.

</край>

Абонирайте се за моя блог.

Следвайте ме на Twitter в http://www.twitter.com/pagalvin

Безкрайно вложени SEARCH <DIV> Етикети и jQuery

Това изглежда като такава Одбол тема, Аз не съм сигурен, че е наистина си струва blogging за, но това никога не ми спря преди, така че тук ние отивам Усмивка

Аз съм работа по даден проект, където аз съм дърпа някои данни от търсене, пакетирането му в XML съобщение и след това тази XML в крайна сметка се преобразува в HTML чрез XSLT.  Има много на jQuery, участващи, една част от които реализира някои tabbing функционалност.  Когато щракнете върху даден раздел (Наистина, а <DIV>), jQuery извиква .hide() и .show() на различни divs (на началната страница натоварване изтегля цялото съдържание, така че няма никакви връщания обратно в този случай).

Няколко часа преди, раздела превключване на логиката започна да се държат erratically и тя няма да се покаже един от моите раздели.  Аз в крайна сметка го проследи до факта, че 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> Tags са пълно съдържание, но много други не са.  Аз дойдох до осъзнаването, че ми <XSL:за всеки> директивите не се излъчва кратка форма когато Тагове div xsl:за всеки не "намери някакви данни.  Аз принудени HTML коментар в изхода, както е показано:

image

 

След като направих това, всички div подредени добре и ми tab превключване започва да работи.

Както винаги, Аз надежда този помагам някой в краен случай.

</край>

Абонирайте се за моя блог.

Следвайте ме на 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 еквивалент на"Аз не са в устата, и аз трябва да scream.”

</край>

Абонирайте се за моя блог.

Следвайте ме на Twitter в http://www.twitter.com/pagalvin

Хенди препратка: По подразбиране резултатите от KeywordQuery търсене

Когато се позове изпълнение() метод на KeywordQuery, Можете да създадете ResultTable, въз основа на ResultType.RelevantResults.  Този код фрагмент илюстрира какво имам предвид:

ResultTableCollection resultsTableCollection = myKeywordQuery.Execute();

ResultTable searchResultsTable = resultsTableCollection[ResultType.RelevantResults];

Получената таблица ще има следните колони с информация: 

Същ WorkId
Ранг
Заглавие
Автор
Размер
Път
Описание
Пиша
Име на сайт
CollapsingStatus
HitHighlightedSummary
HitHighlightedProperties
ContentClass
IsDocument
PictureThumbnailURL
ServerRedirectedURL

Аз извлечени този списък от SharePoint 2010 околна среда, предприятие издание.  Надяваме се това ще бъде удобен на някого в бъдеще.

</край>

Абонирайте се за моя блог.

Следвайте ме на Twitter в http://www.twitter.com/pagalvin

Една от причините за: "Не можа да извлече на кабината файла в разтвора”

Докато работи върху visual studio уеб част на проекта днес, Направих малки re org на някои файлове да бъдат пуснати в папката на _layouts като част от процеса на разполагане. Специално, Аз преименуван .js файл от "TypeAhead.js" до "TypeAhead(Стар).JS"  Аз смятам да я премахнете, веднага след като наследника си "TypeAhead.js" е правилна.  Тя изглеждала по този:

image

Това незабавно причинени проблем с visual studio, когато се опитах да се разгръщат на проекта:

Възникна грешка в разполагане стъпка "Добави решение": Не можа да извлече на кабината файла в разтвора.

Се оказва, че трябва да поставяте скоба не в имена на файлове.  Аз parens и че решават проблема.

</край>

Абонирайте се за моя блог.

Следвайте ме на Twitter в http://www.twitter.com/pagalvin