Archivy kategorií: Rozvoj služby SharePoint

HTTP 406 Chyba při použití úhlové $http.get proti SharePoint REST koncových bodů

Aktualizovat: Marc AD ndersson poukázal na tento velký kus info: http://blogs.Office.com/2014/08/13/JSON-Light-support-Rest-SharePoint-API-Released/. To vysvětluje hodně :).

To může být vůbec nejhorší titul blogu! Anyhoo.

Jsem obvykle dělat všechny moje prototypování proti O365 instance. Mám své osobní instance tak, že se nemám bát a ovlivňuje někdo jiný. Jako stranou – si říkáme provedeno kolem virtuálních strojů na našich noteboocích s MECHEM – SQL Server, SLUŽBA IIS, rozhodnutí vs Hyper-V. VMWare? Anyhoo...

Jsem si vyvinul app pomocí úhlové v tomto prostředí, které se, mimo jiné, to:

$http.Get(serverUrl)
.úspěch(funkce(údaje, stav, záhlaví, config) {

var getLinksResponse = data;

getLinksResponse.value.forEach(funkce(Výsledky) {

// a tak dále a tak pěnu

To bylo v pořádku jen ve dvou různých prostředích online služby SharePoint. Avšak, když můj kolega portován na instanci Cloudshare, vystupoval HTTP 406 Chyba (což bylo poprvé, co jsem kdy dostal tenhle, Takže... hurá, Asi). Jsme trochu výzkumu a všiml si, že záhlaví "Přijmout" vypnuto. SharePoint online byl naprosto spokojený s:

Přijmout: aplikace/json

Ale cloudshare instance (což je SP na prem, hostitelem virtuálního serveru) Chtěl klasické "odata = verbose" přidána také:

Přijmout: aplikace/json;OData = verbose

Chcete-li opravit, Přidali jsme záhlaví jako takové:

var config = {záhlaví: {
"Přijmout": "aplikace/json;OData = verbose'
}
};

$http.Get(serverUrl,config)
.úspěch(funkce(údaje, stav, záhlaví, config) {

var getLinksResponse = data;

getLinksResponse.value.forEach(funkce(Výsledky) {

// a tak dále a tak pěnu

To se zbavil 406, ale to také změnil formát odpovědi. To bylo více... verbose. (haha!) Další změny byly nutné, a tady je konečný výsledek:

var config = {záhlaví: {
"Přijmout": "aplikace/json;OData = verbose'
}
};

$http.Get(serverUrl,config)
.úspěch(funkce(údaje, stav, záhlaví, config) {

var getLinksResponse = data;

getLinksResponse.d.Results.forEach(funkce(Výsledky) {

// a tak dále a tak pěnu

Jen se proměnil v 30 minutě problém pro nás, tak to máme štěstí. Doufejme, že někdo zjistí, to užitečné.

</Konec>

Rostoucí povědomí / Přijetí JavaScript rámců

Můj kolega, Javed Ansari (http://www.bigapplesharepoint.com/team?showExpertName=Javed%20Ansari&rsource=pgblog), napsal krátký souhrn blogu na rámce líbí, nebo alespoň používá s s SharePoint: http://www.bigapplesharepoint.com/pages/View-An-Insight.aspx?BlogID=53&rsource=PGBlog).

jQuery se zdá k byli Viktor na hřišti, tak říkajíc, už léta, ale ostatní jsou více nových a utiša druh bojuje, jako úhlová. (SPServices, Samozřejmě, zachránce života už roky a bude nadále tak myslím).

Co používají lidé? Jsou více zaměřeny na nástrojích společnosti Microsoft (CSOM / JSOM) nebo více k úhlové přemístění, Vyseknutí, Žhavý uhlík, atd?

Mám rostoucí zaujatosti vůči těmto programům společnosti Microsoft. Myslím, že MSFT věci je těžší a těžší práce s, vyžadování téměř stejně učení křivky jako staromódní straně serveru dev.

Přidat komentář zde nebo na Big Apple SharePoint Pokud chcete diskutovat o (Big Apple bude mít větší pravděpodobnost zajímavá diskuse).

</Konec>

Spinning úlohy časovače služby SharePoint z konfigurace kolekce webů

Můj kolega, Jiří Patel, napsal blog post Popisuje architekturu práce flexibilní časovače To poskytuje nějaké pěkné flexibilitu pro podporu úkolů dlouhotrvající nebo sestavám.  Podle jeho slov:

1. Analýza zaškrtnuto, soubory a zasílání upomínek osobám, je-li počet dnů (vzhledem k tomu, že byl soubor rezervován) překračují určité mezní

2. Odebírání odkazů od dalšího obsahu, když konkrétní obsah je odstraněn nebo archivovat ze systému

3. Uživatel chce vidět všechny výstrahy, které se odebírá ve všech webů v kolekci webů

4. Upomínání autorům, zkontrolujte obsah, když čas recenzi byl zadán v obsahu, a že se blíží datum

No., seznam pokračuje...

– Více na: http://www.bigapplesharepoint.com/ stránky/View--Insight.aspx?BlogID=40#sthash.7cKuiwly.dpuf

Jsou chvíle v mé minulosti, kdy něco takového by bylo velmi užitečné.

</Konec>

Jak: Konfigurace jednotky Test a Test pokrytí s QUnit.js a Blanket.js pro kancelář 365 Aplikace SharePoint

Úvod

Jsem zkoumá testování a testování pokrytí pro JavaScript, když pracuji na nové aplikace SharePoint pro SharePoint online v kanceláři 365 apartmá.  Zřejmý výzkumné cesty mě vedly k Qunit.js a hned po tomto, do Blanket.js.

QUnit dovolte mi nastavit unit testy a seskupit je do modulů.  Modul je prostě jednoduchý způsob, jak uspořádat související testy. (Nejsem si jistý, že ho používám, jak bylo zamýšleno, ale funguje to pro mě zatím s malou sadou testů, které jsem doposud definovali).

Blanket.js se integruje s Qunit a bude mi ukázat skutečné linie JavaScript, které byly – a hlavně – nebyly spuštěny ve skutečnosti během spuštění testů.  To je "pokrytí"-linky, které se vztahuje testu, zatímco jiné nejsou.

Mezi nastavení dobré testovací případy a zobrazení pokrytí, můžeme snížit riziko, že náš kód má skryté vady.  Dobré časy.

Qunit

Za předpokladu, že máte Visual Studio projekt nastavení, Začněte stažením balíčku JavaScript z http://qunitjs.com.  Přidáte JavaScript a odpovídající CSS k řešení.  Důl vypadá takto:

image

Obrázek 1

Jak můžete vidět, Byl jsem pomocí 1.13.0 tehdy jsem napsal tento příspěvek blogu. Nezapomeňte si stáhnout a přidání souboru CSS.

To z cesty, Dalším krokem je vytvořit nějaký druh testu postroj a referenční Qunit bitů.  Jsem testování spoustu funkcí v souboru skriptu s názvem "QuizUtil.js", tak jsem vytvořil stránku HTML s názvem "QuizUtil_test.html", jak je uvedeno:

image Obrázek 2

Zde je kód:

<!DOCTYPE HTML>
<HTML xmlns.= "http://www.w3.org/. 1999/xhtml">
<hlava>
    <titul>QuizUtil test s Qunit</titul>
    <odkaz rel= "šablony stylů" HREF="../CSS/qunit-1.13.0.CSS" />
    <skript Typ= text/javascript"" src="QuizUtil.js" dat obal></skript>
    <skript typ ="text/javascript" src ="qunit-1.13.0.js"></skript>
    <skript typ ="text/javascript" src ="blanket.min.js"></skript>

    <skript>
        modul("getIDFromLookup");
        Testovat("QuizUtil getIDFromLookupField", funkce () {
            var goodValue = "1;#Paul Galvin";

            rovná(getIDFromLookupField(goodValue) + 1, 2), "ID [" + goodValue + "] + 1 mělo by být 2";
            rovná(getIDFromLookupField(nedefinované), nedefinované, "Nedefinované vstupní argument by měla vrátit výsledek nedefinovaný.");
            rovná(getIDFromLookupField(""), nedefinované, "Prázdný vstupní argument by měla vrátit hodnotu.");
            rovná(getIDFromLookupField("gobbledigood3-thq;dkvn ada;skfja sdjfbvubvqrubqer0873407t534piutheqw;VN"), nedefinované,"By měl vždy vrátí výsledek kabriolet na celé číslo");
            rovná(getIDFromLookupField("2;#jiná osoba"), "2", "Kontrola [2;#jiná osoba].");
            rovná(getIDFromLookupField("9834524;#hodnota Long"), "9834524", "Velké hodnoty testu.");
            notEqual(getIDFromLookupField("5;#Každý, kdo", 6), 6, "Testování notEqual (5 není rovno 6 pro tento příklad: [5;#Každý, kdo]");

        });

        modul("htmlEscape");
        Testovat("QuizUtil htmlEscape()", funkce () {
            rovná(htmlEscape("<"), "&lt;", "Únik méně než operátor ('<')");
            rovná(htmlEscape("<div třída =  "someclass">Nějaký text</div>"), "&lt;div třída =&quot;someclass&quot;&gt;Nějaký text&lt;/div&gt;", "Složitější testovací řetězec.");
        });

        modul("getDateAsCaml");
        Testovat("QuizUtil getDateAsCaml()", funkce () {
            rovná(getDateAsCaml(nové Datum("12/31/2013")), "2013-1231:00:00:00", "Testování naprogramováno datum: [12/31/2013]");
            rovná(getDateAsCaml(nové Datum("01/05/2014")), "2014-01-05T:00:00:00", "Testování naprogramováno datum: [01/05/2014]");
            rovná(getDateAsCaml(nové Datum("01/31/2014")), "2014-0131:00:00:00", "Testování naprogramováno datum: [01/31/2014]");
            rovná(getTodayAsCaml(), getDateAsCaml(nové Datum()), "getTodayAsCaml() by měla rovnat getDateAsCaml(nové datum())");
            rovná(getDateAsCaml("nesmysl hodnota"), nedefinované, "Snažte se dostat datum hodnotu nesmysl.");
            rovná(getDateAsCaml(nedefinované), nedefinované, "Pokuste se získat data [nedefinované] datum.");
        });

        modul("getParameterByName");
        Testovat("QuizUtil getParameterByName (z řetězce dotazu)", funkce () {
            rovná(getParameterByName(nedefinované), nedefinované, "Zkus se nedefinovaný parametr by měla vrátit nedefinované.");
            rovná(getParameterByName("neexistuje"), nedefinované, "Pokuste se získat hodnotu parametru, když víme, že parametr neexistuje.");

        });

        modul("Soubory cookie");
        Testovat("QuizUtil různé funkce souborů cookie.", funkce () {
            rovná(setCookie("test", "1", -1), getCookieValue("test"), "Získat soubor cookie, který jsem měla fungovat.");
            rovná(setCookie("anycookie", "1", -1), pravda, "Nastavení platné vaření by měla vrátit"true".");
            rovná(setCookie("crazy cookie název !@#$%"%\^&*(()?/><.,", "1", -1), pravda, "Nastavení názvu špatný soubor cookie zpět 'false'.");
            rovná(setCookie(nedefinované, "1", -1), nedefinované, "Předávání definován jako název souboru cookie.");
            rovná(getCookieValue("neexistuje"), "", "Cookie neexistuje test.");
        });

    </skript>
</hlava>
<tělo>
    <div ID= "qunit"></div>
    <div ID= "qunit svítidlo"></div>

</tělo>
</HTML>

Existuje několik věcí, které se zde děje:

  1. Odkazování na můj kód (QuizUtil.js)
  2. Odkazování na Qunity.js
  3. Definice některých modulů (getIDFromLookup, Soubory cookie, a další)
  4. Umístění <div> ID je "qunit".

Pak, Jsem jen vytáhnout tuto stránku a dostanete něco takového:

image

Obrázek 3

Pokud se podíváte na horním, Máte několik možností, dvě z nich jsou zajímavé:

  • Skrýt testy: Docela zřejmé.  Mohou pomoci vaše oči vidět problémové oblasti a mnoho nakupit.
  • Modul: (rozevírací seznam): To bude filtrovat testy dolů jen ty skupiny testů, které chcete.

Co se týče testy samy – pár poznámek:

  • Je samozřejmé, že musíte napsat kód tak, že je to v prvé řadě testovatelné.  Použití nástroje může pomoci prosadit kázeň. Například, Měl jsem funkci nazvanou "getTodayAsCaml()”.  To není velmi testovatelné, protože to trvá žádné vstupní argument a testování rovnosti, Musíme neustále aktualizovat testovací kód tak, aby odrážel aktuální datum.  Já refaktorování tím přidáním dat vstupní parametr a pak předá aktuální datum, kdy chci, dnešní datum ve formátu CAML.
  • Qunit rámec dokumenty své vlastní testy a vypadá to docela silný.  To může dělat jednoduché věci, jako je testování rovnosti a má také podporu pro ajax styl volání ("skutečný" nebo zesměšňován, pomocí vašeho oblíbeného mocker).
  • Prochází procesem také síly, abyste si při okraji případy – co se stane s "nedefinovanou" nebo null je předán do funkce.  To usnadňuje mrtvý otestovat tyto scénáře se.  Dobré věci.

Krytí s Blanket.js

Blanket.js doplňuje Qunit tím, že sledování skutečné řádky kódu, které vykonávají v průběhu spouštění vašich testů.  I když že je to úplně samostatná aplikace integruje přímo do Qunit, to hraje pěkně – opravdu vypadá, že je to jedna bezproblémové aplikace.

To je blanket.js v akci:

image Obrázek 4

image

Obrázek 5

(Ve skutečnosti budete muset kliknout na políčko "Povolit krytí" v horní [viz obrázek 3] aby to bylo.)

Zvýrazněné řádky v obrázku 5 nebyly provedeny některou z mých testů, Takže musím vymyslet test, který způsobuje jejich spuštění, pokud chci plné pokrytí.

Získejte blanket.js práci podle následujících kroků:

  1. Stáhnout z http://blanketjs.org/.
  2. Přidejte do projektu
  3. Aktualizovat stránku testovací pás (QuizUtil_test.html v mém případě) takto:
    1. Referenční kód
    2. Ozdobte váš <skript> referenční takhle:
    <skript Typ= text/javascript"" src="QuizUtil.js" dat obal></skript>

Blanket.js zvedne atribut "data obal" a má své kouzlo.  Háky do Qunit, aktualizuje uživatelské rozhraní přidat možnost "Povolit pokrytí" a voila!

Shrnutí (TL; DR)

Použít Qunit k napsání testovacích případů.

  • Stáhnout
  • Přidejte do projektu
  • Napište zkušební stránky postroje
  • Vytvořit vaše testy
    • Některé z kódu být testovatelné refaktorovat
    • Být kreativní!  Myslete na crazy, možné scénáře a testovat je stejně.

Pomocí blanket.js zajistit pokrytí

  • Ujistěte se, že Qunit pracuje
  • Stáhnout blanket.js a přidejte jej do projektu
  • Přidejte jej do testovací stránky postroje:
    • Přidat odkaz na blanket.js
    • Přidejte atribut "data obal" do vašeho <skript> Značka
  • Testy Qunit.

Nikdy jsem žádnou z předtím a měl nějaké základní věci v několik hodin. 

Šťastný testování!

</Konec>

undefinedPřihlásit se na mém blogu.

Za mnou na Twitter na http://www.twitter.com/pagalvin

Lists.asmx, GetList a "hodnota nemůže být null”

Dnes jsem zjistil, že GetList() Metoda lists.asmx Webová služba musí být volán velmi pečlivě nebo je náchylný na tajemnou "Hodnota nemůže být null" výjimka (a to za předpokladu, že se že můžete dostat přes ještě horší obecnou chybovou zprávu, "Výjimka typu ' Microsoft.SharePoint.SoapServer.SoapServerException’ byla vyvolána.")  Konkrétně, Zjistil jsem, že nemůže poskytnout jakýkoliv druh předpony v metodě GetList.  Následující úryvek jQuery je znázorněna:

image

Pokud tak učiníte, Webová služba reaguje s "Hodnota nemůže být null" jak na to houslista-Pokud protokol HTTP:

<?XML verze = "1.0" kódování = "utf-8"?>
  <mýdlo:Obálka
     xmlns.:mýdlo ="
http://schemas.xmlsoap.org/SOAP/ENVELOPE/"    
     xmlns.:xsi = "
http://www.w3.org/2001/XMLSchema-instance
     xmlns.:XSD ="
http://www.w3.org/2001/XMLSchema">

  <mýdlo:Tělo>
    <mýdlo:Chyba>
      <faultcode>mýdlo:Server</faultcode>
      <řetězcem faultString>
        Výjimka typu ' Microsoft.SharePoint.SoapServer.SoapServerException’ byla vyvolána.
      </řetězcem faultString>
      <Podrobnosti>
        <errorString xmlns ="
http://schemas.microsoft.com/SharePoint/SOAP/">
Hodnota nemůže být null.
        </errorString>
      </Podrobnosti>
    </mýdlo:Chyba>
  </mýdlo:Tělo>
</mýdlo:Obálka>

Samozřejmě, pravděpodobně by přidáte tento prefix "odečtením" na vlastní, Ale některé nástroje jsou náchylné k tomu (jako Eclipse).

Je to o to víc matoucí / frustrující, protože jiné metody tolerovat předpony.  Například, v GetListCollection Metoda nebude vadit, kdyby se byla předponou, i s předponami nesmysly jako "xyzzy":

image

Toto "hodnota nemůže být null" se zdá docela běžné s lists.asmx tak snad to pomůže někomu se v budoucnu.

</Konec>

Přihlásit se na mém blogu.

Za mnou na Twitter na http://www.twitter.com/pagalvin

Donekonečna vnoření <div> Značky a jQuery

To se jeví jako takové podivíne téma, Nejsem si jistý, že to opravdu stojí blogu, Ale to mě ještě nikdy nevadilo, Tak tady to máme Usměj se

Já pracuji na projektu, kde jsem si nějaké údaje z hledání, balení do XML zprávy a pak že XML je nakonec transformován do HTML pomocí XSLT.  Je o hodně jQuery, jeden bit z nich implementuje funkce procházení.  Když klepnete na kartu (Vážně, a <div>), jQuery vyvolá .hide() a jí Ukažte() na různé značky (načtení úvodní stránku stáhne veškerý obsah, takže v tomto případě neexistují žádné postbacks).

Banda před hodinami, Karta přepínání logiky začali chovat chaoticky a ji ukáže jeden z mé karty.  Nakonec dozvěděl jsem se to dolů k tomu, že aplikace internet explorer (nejméně) Myslel, že <div> značky vnořené daleko, mnohem hlubší než určené.Vývojář nástrojů by ukázal:

-<div id = "Tab1Content">
  -<div>
    -<div>
      -<div id = "Tab2Content">
        -<div>
           …………………………
                   </div>  <— konečně ukazuje byl uzavřen až sem!

Tak, Pokud jsem udělal $("# Tab1Content").Skrýt(), Také by skrýt Tab2 a mohl bych nikdy ukázat Tab2 pokud nechtěl také zobrazit Tab1.  Zkopírovat a vložit kód v aplikaci visual studio a to vše div obložení se ukázal pěkně, stejně jako by měl dělat, Takhle:

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

Porazil mou hlavou proti zdi na chvíli a všiml si, že skutečné HTML kódu vytvářel spoustu prázdná <div> značky, jako:

<tělo>

  <div id = "Tab1Content">

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

  </div>

  <div id = "Tab2Content">

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

  </div>

</tělo>

(Výše uvedené je waaaaaaaaaaaay zjednodušili.  Prázdný div značky jsou naprosto platné. Některé z mého <div> značky byly plné obsahu, Ale mnohem víc.  Přišel jsem k poznání že moje <XSL:pro každý> směrnice byly výstupu zkrácené když značky div xsl:pro každý ne ' najít žádná data.  Donutila komentáře HTML do výstupu, Jak je uvedeno:

image

 

Poté, co jsem to udělal, všechny div zákrytu pěkně a moje karta přepínání začala pracovat.

Jako vždy, Doufám, že to pomůže někdo v nouzi.

</Konec>

Přihlásit se na mém blogu.

Za mnou na Twitter na http://www.twitter.com/pagalvin

Jednou z příčin pro "tvůrce této chyby neurčil důvod.”

Dělala jsem spoustu práce s SharePoint search v poslední době a konkrétně třídy KeywordQuery, vlastnosti a metody.

Pokud chcete vrátit výsledky nad rámec obvyklých podezřelých sadu výsledků (naleznete zde), Přidat do kolekce SelectedProperties, stejně jako v:

myKeywordQuery.SelectProperties.Add("xyzzy");

Mnohokrát děkuji a tip klobouk Corey Roth a Tato nesmírně užitečné blogu (http://www.dotnetmafia.com/blogs/dotnettipoftheday/archive/2008/02/19/how-to-use-the-moss-enterprise-search-keywordquery-class.aspx)

V mém případě, "xyzzy" není ve skutečnosti spravovanou vlastnost.  Když jsem přidal k SelectedProperties stejně, SharePoint hodil jeden z mé oblíbené někdy runtime výjimky:

"Tvůrce této chyby neurčil důvod."

Obzvlášť líbí velké "R" v důvod.  Zní to pro mě jako.ČISTÝ ekvivalent"Nemám žádné ústa, a musí křičet.”

</Konec>

Přihlásit se na mém blogu.

Za mnou na Twitter na http://www.twitter.com/pagalvin

Užitečnou: Výchozí výsledky hledání KeywordQuery

Když vyvoláte Execute() Metoda na KeywordQuery, můžete vytvořit ResultTable založené na ResultType.RelevantResults.  Tento fragment kódu, mám na mysli, ilustruje:

ResultTableCollection resultsTableCollection = myKeywordQuery.Execute();

ResultTable searchResultsTable = resultsTableCollection[ResultType.RelevantResults];

Výsledná tabulka bude mít následující sloupce informací: 

WorkId
Pořadí
Titul
Autor
Velikost
Cesta
Popis
Zápis
Název serveru
CollapsingStatus
HitHighlightedSummary
HitHighlightedProperties
ContentClass
IsDocument
PictureThumbnailURL
ServerRedirectedURL

Odvozené tento seznam ze serveru SharePoint 2010 prostředí, Enterprise edition.  Doufejme, že se bude hodit k někomu v budoucnosti.

</Konec>

Přihlásit se na mém blogu.

Za mnou na Twitter na http://www.twitter.com/pagalvin

Jedním z důvodů pro: "Nepodařilo se extrahovat soubor cab v řešení”

Při práci na webové části visual studio projektu dnes, Jsem udělal menší re-org některých souborů k uvedení do složky _layouts jako součást procesu implementace. Konkrétně, Přejmenována js soubor z "TypeAhead.js" na "TypeAhead(staré).JS"  Mám v plánu odstranit, jakmile jeho nástupce "TypeAhead.js" ukáže jako správná.  Vypadalo to jako to:

image

Tento problém se sadou visual studio okamžitě způsobil, když se snažil zavést projekt:

Došlo k chybě v kroku nasazení přidat řešení: Nepodařilo se extrahovat soubor cab v řešení.

Ukazuje se, že by ani dát závorku v názvech souborů.  Jsem odstranil parens a že ten problém vyřešil.

</Konec>

Přihlásit se na mém blogu.

Za mnou na Twitter na http://www.twitter.com/pagalvin