Kategorija Arhiv: SharePoint razvoj

HTTP 406 Napaka pri uporabi kotni $http.get proti SharePoint PREOSTALI končne točke

Posodobitev: Marc oglas ndersson poudariti to velik krpa od zavijati: http://blogs.Office.com/2014/08/13/JSON-Light-support-REST-SharePoint-API-Released/. To pojasnjuje veliko :).

Da se lahko najslabši naslov blog post Kdaj! Anyhoo.

Običajno delam vse moje prototipov proti primerek O365. Imam svoj osebni primer, tako da ni treba biti zaskrbljen zaradi vpliva nikomur. Kot prahi – ne pozabite kdaj pravimo izvajajo okoli virtualne stroje na naših prenosnih računalnikov z MAHOM – SQL Server, IIS, odločanju, Hyper-V vs. VMWare? Nekako...

Sem imel razvit app uporabo kotnega v tem okolju, ki pa, med drugim, to:

$http.Get(serverUrl)
.uspeh(Funkcija(podatkov, status, glave, config) {

var getLinksResponse = podatkov;

getLinksResponse.value.forEach(Funkcija(theResult) {

// in tako naprej in tako pena

To je ki dela šele lep v dveh različnih SharePoint online okoljih. Vendar, ko moj kolega je napovedati stopnje Cloudshare, bil je že na HTTP 406 Napaka (ki je prvič sem kdajkoli dobil tisti, tako... Bravo, zdi se mi). Nismo malo raziskav in opazil, da je glava "Accept" odštel. SharePoint online je bila popolnoma zadovoljna z:

Sprejeti: Uporaba/json

Vendar je cloudshare stopnje (ki je SP na prem, gostuje v virtualni strežnik) Hotel classic "odata = verbose" doda tudi:

Sprejeti: Uporaba/json;odata = verbose

Se določi, da, Dodali smo glave kot take:

var config = {glave: {
"Sprejeti": "uporaba/json;odata = verbose "
}
};

$http.Get(serverUrl,config)
.uspeh(Funkcija(podatkov, status, glave, config) {

var getLinksResponse = podatkov;

getLinksResponse.value.forEach(Funkcija(theResult) {

// in tako naprej in tako pena

Ki znebili na 406, vendar je tudi spremenila oblika odziva. Je bilo več... glej verbosly. (haha!) Več sprememb so bile zahtevane in tukaj je končni rezultat:

var config = {glave: {
"Sprejeti": "uporaba/json;odata = verbose "
}
};

$http.Get(serverUrl,config)
.uspeh(Funkcija(podatkov, status, glave, config) {

var getLinksResponse = podatkov;

getLinksResponse.d.Results.forEach(Funkcija(theResult) {

// in tako naprej in tako pena

To samo spremenila v a 30 minuto problem za nas, tako mi lucked. Upajmo, da nekdo najde, to je koristen.

</namen>

Vse večjo ozaveščenost / Sprejetja JavaScript okvirov

Moj kolega, Javed Ansari (http://www.bigapplesharepoint.com/team?showExpertName=Javed%20Ansari&rsource=pgblog), napisal kratek povzetek blog post o okvirih je všeč ali vsaj je bil z uporabo z s SharePointom: http://www.bigapplesharepoint.com/pages/View-An-Insight.aspx?BlogID=53&rsource=PGBlog).

jQuery zdi, da zmagovalec na področju, tako rekoč, za let, ampak drugi so več novih in destilarnah nekako bori, kot kotni. (SPServices, seveda, je bil a življenje dober gospodar za let in bo še naprej tako mislim).

Kaj ljudje uporabljajo? So osredotočene bolj na Microsoftovo orodje (CSOM / JSOM) ali bolj proti kotnega gibljejo, Knockout, Pepel, itd?

Imam vedno predsodke proti teh okvirov Microsofta. Mislim, da stvari MSFT je težje in težje delo z, ki zahtevajo skoraj toliko krivulje učenja kot po starem strežniku dev.

Pokomentirajte tukaj ali pa na Big Apple SharePoint Če želite razpravljati o (Big Apple bodo imeli več verjetnosti dober razpravo).

</namen>

Predenje posle razporejevalnika SharePoint iz mesta zbiranja konfiguracije

Moj kolega, Majda Patel, napisal blog post opisovanje prilagodljive timer delo arhitekture ki daje nekaj lepo prožnosti za podporo nalogah dolgotrajen in/ali poročila.  Po njegovih besedah:

1. Analiziranje potrjeno, datotek in pošiljanje opominov za posameznike, če je število dni (ker je datoteka rezervirana) presega nekatere mejne vrednosti

2. Odstranjevanje povezave iz druge vsebine, ko določene vsebine je odstranjena ali Arhivirano iz sistema

3. Uporabnik želi videti vsa opozorila, ki je vpisala v vse splete v zbirki mest

4. Pošiljanje a opominov avtorji pregledati vsebino, ko v vsebine je bil naveden čas pregled in da se približuje datum

Dobro, naštevali...

– Oglejte si več na: http://www.bigapplesharepoint.com/ strani/Poglej-na-Insight.aspx?BlogID=40#sthash.7cKuiwly.dpuf

So časi, v moji preteklosti, ko imajo kaj takega bi bilo zelo koristno.

</namen>

kako: Konfiguriranje enote Test in Test pokritost z QUnit.js in Blanket.js za pisarno 365 SharePoint App

Intro

Bil raziskovati enota testiranja in test zajetje za JavaScript, saj delam na novo SharePoint app za SharePoint online v pisarni 365 Suite.  Poti očitno raziskave me je pripeljala do Qunit.js in prav po tem, za Blanket.js.

QUnit mi nastavite unit testov in jih združite v module.  Modul je samo preprost način za organiziranje ustreznih preskusih. (Ne vem, jaz sem ga uporabljajo, kot je bilo predvideno, vendar deluje za mene tako daleč s majhen nabor testov, ki jih doslej določili).

Blanket.js, ki se integrira z Qunit in to bo pokazal dejanski vrstic JavaScript, ki so bili- in še pomembneje-so bili dejansko izvršeni med teče testov.  To je "zajetje"-proge, da izvajajo so zajete test, medtem ko druge niso.

Med postavljanje ki gre gor dober testnih primerov in pokritost, mi lahko zmanjša tveganje, da ima naša koda skrite napake.  Dobrih časih.

Qunit

Ob predpostavki, da imate Visual Studio projekta nastavite, začnete s prenosom JavaScript paket iz http://qunitjs.com.  Dodajte JavaScript in CSS ustrezne vaša rešitev.  Rudnik pogled tako le:

image

Slika 1

Kot lahko vidite, Sem bil using 1.13.0 v času, ko sem napisal ta blog post. Ne pozabite, da prenesete in dodate datoteki CSS.

Ki s poti, naslednji korak je ustvariti neke vrste test pas in reference Qunit bitov.  Sem testiranje kup funkcij v skriptno datoteko, imenovano "QuizUtil.js", zato sem ustvaril HTML strani, imenovano "QuizUtil_test.html", kot je prikazano:

image Slika 2

Tukaj je koda:

<!DOCTYPE HTML>
<HTML xmlns= "http://www.w3.org/ 1999/xhtml">
<vodja>
    <naslov>QuizUtil test z Qunit</naslov>
    <povezava rel= "stylesheet" href="../CSS/qunit-1.13.0.css" />
    <skript vrsta= text/javascript"" src="QuizUtil.js" podatki zajemajo></skript>
    <skript tipa ="text/javascript" src ="qunit-1.13.0.js"></skript>
    <skript tipa ="text/javascript" src ="blanket.min.js"></skript>

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

            enako(getIDFromLookupField(goodValue) + 1, 2), "ID [" + goodValue + "] + 1 2 se";
            enako(getIDFromLookupField(undefined), undefined, "Undefined argument vnosa mora vrniti Nedefiniran rezultat.");
            enako(getIDFromLookupField(""), undefined, "Prazen argument vnosa mora vrniti nedefinirana vrednost.");
            enako(getIDFromLookupField("gobbledigood3-thq;dkvn ada;skfja sdjfbvubvqrubqer0873407t534piutheqw;VN"), undefined,"Naj vedno vrne rezultat kabriolet na celo število");
            enako(getIDFromLookupField("2;#drugo osebo"), "2", "Preverjanje [2;#drugo osebo].");
            enako(getIDFromLookupField("9834524;#dolge vrednosti"), "9834524", "Velike vrednosti test.");
            notEqual(getIDFromLookupField("5;#kdorkoli", 6), 6, "Testiranje a notEqual (5 ni enako 6 za ta vzorec: [5;#kdorkoli]");

        });

        modul("htmlEscape");
        test("QuizUtil htmlEscape()", Funkcija () {
            enako(htmlEscape("<"), "&lt;", "Bežijo manj kot upravljavec ('<')");
            enako(htmlEscape("<razred del =  "someclass">Nekaj besedila</div>"), "&lt;razred del =&quot;SomeClass&quot;&gt;Nekaj besedila&lt;/div&gt;", "Bolj zapletene test niz.");
        });

        modul("getDateAsCaml");
        test("QuizUtil getDateAsCaml()", Funkcija () {
            enako(getDateAsCaml(nove Datum("12/31/2013")), "2013-12-31T:00:00:00", "Testiranje nespremenljivo zapisan datum: [12/31/2013]");
            enako(getDateAsCaml(nove Datum("01/05/2014")), "2014-01-05T:00:00:00", "Testiranje nespremenljivo zapisan datum: [01/05/2014]");
            enako(getDateAsCaml(nove Datum("01/31/2014")), "2014-01-31T:00:00:00", "Testiranje nespremenljivo zapisan datum: [01/31/2014]");
            enako(getTodayAsCaml(), getDateAsCaml(nove Datum()), "getTodayAsCaml() mora biti enak getDateAsCaml(nov datum())");
            enako(getDateAsCaml(»nesmisel vrednost"), undefined, "Poskusite dobiti datum vrednost neumnosti.");
            enako(getDateAsCaml(undefined), undefined, "Poskusite dobiti datum v [undefined] datum.");
        });

        modul("getParameterByName");
        test("QuizUtil getParameterByName (iz niza poizvedbe)", Funkcija () {
            enako(getParameterByName(undefined), undefined, "Poskusite dobiti Nedefiniran parameter vrne undefined.");
            enako(getParameterByName("ne obstaja"), undefined, "Poskušali dobiti vrednost parametra, ko vemo, da je parameter ne obstaja.");

        });

        modul("Piškotki");
        test("QuizUtil različne funkcije piškotek.", Funkcija () {
            enako(setCookie("test", "1", -1), getCookieValue("test"), "Get piškotek nastavim should opus.");
            enako(setCookie("anycookie", "1", -1), True, "Nastavitev veljaven kuhanje should odziv"true".");
            enako(setCookie("noro piškotek ime !@#$%"%\^&*(()?/><.,", "1", -1), True, "Nastavitev slabo piškotek ime naj vrne"false".");
            enako(setCookie(undefined, "1", -1), undefined, "Mimo definirana kot ime piškotka.");
            enako(getCookieValue("ne obstaja"), "", "Piškotek ne obstaja test.");
        });

    </skript>
</vodja>
<telo>
    <div ID= "qunit"></div>
    <div ID= "qunit-stalnica"></div>

</telo>
</HTML>

Obstaja nekaj stvari, ki se dogaja tu:

  1. Navajanje svoj zbornik (QuizUtil.js)
  2. Navajanje Qunity.js
  3. Opredelitev nekaterih modulov (getIDFromLookup, Piškotki, in drugi)
  4. Dajanje a <div> katerega ID je "qunit".

Nato, Sem samo dvigni tostran in dobiš kaj takega:

image

Slika 3

Če pogledaš na vrhu, imate nekaj možnosti, dva, ki so zanimive:

  • Skrivanje opravil teste: Precej očitno.  Lahko pomagajo vaše oči, samo glej problematična področja in ni veliko nereda.
  • Modul: (padajočega): To bo filter preskusi na samo tiste skupine testov, ki jih želite.

Za preskuse, sami – nekaj pripomb:

  • Samoumevno je, da morate pisati kodo tako, da je testirati na prvem mestu.  Z orodjem lahko pomaga izvrševanje discipline. Na primer, Sem imel funkcijo, imenovano "getTodayAsCaml()”.  To ni zelo testirati, saj se noben argument vnosa in test za enakost, bi morali nenehno posodabljanje test kodo, da odražajo trenutni datum.  Sem refactored Dodajanje podatkov vhodni parameter in nato mimo trenutni datum, ko hočem današnji datum v obliki CAML.
  • Qunit okvirni dokumenti svoje testi in zdi zelo močna.  Lahko naredite preproste stvari, kot so testiranje za enakost in ima tudi podporo za style ajax klice ("pravi" ali zasmehovali, using vaš najljubši mocker).
  • Tekoč skozi proces tudi sile, da razmišljajo skozi rob primerih – kaj se dogaja z "neopredeljenih" ali null je prešla v funkcijo.  To pomožen mrtvih preprost test teh scenarijev.  Dobre stvari.

Pokritost z Blanket.js

Blanket.js dopolnjuje Qunit s sledenjem dejanski vrstic kode, ki izvršiti tekom teče vaš testov.  Vključuje pravico v Qunit kljub temu je povsem ločene od app, zelo lepo-res izgleda kot da je en brezšivne app.

To je blanket.js v akciji:

image Slika 4

image

Slika 5

(Dejansko moraš klikniti na "Omogoči pokritost" polje na vrhu [glej sliko 3] v ta namen.)

Označene vrstice na sliki 5 bili izvršeni po katerem koli od mojih testov, zato morate oblikovati test, ki povzročajo jih vršiti če hočem popolno zajetje.

Dobili blanket.js, ki delajo z naslednjim korakom:

  1. Prenesete iz http://blanketjs.org/.
  2. Dodati projektu
  3. Posodobite vaše strani pas test (QuizUtil_test.html v mojem primeru) takole:
    1. Referenčna koda
    2. Okrasite vaš <skript> reference takole:
    <skript vrsta= text/javascript"" src="QuizUtil.js" podatki zajemajo></skript>

Blanket.js dvigne atribut "podatkov-kritje" in ne njeno čarobno.  Kljuke v Qunit, Posodobi UI dodati možnost "Omogoči pokritost" in kot tančica tanka tkanina!

Povzetek (TL; DR)

Uporabo Qunit pisanje testnih primerov.

  • Travnato gričevje to
  • Dodati projektu
  • Pisanje test pas stran
  • Ustvarite vaš testi
    • Nekatere kode biti testable refactor
    • Bodite kreativni!  Razmišljati o crazy, nemogoče scenarijev in test jih nekako.

Uporabite blanket.js, da se zagotovi pokritost

  • Preverite, ali deluje Qunit
  • Travnato gričevje blanket.js ter povečati to v vaš projekt
  • Dodajte vaš test pas stran:
    • Dodajte sklic v blanket.js
    • Dodaj "podatkov-kritje" attribute v vaš <skript> Tag
  • Teči Qunit preskusov.

Nikoli nisem storil vse to pred in imel nekatere nepopolne stvari delajo v nekaj urah. 

Happy testiranje!

</namen>

undefinedNaročite se na moj blog.

Sledite mi na Cvrkutati na http://www.twitter.com/pagalvin

Lists.asmx, GetList in "vrednost ne more biti null”

Sem danes odkril da je GetList() metoda v Lists.asmx Spletna storitev je zelo skrbno imenuje ali je nagnjen k vrgel skrivnostni "Vrednost ne more biti nič" izjema (in to je ob predpostavki, da lahko prideš mimo še slabše sporočilo o splošni napaki, "Izjema tipa" Microsoft.SharePoint.SoapServer.SoapServerException’ bil vržen.")  Posebej, Sem našel kakršne koli predpono ne more zagotoviti na GetList način.  Naslednje odrezek jQuery ponazarja točka:

image

Če si to naredil, spletne storitve se odziva s "Vrednost ne more biti ničen" glede na to Fiddler-HTTP prepis, ki:

<?različica XML = "1,0" kodiranje = "utf-8"?>
  <milo:Ovojnica
     xmlns:milo ="
http://schemas.xmlsoap.org/SOAP/Envelope/"    
     xmlns:XSi = "
http://www.w3.org/ 2001/XMLSchema-primer
     xmlns:xsd ="
http://www.w3.org/ 2001/XMLSchema">

  <milo:Telo>
    <milo:Krivda>
      <faultcode>milo:Strežnik</faultcode>
      <faultstring>
        Razen tipa "Microsoft.SharePoint.SoapServer.SoapServerException’ bil vržen.
      </faultstring>
      <podrobnosti>
        <errorstring xmlns ="
http://schemas.Microsoft.com/SharePoint/SOAP/">
Vrednost ne more biti nič.
        </errorstring>
      </podrobnosti>
    </milo:Krivda>
  </milo:Telo>
</milo:Ovojnica>

seveda, verjetno ne bi dodate to predpono "s0" na svoje, vendar nekaj orodja so nagnjena k to storiti (kot Eclipse).

To je vse bolj zmedeno / frustrirajuće, ker druge metode prenašajo predpone.  Na primer, v GetListCollection metoda ne moti, če je bila pred, tudi z neumnosti predpone kot "xyzzy":

image

To »vrednost ne more biti nič« se zdi precej skupnega z lists.asmx, zato upajmo, da bo to pomagalo nekdo, v prihodnosti.

</namen>

Naročite se na moj blog.

Sledite mi na Cvrkutati na http://www.twitter.com/pagalvin

Endlessly gnezdenje <div> Oznake in jQuery

To se zdi kot take Otkačen tema, Nisem prepričan, da je res vredno blogging o, ampak to je nikoli me je ustavil pred, tako da gremo Smile

Sem telovaditi na projektu, kjer sem vleče nekaj podatkov iz iskanja, pakiranje sporočilo o napaki XML in nato da XML na koncu preoblikovala v HTML pot XSLT.  Tam sodeluje veliko jQuery, en bit, ki izvaja nekaj funkcionalnosti tabbing.  Ko kliknete na zavihek (res, a <div>), jQuery sklicuje .hide() in .show() na različnih divs (Ko začetno polnitev stran downloads vsi zadovoljen, tako da ni nobenih povratnih objav v tem primeru).

Kup ur nazaj, zanka preklopitev logika začel obnašati nepredvidljivo in ne bi prikazuje enega od svoj tabs.  Sem navsezadnje gosenicami do dejstva, da internet explorer (vsaj) mislil, da je <div> Tags ugnezdena daleč, veliko globlje, kot predvideno.Developer toolbar bi pokazal:

-<div id = "Tab1Content">
  -<div>
    -<div>
      -<div id = "Tab2Content">
        -<div>
           …………………………
                   </div>  <— končno kaže, da je zaprla vse poti tukaj!

Tako, Če sem storil a $("#Tab1Content").Skrij(), Bi tudi skriti Tab2 in nikoli ne bi pokazal Tab2, če tudi ni pokazal Tab1.  Kopirali in prilepili kodo v visual studio in je vse v div obloge gor lepo pokazala, tako, kot naj bi bili opravljali, videti takole:

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

Premagati mojo glavo ob zid za nekaj časa in opazil, da je bil dejanski HTML kodo ustvarja veliko praznih <div> Tags, kot:

<telo>

  <div id = "Tab1Content">

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

  </div>

  <div id = "Tab2Content">

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

  </div>

</telo>

(Zgoraj je waaaaaaaaaaaay poenostavljeno.  Prazen div oznake so popolnoma veljavna. Nekaj mojih <div> oznake so bile polne vsebine, vendar ni bilo veliko več.  Sem prišel do spoznanja, da moje <XSL:za vsako> direktiv so bili oddajajo skrajšani obliki div tags ko xsl:za vsako nisem "najde podatkov.  Sem prisiljen HTML komentar v izhod, kot je prikazano:

image

 

Čez sem storil to, vse div postavili lepo in moj zanka preklopitev začel delati.

Kot vedno, Jaz upanje to pomoč nekdo v ščepec.

</namen>

Naročite se na moj blog.

Sledite mi na Cvrkutati na http://www.twitter.com/pagalvin

Eden vzrok za "ustvarjalca ta napaka ni navedel razlog.”

Sem bil početje veliko dela s SharePoint Išči zadnje čase in posebej KeywordQuery razred, lastnosti in metod.

Če želite rezultate v rezultate, ki presegajo običajni osumljenci (glej tukaj), dodate v zbirko SelectedProperties, kot v:

myKeywordQuery.SelectProperties.Add("xyzzy");

Najlepša hvala in konice klobuk v Corey Roth in Ta velikanski uslužen blog post (http://www.dotnetmafia.com/blogs/dotnettipoftheday/archive/2008/02/19/how-to-use-the-moss-enterprise-search-keywordquery-class.aspx)

V mojem primeru, "xyzzy" ni dejansko upravljano lastnost.  Ko sem dodal, da SelectedProperties nekako, SharePoint vrgel eden izmed mojih najljubših kdaj runtime izjeme:

"Ustvarjalca ta napaka ni navedel razlog."

Jaz še posebej všeč kapitala "R" v razlog.  To mi zveni, kot enakovredno .NET"Imam ne usta, in mora scream.”

</namen>

Naročite se na moj blog.

Sledite mi na Cvrkutati na http://www.twitter.com/pagalvin

Priročno referenčno: Privzeto rezultate od KeywordQuery iskanja

Kdaj boste priklicati v izvršitev() metoda na a KeywordQuery, Ustvarite lahko ResultTable na ResultType.RelevantResults podlagi.  Ta košček kode ponazarja, kaj mislim:

ResultTableCollection resultsTableCollection = myKeywordQuery.Execute();

ResultTable searchResultsTable = resultsTableCollection[ResultType.RelevantResults];

Končna tabela bo imel naslednje stolpce podatkov: 

WorkId
Rank
Naslov
Avtor
Velikost
Pot
Opis
Napisati
Imemesta
CollapsingStatus
HitHighlightedSummary
HitHighlightedProperties
ContentClass
IsDocument
PictureThumbnailURL
ServerRedirectedURL

Sem ta seznam nastanejo za SharePoint 2010 okolje, lotitev naklada.  Upajmo, da bo prav, da nekdo v prihodnosti.

</namen>

Naročite se na moj blog.

Sledite mi na Cvrkutati na http://www.twitter.com/pagalvin

Eden od razlogov za: "Uspelo ekstrakt cab datoteke v raztopini”

Medtem ko delate na del visual studio web projekt danes, Sem storil manjše re-org nekaterih datotek položiti v mapi »_Layouts« , kot del procesa uvajanja. Posebej, Jaz preimenovati a .js pila iz "TypeAhead.js" v "TypeAhead(stari).js"  Nameravam ga odstranite takoj, ko njegov naslednik "TypeAhead.js" dokazuje pravilno.  Je izgledala:

image

To je takoj povzročilo problem z visual studio, ko sem poskušal razviti projekt:

Napaka v programu uvajanja korak "Dodaj rešitev": Citat cab datoteke v rešitvi ni uspelo.

Izkazalo se je, da ne smete dati oklepaj v imenih datotek.  Sem odstranil je parens in da je problem rešen.

</namen>

Naročite se na moj blog.

Sledite mi na Cvrkutati na http://www.twitter.com/pagalvin