Kategoriarkiv: SharePoint-utvikling

HTTP 406 Feil ved kantete $http.get mot SharePoint resten endepunkt

Oppdateringen: Marc AD ndersson påpekt denne store stykke informasjon: http://blogs.Office.com/2014/08/13/JSON-Light-support-rest-SharePoint-API-Released/. Det forklarer mye :).

Det kan være verste tittelen på et blogginnlegg noensinne! Anyhoo.

Jeg vanligvis gjør alle mine prototyping mot en O365-forekomst. Jeg har min personlige forekomst slik at jeg ikke trenger å være bekymret påvirker andre. Som en side-Husk når vi kaller båret rundt virtuelle maskiner på vår bærbare med MOSS-SQL Server, IIS, bestemme Hyper-V vs. VMWare? Anyhoo...

Jeg hadde utviklet en app med Angular i dette miljøet som gjør, blant annet, Dette:

$http.Get(serverUrl)
.suksess(funksjonen(data, status, overskrifter, config) {

var getLinksResponse = data;

getLinksResponse.value.forEach(funksjonen(theResult) {

// og så videre og så skum

Dette arbeidet rettferdig fin i to forskjellige SharePoint online miljøer. Men, Når min kollega portet den til en Cloudshare, Han fikk en HTTP 406 feil (som var første gang jeg noen gang fikk den, så... yay, jeg tror det). Vi gjorde litt research og la merke til at overskriften "Godta" var av. SharePoint online var helt fornøyd med:

Godta: programmet/json

Men cloudshare forekomsten (SP er på prem, vert for en virtuell server) ville klassiske "odata = utførlig" lagt i tillegg:

Godta: programmet/json;OData = detaljert

Å fastsette det, vi lagt til overskriften slik:

var config = {overskrifter: {
'Akseptere': "program/json;OData = utførlig '
}
};

$http.Get(serverUrl,config)
.suksess(funksjonen(data, status, overskrifter, config) {

var getLinksResponse = data;

getLinksResponse.value.forEach(funksjonen(theResult) {

// og så videre og så skum

Som ble kvitt den 406, men det også endret formatet på svaret. Det var mer... detaljert. (haha!) Flere endringer er nødvendig og her er resultatet:

var config = {overskrifter: {
'Akseptere': "program/json;OData = utførlig '
}
};

$http.Get(serverUrl,config)
.suksess(funksjonen(data, status, overskrifter, config) {

var getLinksResponse = data;

getLinksResponse.d.results.forEach(funksjonen(theResult) {

// og så videre og så skum

Dette bare omgjort til en 30 minutt problem for oss, så vi lucked ut. Forhåpentligvis finner noen dette nyttig.

</slutten>

Økende bevissthet / Adopsjon av JavaScript rammer

Min kollega, Javed Ansari (http://www.bigapplesharepoint.com/team?showExpertName=Javed%20Ansari&rsource=pgblog), skrev et kort sammendrag blogginnlegg på rammer han liker eller minst har vært med med med SharePoint: http://www.bigapplesharepoint.com/pages/View-An-Insight.aspx?BlogID=53&rsource=PGBlog).

jQuery synes å ha vært victor på feltet, så å si, for år nå, men de andre er flere nye og stillbilder slags kjemper, som Angular. (SPServices, selvfølgelig, har vært en livet sparer i år og vil fortsette å være så jeg tror).

Hva folk bruker? De er fokusert mer på Microsofts verktøy (CSOM / JSOM) eller flytte mer mot Angular, Knockout, Aske, osv.?

Jeg har en voksende bias mot disse ikke-Microsoft-rammer. Jeg tror ting som MSFT er vanskeligere og vanskeligere å arbeide med, krever nesten like mye av læringskurve som gammel stil serversiden dev.

Legge inn en kommentar her eller over på Big Apple SharePoint Hvis du vil diskutere (Big Apple får mer sannsynligheten for en god diskusjon).

</slutten>

Spinning SharePoint tidtakerjobber fra samlingen områdekonfigurasjon

Min kollega, Ashish Patel, skrev et blogginnlegg Beskriver en fleksible timer jobb arkitektur som gir noen nice fleksibiliteten å støtte tidkrevende oppgaver og/eller rapporter.  I hans ord:

1. Analysere sjekket ut filer og sende påminnelser til personer om antall dager (siden filen ble sjekket ut) overskride visse terskelen grenser

2. Fjerne koblinger fra annet innhold når en bestemt innhold fjernes eller arkivert fra systemet

3. Brukeren ønsker å se alle varslene som han abonnerer på alle Web-områder i områdesamlingen

4. Sender en påminnelser til forfattere å overprøve innholdet når en gjennomgang tid ble angitt i innholdet, og at datoen nærmer seg

Brønnen, listen går på...

– Se mer på: http://www.bigapplesharepoint.com/ sider/Vis-en-Insight.aspx?BlogID=40#sthash.7cKuiwly.dpuf

Det er tider i min siste når har noe som dette ville ha vært svært nyttig.

</slutten>

hvordan: Konfigurere Enhetstest og testen dekning med QUnit.js og Blanket.js For et kontor 365 SharePoint App

Intro

Jeg har vært å utforske enhetstesting og teste dekning for JavaScript som jeg jobber på en ny SharePoint-app for SharePoint online i Office 365 Suite.  Banene som selvskreven forskning ledet meg til å Qunit.js og etter at, til Blanket.js.

QUnit la meg definere enhet tester og gruppere dem i moduler.  En modul er bare en enkel måte å organisere relaterte tester. (Jeg er ikke sikker jeg bruker det som den skal, men det fungerer for meg så langt med de små tester jeg hittil har definert).

Blanket.js integreres med Qunit og det viser meg de faktiske linjene med JavaScript som var- og enda viktigere-var ikke faktisk utført i løpet av tester.  Dette er "dekning"-linjer som kjøres som er dekket av testen, mens andre ikke.

Mellom definere god test sakene og vise dekning, Vi kan redusere risikoen for at våre koden har gjemt defekter.  Gode tider.

Qunit

Antar du har Visual Studio prosjekt satt, Start ved å laste ned JavaScript pakken fra http://qunitjs.com.  Legg til JavaScript og tilsvarende CSS i løsningen.  Min ser slik ut:

image

Figur 1

Som du kan se, Jeg brukte 1.13.0 på tiden skrev jeg dette blogginnlegget. Ikke glem å laste ned og legge CSS-filen.

Det ut av veien, neste skritt er å lage en slags test seletøy og referanse Qunit biter.  Jeg tester en haug av funksjoner i en skriptfil kalt "QuizUtil.js" så jeg laget en HTML-side som kalles "QuizUtil_test.html" som vist:

image Figur 2

Her er koden:

<!DOCTYPE HTML>
<HTML xmlns= "http://www.w3.org/ 1999/xhtml">
<hodet>
    <tittel>QuizUtil test med Qunit</tittel>
    <kobling rel= "stylesheet" href="../CSS/qunit-1.13.0.CSS" />
    <skriptet type= text/javascript"" src="QuizUtil.js" data-cover></skriptet>
    <script type ="text/javascript" src ="qunit-1.13.0.js"></skriptet>
    <script type ="text/javascript" src ="blanket.min.js"></skriptet>

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

            lik(getIDFromLookupField(goodValue) + 1, 2), "ID av [" + goodValue + "] + 1 bør være 2";
            lik(getIDFromLookupField(Udefinert), Udefinert, "Udefinert inndataargumentet skal returnere udefinert resultatet.");
            lik(getIDFromLookupField(""), Udefinert, "Tom inndataargumentet skal returnere en udefinert verdi.");
            lik(getIDFromLookupField("gobbledigood3-thq;dkvn ada;skfja sdjfbvubvqrubqer0873407t534piutheqw;vn"), Udefinert,"Bør alltid returnere en kabriolet resultatet til et heltall");
            lik(getIDFromLookupField("2;#en annen person"), "2", "Kontrollere [2;#en annen person].");
            lik(getIDFromLookupField("9834524;#lang verdi"), "9834524", "Stor verdi test.");
            notEqual(getIDFromLookupField("5;#noen", 6), 6, "Testing en notEqual (5 er ikke lik 6 for dette eksemplet: [5;#noen]");

        });

        modul("htmlEscape");
        test("QuizUtil htmlEscape()", funksjonen () {
            lik(htmlEscape("<"), "&lt;", «Escaping et mindre enn-operator ('<')");
            lik(htmlEscape("<div class =  "someclass">Tekst</div>"), "&lt;div class =&quot;SomeClass&quot;&gt;Tekst&lt;/div&gt;", "Mer komplekse teststrengen.");
        });

        modul("getDateAsCaml");
        test("QuizUtil getDateAsCaml()", funksjonen () {
            lik(getDateAsCaml(nye Dato("12/31/2013")), "2013-12-31T:00:00:00", "Testing hardkodet dato: [12/31/2013]");
            lik(getDateAsCaml(nye Dato("01/05/2014")), "2014-01-05T:00:00:00", "Testing hardkodet dato: [01/05/2014]");
            lik(getDateAsCaml(nye Dato("01/31/2014")), "2014-01-31T:00:00:00", "Testing hardkodet dato: [01/31/2014]");
            lik(getTodayAsCaml(), getDateAsCaml(nye Dato()), "getTodayAsCaml() bør tilsvare getDateAsCaml(ny dato())");
            lik(getDateAsCaml("tull verdi"), Udefinert, "Prøv å få datoen for en tull verdi.");
            lik(getDateAsCaml(Udefinert), Udefinert, "Prøv å få datoen for den [Udefinert] datoen.");
        });

        modul("getParameterByName");
        test("QuizUtil getParameterByName (fra søkestrengen)", funksjonen () {
            lik(getParameterByName(Udefinert), Udefinert, "Prøv å få udefinert parameter skal returnere udefinert.");
            lik(getParameterByName("finnes ikke"), Udefinert, "Prøv å få parameterverdi når vi vet parameteren ikke finnes.");

        });

        modul("Cookies");
        test("QuizUtil ulike cookie funksjoner.", funksjonen () {
            lik(setCookie("test", "1", -1), getCookieValue("test"), "Få en informasjonskapsel jeg skal fungere.");
            lik(setCookie("anycookie", "1", -1), sann, "Angi en gyldig matlaging skal returnere 'true'.");
            lik(setCookie("crazy informasjonskapselnavn !@#$%"%\^&*(()?/><.,", "1", -1), sann, "Angi en dårlig informasjonskapselnavn skal returnere false'.");
            lik(setCookie(Udefinert, "1", -1), Udefinert, "Passerer udefinert som informasjonskapselen.");
            lik(getCookieValue("finnes ikke"), "", "Cookien ikke finnes test.");
        });

    </skriptet>
</hodet>
<kroppen>
    <div ID= "qunit"></div>
    <div ID= "qunit-lampen"></div>

</kroppen>
</HTML>

Det er flere ting skjer her:

  1. Referanse kode (QuizUtil.js)
  2. Henviser Qunity.js
  3. Definere noen moduler (getIDFromLookup, Informasjonskapsler, og andre)
  4. Plassere en <div> Hvis ID er "qunit".

Deretter, Jeg trekke bare opp denne siden og du får noe som dette:

image

Figur 3

Hvis du ser øverst, har du noen alternativer, to av dem er interessant:

  • Skjul bestått tester: Ganske åpenbart.  Kan hjelpe deg bare se problemområder og ikke en masse rot.
  • Modul: (rullegardinmenyen): Dette vil filtrere testene til bare de gruppene av tester du vil.

Som for prøver selv-noen kommentarer:

  • Det går uten å si at du trenger å skrive koden slik at det er testbare i første omgang.  Ved hjelp av verktøyet kan bidra til å håndheve den disiplinen. For eksempel, Jeg hadde en funksjon kalt "getTodayAsCaml()”.  Dette er ikke etterprøvbar siden det tar ingen inndataargumentet og teste det for likestilling, Vi må kontinuerlig oppdatere test koden for å gjenspeile gjeldende dato.  Jeg refactored det ved å legge til en data-inndataparameteren deretter passerer gjeldende dato når jeg vil dagens dato i CAML-format.
  • Qunit rammen dokumenter sine egne tester og det synes ganske robust.  Det kan gjøre enkle ting som tester for likestilling og har også støtte for ajax-stil samtaler (både "ekte" eller spottet benytter din favoritt spotter).
  • Gå gjennom prosessen tvinger deg til å tenke gjennom kanten-hva skjer med "udefinert" eller null er sendt til en funksjon.  Det gjør det døde enkelt å teste disse scenariene ut.  Gode ting.

Dekning med Blanket.js

Blanket.js utfyller Qunit ved å spore faktiske kodelinjene som utføres i løpet av din tester.  Det integreres rett i Qunit så selv om det er en helt egen app, Det spiller pent-det egentlig ser ut som det er en sømløs app.

Dette er blanket.js i aksjon:

image Figur 4

image

Figur 5

(Faktisk må du klikke på avkrysningsruten «Aktiver dekning» øverst [se figur 3] aktivere dette.)

De uthevede linjene i figur 5 ikke er utført av noen av mine tester, så jeg trenger å tenke ut en test som forårsaker dem til å kjøre hvis jeg vil full dekning.

Få blanket.js fungerer på følgende måte:

  1. Laste det ned fra http://blanketjs.org/.
  2. Legge det til i prosjektet
  3. Oppdatere testsiden sele (QuizUtil_test.html i mitt tilfelle) slik:
    1. Referanse koden
    2. Dekorere din <skriptet> referanse som dette:
    <skriptet type= text/javascript"" src="QuizUtil.js" data-cover></skriptet>

Blanket.js plukker opp attributtet "data-cover" og gjør sin magi.  Det kroker i Qunit, oppdaterer Grensesnittet for å legge til alternativet "Aktiver dekning" og voila!

Sammendrag (TL; DR)

Bruk Qunit til å skrive din test tilfeller.

  • Dataoverføre den
  • Legge det til i prosjektet
  • Skrive en test seletøy for
  • Opprette tester
    • Refactor noen av din koden skal være testbare
    • Vær kreativ!  Tenk på gal, umulig scenarier og teste dem allikevel.

Bruk blanket.js å sikre dekning

  • Kontroller at Qunit fungerer
  • Last ned blanket.js og legger den til prosjektet
  • Legge det til sele testsiden:
    • Legg til en referanse blanket.js
    • Legge til en "data-cover" attributt til din <skriptet> Tag
  • Kjøre Qunit tester.

Jeg har aldri gjorde noe av dette før og hadde noen enkle ting i en håndfull timer. 

Happy testing!

</slutten>

undefinedAbonner på bloggen min.

Følg meg på Twitter på http://www.twitter.com/pagalvin

Lists.asmx, GetList og "verdi kan ikke være null”

Jeg oppdaget i dag som GetList() metoden i lists.asmx webtjenesten har å bli kalt veldig nøye, eller det er utsatt for å kaste en mystisk "Verdi kan ikke være null"-unntak (og som er forutsatt du kan komme forbi enda verre generisk feilmelding, "Unntak av typen ' Microsoft.SharePoint.SoapServer.SoapServerException’ ble kastet.")  Spesielt, Jeg fant ut at du ikke kan tilby noen form for prefiks i GetList-metoden.  Følgende jQuery snippeten illustrerer poenget:

image

Hvis du gjøre det, Webtjenesten svarer med "Verdi kan ikke være null" i henhold til dette Fiddler-gitt HTTP transkripsjon:

<?XML version = "1.0" Encoding = "utf-8"?>
  <såpe:Konvolutt
     xmlns:SOAP ="
http://schemas.xmlsoap.org/SOAP/Envelope/"    
     xmlns:xsi = "
http://www.w3.org/2001/XMLSchema-instance
     xmlns:XSD ="
http://www.w3.org/2001/XMLSchema">

  <såpe:Kroppen>
    <såpe:Feilårsak>
      <faultcode>såpe:Server</faultcode>
      <faultString:>
        Unntak av typen ' Microsoft.SharePoint.SoapServer.SoapServerException’ ble kastet.
      </faultString:>
      <detalj>
        <xmlns errorString ="
http://schemas.Microsoft.com/SharePoint/SOAP/">
Verdien kan ikke være null.
        </errorString>
      </detalj>
    </såpe:Feilårsak>
  </såpe:Kroppen>
</såpe:Konvolutt>

selvfølgelig, du vil ikke sannsynligvis legge prefikset "s0" på egen hånd, men noen verktøy er tilbøyelig til å gjøre det. (som Eclipse).

Dette er alle mer forvirrende / frustrerende fordi andre metoder tolerere prefikser.  For eksempel, den GetListCollection metoden oppmerksom ikke på hvis det er blitt prefikset, selv med tull prefikser som "xyzzy":

image

Dette "verdi ikke kan være null" synes ganske vanlig med lists.asmx så forhåpentligvis vil dette hjelpe noen ut i fremtiden.

</slutten>

Abonner på bloggen min.

Følg meg på Twitter på http://www.twitter.com/pagalvin

Uendelige fuglefjell <div> Koder og jQuery

Dette virker som en så underlig tema, Jeg er ikke sikker på at det er virkelig verdt blogging om, men som har aldri stoppet meg før, så her gå vi Smil

Jeg arbeider på et prosjekt der jeg trekke noen data fra et søk, emballasje det i en XML-meldingen og deretter at XML er til slutt transformert til HTML via XSLT.  Det er mye av jQuery involvert, en bit av som implementerer noen tabulatornumre funksjonalitet.  Når du klikker på en kategori (virkelig, en <div>), jQuery påkaller .hide() og .show() på ulike divs (Startside belastningen laster ned alt innholdet slik at det er ingen postbacks i dette tilfellet).

En haug med timer siden, kategorien bytte logikk begynte å virke uregelmessig og det vil ikke vise en av Mine fliker.  Jeg til slutt spores det ned til faktum at internet explorer (minst) tenkte at den <div> koder som er nestet langt, langt dypere enn beregnet.Ville vise utviklerverktøylinjen:

-<div id = "Tab1Content">
  -<div>
    -<div>
      -<div id = "Tab2Content">
        -<div>
           …………………………
                   </div>  <-til slutt viser det ble lukket hele veien ned her!

Så, Hvis jeg gjorde en $("# Tab1Content").Skjul(), Jeg ville også skjule Tab2 og jeg kunne aldri vise Tab2 hvis ikke jeg også vise Tab1.  Jeg kopierte og limte inn koden i visual studio og det viste alle div's lining opp pent, akkurat som de skulle gjøre, ser ut som dette:

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

Jeg slo hodet mot veggen for en stund, og la merke til at i den faktiske HTML koden var genererer mye er tom <div> Tags, som:

<kroppen>

  <div id = "Tab1Content">

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

  </div>

  <div id = "Tab2Content">

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

  </div>

</kroppen>

(Dette er waaaaaaaaaaaay oversimplified.  Tom div-koder er helt gyldig. Noen av mine <div> koder var fulle av innhold, men mange flere ble ikke.  Jeg kom til realisering som min <XSL:for each> direktiver var emitting kort-skjemaet div koder når xsl:for each gjorde ikke ' finne noen data.  Jeg tvunget en HTML-kommentar i utdataene, som vist:

image

 

Etter at jeg gjorde det, alle div lined opp pent og min kategorien bytte begynte å arbeide.

Som alltid, Jeg håper dette hjelper noen i en klemme.

</slutten>

Abonner på bloggen min.

Følg meg på Twitter på http://www.twitter.com/pagalvin

En sak for "skaperen av denne feilen ikke angav en grunn.”

Jeg har gjort mye arbeid med det siste SharePoint-Søk og spesielt KeywordQuery-klassen, Egenskaper og metoder.

Hvis du vil at resultatsettet til å returnere resultater utover de vanlige mistenkte (se her), du legger det til i samlingen SelectedProperties, som i:

myKeywordQuery.SelectProperties.Add("xyzzy");

Mange takk og et tips av hatten å Corey Roth og Dette enormt nyttig blogginnlegg (http://www.dotnetmafia.com/blogs/dotnettipoftheday/archive/2008/02/19/how-to-use-the-moss-enterprise-search-keywordquery-class.aspx)

I mitt tilfelle, "xyzzy" er ikke egentlig en forvaltet egenskap.  Når jeg la det til SelectedProperties uansett, SharePoint kastet en av mine favoritt noensinne runtime-unntak:

"Den som oppretteren denne feilen angav ikke en grunn."

Jeg liker spesielt hovedstaden "R" i grunn.  Dette høres for meg ut som den.NET tilsvarer"Jeg har ingen munn, og jeg må skrike.”

</slutten>

Abonner på bloggen min.

Følg meg på Twitter på http://www.twitter.com/pagalvin

Hendig referanse: Standard resultater fra KeywordQuery Søk

Når du starte Execute() metoden på en KeywordQuery, Du kan opprette en ResultTable basert på ResultType.RelevantResults.  Denne kodebiten illustrerer hva jeg mener:

ResultTableCollection resultsTableCollection = myKeywordQuery.Execute();

ResultTable searchResultsTable = resultsTableCollection[ResultType.RelevantResults];

Den resulterende tabellen vil ha følgende kolonner med informasjon: 

Arbeids-IDen
Rang
Tittel
Forfatter
Størrelse
Banen
Beskrivelse
Skrive
Områdenavn
CollapsingStatus
HitHighlightedSummary
HitHighlightedProperties
ContentClass
IsDocument
PictureThumbnailURL
ServerRedirectedURL

Jeg avledet denne listen fra en SharePoint 2010 miljø, Enterprise edition.  Forhåpentligvis vil det praktiske til noen i fremtiden.

</slutten>

Abonner på bloggen min.

Følg meg på Twitter på http://www.twitter.com/pagalvin

En av grunnene til: "Kan ikke trekke ut cab-fil i løsningen”

Mens du arbeider med en webdel for visual studio-prosjekt i dag, Jeg gjorde en mindre re-org av noen filer å bli satt inn i mappen _layouts som en del av distribusjonsprosessen. Spesielt, Jeg har fått nytt navn en js-fil fra "TypeAhead.js" til "TypeAhead(gamle).js"  Jeg har tenkt å fjerne den så snart den etterfølgende aktiviteten "TypeAhead.js" beviser riktig.  Det så ut som dette:

image

Dette forårsaket et problem med visual studio umiddelbart når jeg prøvde å distribuere prosjektet:

Feil i distribusjonen trinn "Legge løsning": Kan ikke trekke ut cab-fil i løsningen.

Det viser seg at du ikke bør sette en parentes i filnavn.  Jeg fjernet den parens og som løst problemet.

</slutten>

Abonner på bloggen min.

Følg meg på Twitter på http://www.twitter.com/pagalvin