Arxius de la categoria: Desenvolupament de SharePoint

HTTP 406 Error quan s'utilitza $http.get Angular contra SharePoint resta punts finals

Actualització: Marc d'anunci ndersson assenyalar aquesta gran peça d'informació: http://Blogs.Office.com/2014/08/13/JSON-Light-support-Rest-SharePoint-API-Released/. Que explica molt :).

Que pot ser el pitjor títol d'una entrada de blog mai! Anyhoo.

Solen fer tota la meva prototipatge contra una instància de O365. Tinc el meu exemple personal per tal que no ha de preocupar per afectar a ningú més. Com acotació al marge – recordeu quan anomenem realitzades al voltant de màquines virtuals en nostres portàtils amb molsa-SQL Server, L'IIS, decidir Hyper-V contra. VMWare? Anyhoo...

Jo havia desenvolupat una aplicació utilitzant Angular en aquest entorn que fa, entre altres coses, això:

$http.Get(URLServidor)
.èxit(funció(dades, l'estat, capçaleres, config) {

var getLinksResponse = dades;

getLinksResponse.value.forEach(funció(theResult) {

// i així successivament i així escuma

Això estava treballant just bé en dos diferents SharePoint entorns en línia. No obstant això, Quan el meu col lega portat-lo a una instància de Cloudshare, ell estava aconseguint un HTTP 406 error (que era la primera vegada que mai arribava aquell, Així que... yay, Suposo que). Vam fer una mica de recerca i s'adonava que l'encapçalament "Accepta" era fora. Era molt feliç amb SharePoint en línia:

Acceptar: aplicació/json

Però l'exemple cloudshare (que és SP en prem, allotjat en un servidor virtual) volia el clàssic "odata = verbosa" afegit en, així:

Acceptar: aplicació/json;OData = depuraci ≤

D'arreglar allò, Hem afegit la capçalera com a tal:

var config = {capçaleres: {
"Accepta": ' aplicació/json;OData = depuraci ≤ "
}
};

$http.Get(URLServidor,config)
.èxit(funció(dades, l'estat, capçaleres, config) {

var getLinksResponse = dades;

getLinksResponse.value.forEach(funció(theResult) {

// i així successivament i així escuma

Que es va desfer de la 406, però també va canviar el format de la resposta. Es tractava més aviat... detallat. (Haha!) Calien canvis més i aquí està el resultat final:

var config = {capçaleres: {
"Accepta": ' aplicació/json;OData = depuraci ≤ "
}
};

$http.Get(URLServidor,config)
.èxit(funció(dades, l'estat, capçaleres, config) {

var getLinksResponse = dades;

getLinksResponse.d.Results.forEach(funció(theResult) {

// i així successivament i així escuma

Això només es va convertir en un 30 minut problema per a nosaltres, així ens va tenir sort a. Esperançadorament algú es troba aquesta útil.

</final>

Consciència creixent / Adopció de marcs de JavaScript

El meu col lega, Javed Ansari (http://www.bigapplesharepoint.com/team?showExpertName=Javed%20Ansari&rsource=pgblog), va escriure una entrada de blog curt resum marcs ell li agrada, o almenys ha estat utilitzant amb SharePoint: http://www.bigapplesharepoint.com/pages/View-An-Insight.aspx?BlogID=53&rsource=PGBlog).

jQuery sembla haver estat el vencedor en l'àmbit, per dir-ho, durant anys ara, però els altres són més noves i alambins una mena de batallant, com Angular. (SPServices, clar, ha estat un salvavides durant anys i seguirà sent així que crec que).

Què gent utilitzant? Es centren més en utillatges de Microsoft (CSOM / JSOM) o movent més cap a Angular, Vuitens de final, Brasa, etc?

Tinc un biaix creixent cap a aquests marcs no-Microsoft. Crec que les coses MSFT és més difícil i més difícil de treballar amb, ocupar gairebé com gran part de la corba d'aprenentatge com a estil antic servidor dev.

Envia un comentari aquí o més vigent en Gran Poma SharePoint Si vostè vol discutir (Gran Poma tindran més probabilitat d'un bon debat).

</final>

Filatura feines del temporitzador del SharePoint de configuració del lloc recollida

El meu col lega, Ashish Patel, va escriure una entrada de blog descrivint una arquitectura de feina del temporitzador flexible que ofereix alguns agradable flexibilitat per donar suport a llarga tasques i/o informes.  En les seves paraules:

1. Analitzant facturat arxius i enviar notificacions a les persones si el nombre de dies (ja s'ha desprotegit el fitxer) superen certs límits llindar

2. Treure enllaços des d'altres continguts quan un determinat contingut és eliminat o arxivades del sistema

3. L'usuari vol veure totes les alertes que Subscriu en tots els webs en la col·lecció de llocs

4. Enviant un recordatoris als autors per revisar el contingut en un moment de revisió s'ha especificat en el contingut i que s'acosta la data

Pou, la llista segueix...

– Veure més a: http://www.bigapplesharepoint.com/ pàgines/vista-An-Insight.aspx?BlogID=40#sthash.7cKuiwly.dpuf

Hi ha moments en el meu passat quan després d'haver alguna cosa com això hauria estat molt útil.

</final>

Com a: Configurar la prova de unitat i prova de cobertura amb QUnit.js i Blanket.js per a una oficina 365 App de SharePoint

Introducció

Jo he estat explorant proves unitàries i cobertura de prova per JavaScript com treballo en un app nou SharePoint SharePoint en línia a l'oficina 365 Suite.  Els camins evident recerca em va portar a QUnit.js i just després que, per Blanket.js.

QUnit permetin establir proves d'unitat i agrupar-los en mòduls.  Un mòdul és només una manera simple d'organitzar proves relacionades. (No estic segur que estic utilitzant-lo segons el previst, però està treballant per a mi fins ara amb el petit conjunt de proves que fins ara han definit).

Blanket.js s'integra amb Qunit i em mostrarà les línies actuals de JavaScript que eren – i més importantment-no eren realment executada en el curs d'execució de les proves.  Això és "cobertura"-línies que executava són coberts per la prova, mentre que altres no són.

Entre establint bons casos de prova i veure cobertura, podem reduir el risc que el nostre codi ha amagat defectes.  Bons moments.

QUnit

Suposant que té el seu estudi Visual projecte va establir, Comenci descarregant el paquet JavaScript des http://qunitjs.com.  Afegir el JavaScript i CSS corresponent a la seva solució.  Mina els aspectes com això:

image

Figura 1

Com es pot veure, Estava utilitzant 1.13.0 en el moment que vaig escriure aquesta entrada de blog. No oblidi descarregar i afegir l'arxiu CSS.

Que fora de la manera, següent pas és crear algun tipus de prova arnès i els bits Qunit de referència.  Estic provant un munt de funcions en un arxiu d'escriptura anomenat "QuizUtil.js", així que he creat una pàgina HTML anomenat "QuizUtil_test.html" tal com es Mostra:

image Figura 2

Aquí és el codi:

<!DOCTYPE HTML>
<HTML xmlns= "http://www.w3.org/ 1999/xhtml">
<responsable>
    <títol>Prova QuizUtil amb Qunit</títol>
    <enllaç rel= "full d'estil" href="../CSS/QUnit-1.13.0.CSS" />
    <script tipus= text/javascript"" src="QuizUtil.js" dades-portada></script>
    <tipus d'escriptura ="text/javascript" src ="qunit-1.13.0.js"></script>
    <tipus d'escriptura ="text/javascript" src ="blanket.min.js"></script>

    <script>
        mòdul("getIDFromLookup");
        prova("QuizUtil getIDFromLookupField", funció () {
            var goodValue = "1;#Paul Galvin";

            igual(getIDFromLookupField(goodValue) + 1, 2), "ID de [" + goodValue + "] + 1 hauria de ser 2";
            igual(getIDFromLookupField(indefinit), indefinit, "Argument d'entrada indefinit nar resultat indefinit.");
            igual(getIDFromLookupField(""), indefinit, "Argument d'entrada buit hauria de retornar un valor indefinit.");
            igual(getIDFromLookupField("gobbledigood3-thq;dkvn ada;skfja sdjfbvubvqrubqer0873407t534piutheqw;vn"), indefinit,"Sempre nar un convertible resultat un enter");
            igual(getIDFromLookupField("2;#una altra persona"), "2", «Comprovació [2;#una altra persona].");
            igual(getIDFromLookupField("9834524;#valor llarg"), "9834524", "Prova de gran valor.");
            notEqual(getIDFromLookupField("5;#ningú", 6), 6, "Provant un notEqual (5 no és igual a 6 d'aquesta Mostra: [5;#ningú]");

        });

        mòdul("htmlEscape");
        prova("QuizUtil htmlEscape()", funció () {
            igual(htmlEscape("<"), "&lt;", "Escapar a menys que l'operador ('<')");
            igual(htmlEscape("<classe div =  "someclass">Un text</Div>"), "&lt;classe div =&quot;someclass&quot;&gt;Un text&lt;/Div&gt;", "Cadena de prova més complex.");
        });

        mòdul("getDateAsCaml");
        prova("QuizUtil getDateAsCaml()", funció () {
            igual(getDateAsCaml(nou Data("12/31/2013")), "2013-12-31T:00:00:00", "Provant durament codificat data: [12/31/2013]");
            igual(getDateAsCaml(nou Data("01/05/2014")), "2014-01-05T:00:00:00", "Provant durament codificat data: [01/05/2014]");
            igual(getDateAsCaml(nou Data("01/31/2014")), "2014-01-31T:00:00:00", "Provant durament codificat data: [01/31/2014]");
            igual(getTodayAsCaml(), getDateAsCaml(nou Data()), "getTodayAsCaml() ha la igualtat getDateAsCaml(nova data())");
            igual(getDateAsCaml("valor tonteries"), indefinit, "Intenta aconseguir la cita d'un valor de tonteries.");
            igual(getDateAsCaml(indefinit), indefinit, «Tractar d'aconseguir la data de la [indefinit] data.");
        });

        mòdul("getParameterByName");
        prova("QuizUtil getParameterByName (de la cadena de consulta)", funció () {
            igual(getParameterByName(indefinit), indefinit, "Intenta aconseguir paràmetre indefinit nar indefinit.");
            igual(getParameterByName("no existeix"), indefinit, "Intenta aconseguir el valor del paràmetre quan sabem que el paràmetre no existeix.");

        });

        mòdul(Galetes"");
        prova("QuizUtil diverses funcions de galeta.", funció () {
            igual(setCookie(«prova", "1", -1), getCookieValue(«prova"), "Get una galeta I posar funcionarà.");
            igual(setCookie("anycookie", "1", -1), True, "Creació d'una cuina vàlid hauria de retornar 'veritable'.");
            igual(setCookie("nom de cookie boig !@#$%"%\^&*(()?/><.,", "1", -1), True, "Creació d'un nom de cookie mal hauria de retornar"fals".");
            igual(setCookie(indefinit, "1", -1), indefinit, "Passant indefinit com a nom de galeta.");
            igual(getCookieValue("no existeix"), "", "Galeta no existeixen proves.");
        });

    </script>
</responsable>
<cos>
    <Div ID= «qunit"></Div>
    <Div ID= "qunit-fixació"></Div>

</cos>
</HTML>

Hi ha diverses coses passant aquí:

  1. El meu codi de referència (QuizUtil.js)
  2. Referència Qunity.js
  3. Definició d'alguns mòduls (getIDFromLookup, Galetes, i altres)
  4. Posant una <Div> ID del qual és "qunit".

Llavors, Només aixecar aquesta pàgina i aconsegueix alguna cosa com això:

image

Figura 3

Si ens fixem a la part superior, té unes quantes opcions, dues de les quals són interessants:

  • Amaga passar proves: Força obvi.  Pot ajudar el seu ull només veure les àrees problemàtiques i no molt de desendreçar.
  • Mòdul: (desplegable): Això filtrarà les proves fins a només aquells grups de proves de que vol.

Pel que fa a les proves si mateixos-uns quants comentaris:

  • Cal dir que cal escriure el seu codi tal que això sigui provable en primer lloc.  Utilitzant l'eina pot ajudar a fer complir aquesta disciplina. Per exemple, Tenia una funció anomenada "getTodayAsCaml()”.  Això no és molt comprovables ja que pren cap argument d'entrada i per analitzar-lo per a la igualtat, hauríem d'actualitzar constantment el codi de prova per reflectir la data actual.  Jo ho traslladades afegint un paràmetre d'entrada de dades a continuació, passar la data actual quan vull cita avui en CAML format.
  • El marc Qunit documenta seves pròpies proves i sembla bastant robust.  Es poden fer coses simples com testatge d'igualtat i també té suport per a les trucades de estil ajax (tant "real" o burlat utilitzant el teu mocker favorit).
  • Travessant el procés també t'obliga a pensar a través de casos vora-què passa amb "indefinit" o nul és superat en una funció.  Es fa totalment simple provar aquests escenaris fora.  Coses bones.

Cobertura amb Blanket.js

Blanket.js complementa Qunit mitjançant el seguiment de les actuals línies de codi que executar durant el transcurs de l'execució de les proves.  Integra dret en Qunit així tot i que és un conjunt de seperate app, sona molt bé-realment sembla com si fos un app sense costura.

Això és blanket.js en acció:

image Figura 4

image

Figura 5

(Realment has de fer clic a la casella de selecció "Enable cobertura" a la part superior [veure figura 3] per permetre això.)

Les línies ressaltats en la figura 5 no han estat executades per qualsevol de les meves proves, Així que necessito per dissenyar una prova que els provoquen executar si vull cobertura completa.

Obtenir blanket.js treballant seguint aquests passos:

  1. Descarregar-lo des de http://blanketjs.org/.
  2. Afegir-lo al seu projecte
  3. Actualitzar la seva pàgina de prova arnès (QuizUtil_test.html en el meu cas) les següents:
    1. El codi de referència
    2. Decorar el seu <script> referència com aquest:
    <script tipus= text/javascript"" src="QuizUtil.js" dades-portada></script>

Blanket.js recull l'atribut "cobrir dades" i té la seva màgia.  Es pot enganxar-se Qunit, la interfície d'usuari per afegir l'opció "Habilita cobertura" d'actualitzacions i voila!

Resum (TL; DR.)

Ús Qunit per escriure el seu casos de prova.

  • Descarregar-lo
  • Afegir-lo al seu projecte
  • Escriure una pàgina de prova de Arnés
  • Crear les proves
    • Reestructurar alguns del vostre codi de ser comprovables
    • Ser creatiu!  Crec que de boig, escenaris impossibles i provar-los de totes maneres.

Ús blanket.js per garantir la cobertura

  • Assegureu-vos que Qunit està treballant
  • Descarregar blanket.js i afegir-lo al seu projecte
  • Afegir-lo a la seva pàgina de prova arnès:
    • Afegir una referència a blanket.js
    • Afegeix un atribut de "dades cobrir" pel seu <script> etiqueta
  • Executar les proves Qunit.

Mai va fer res d'això abans i tenia algunes coses rudimentària treballant en un grapat d'hores. 

Proves feliç!

</final>

undefinedSubscriure's al meu blog.

Follow me on Twitter http://www.twitter.com/pagalvin

Lists.asmx, GetList i "valor no pot ser nul”

Avui he descobert que la GetList() mètode en lists.asmx servei web ha de ser anomenat amb molta cura, o és propens a llançar un misteriós "Valor no pot ser nul·la" excepció (i que està suposant que pot aconseguir per davant del missatge d'error genèric fins i tot pitjor, "Una excepció del tipus ' Microsoft.SharePoint.SoapServer.SoapServerException’ s'ha llançat.")  Específicament, He trobat que vostè no pot facilitar cap tipus de prefix en el mètode GetList.  El següent fragment de jQuery il·lustra el punt:

image

Si fas això, el servei web respon amb "Valor no pot ser nul" segons aquest Fiddler-proporcionat expedient HTTP:

<?versió XML = "1.0" codificació = "utf-8"?>
  <sabó:Sobres
     xmlns:sabó ="
http://Schemas.xmlsoap.org/SOAP/envelope/"    
     xmlns:XSi = "
http://www.w3.org/2001/XMLSchema
     xmlns:XSD ="
http://www.w3.org/ 2001/XMLSchema">

  <sabó:Cos>
    <sabó:Culpa>
      <faultcode>sabó:Servidor</faultcode>
      <faultstring>
        Excepció del tipus ' Microsoft.SharePoint.SoapServer.SoapServerException’ va ser llançat.
      </faultstring>
      <detall>
        <errorstring xmlns ="
http://Schemas.Microsoft.com/SharePoint/SOAP/">
Valor no poden ser nul·les.
        </errorstring>
      </detall>
    </sabó:Culpa>
  </sabó:Cos>
</sabó:Sobres>

Clar, vostè probablement no afegir aquest prefix "s0" en el seu propi, però algunes eines són propensos a fer-ho (com eclipsi).

Això és el més confús / frustrant perquè altres mètodes tolerar prefixos.  Per exemple, el GetListCollection mètode no li importa si això és estat prefixat, fins i tot amb prefixos tonteries com "xyzzy":

image

Aquest "valor no pot ser nul·la" sembla bastant comú amb lists.asmx així que espero que això ajudarà algú fora en el futur.

</final>

Subscriure's al meu blog.

Follow me on Twitter http://www.twitter.com/pagalvin

Sense parar nidificació <Div> Etiquetes i jQuery

Això sembla com un tema tan oddball, No estic segur que realment val la pena blogging sobre, però que mai no ha deixat m abans de, Així que aquí anem somriure

Estic treballant en un projecte on m'estic tirant algunes dades d'una cerca, embalatge a un missatge XML i llavors aquella XML en última instància, es transforma en HTML mitjançant XSLT.  Hi ha un munt de jQuery implicats, una mica de que implementa alguna funcionalitat tabulació.  Quan fa clic a una fitxa (realment, un <Div>), jQuery invoca .hide() i .show() en diversos divs (càrrega de la pàgina inicial descarrega tot el contingut, així que hi ha cap devolucions en aquest cas).

Un grapat d'hores fa, la pestanya commutació lògica començar a comportar-se de manera erràtica i no Mostra un dels meus tabuladors.  Jo finalment segueixi fins el fet que Explorador d'internet (com a mínim) pensar que la <Div> Etiquetes niuades lluny, molt més profund que pretén.El toolbar de desenvolupador mostraria:

-<div id = "Tab1Content">
  -<Div>
    -<Div>
      -<div id = "Tab2Content">
        -<Div>
           …………………………
                   </Div>  <— Finalment demostrant que fou clausurada completament aquí!

Així, si feia un $("#Tab1Content").Amaga(), També em vaig amagar els Tab2 i jo podria mai no mostrar Tab2 si no mostrar també Tab1.  Copiava i enganxava el codi a visual studio i va mostrar tots convenint el div manera bonica, igual que suposava estar fent, mirant com aquest:

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

Vaig batre el meu cap contra la paret per una estona i notat que en el present codi HTML codi es genera una gran quantitat de buit <Div> Etiquetes, com:

<cos>

  <div id = "Tab1Content">

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

  </Div>

  <div id = "Tab2Content">

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

  </Div>

</cos>

(Això és waaaaaaaaaaaay simplista.  Les etiquetes div buides són totalment vàlids. Alguns dels meus <Div> Etiquetes estaven plenes de contingut, però no eren molts més.  Vaig arribar a la conclusió que el meu <XSL:per a cada> directives estaven emetent la forma curta etiquetes div quan el xsl:no per-tots "trobar cap dada.  Jo forçat un comentari HTML a la sortida, com es Mostra:

image

 

Després que fes allò, tots el div alineats molt bé i meu tabulador de commutació va començar a treballar.

Com sempre, Espero que això ajudi a algú en un pessic.

</final>

Subscriure's al meu blog.

Follow me on Twitter http://www.twitter.com/pagalvin

Causa per a "el creador d'aquest error no especificat una raó.”

He estat fent molta feina amb SharePoint cerca últimament i específicament la classe KeywordQuery, propietats i mètodes.

Si voleu el resultat per retornar resultats més enllà de sospitosos habituals (veure aquí), Afegiu a la col·lecció SelectedProperties, com a:

myKeywordQuery.SelectProperties.Add("xyzzy");

Moltes gràcies i una punta del barret per Corey Roth i Aquest bloc enormement útil (http://www.dotnetmafia.com/blogs/dotnettipoftheday/archive/2008/02/19/how-to-use-the-moss-enterprise-search-keywordquery-class.aspx)

En el meu cas, "xyzzy" no és en realitat una propietat administrada.  Quan afegia al SelectedProperties de tota manera, SharePoint va llançar un dels meus favorits mai runtime excepcions:

"El creador d'aquesta culpa no heu especificat una raó."

M'agrada especialment la capital "R" en la raó.  Això em sona a l'equivalent .NET"No tinc cap boca, i em cal cridar.”

</final>

Subscriure's al meu blog.

Follow me on Twitter http://www.twitter.com/pagalvin

Referència pràctica: Per defecte els resultats de cerca de KeywordQuery

Quan vostè invoca l'executar() mètode en un KeywordQuery, Podeu crear un ResultTable basat en ResultType.RelevantResults.  Aquest fragment de codi il·lustra el que vull dir:

ResultTableCollection resultsTableCollection = myKeywordQuery.Execute();

ResultTable searchResultsTable = resultsTableCollection[ResultType.RelevantResults];

La taula resultant tindrà les següents columnes d'informació: 

WorkId
Rang
Títol
Autor
Mida
Camí
Descripció
Escriure
SiteName
CollapsingStatus
HitHighlightedSummary
HitHighlightedProperties
ContentClass
IsDocument
PictureThumbnailURL
ServerRedirectedURL

Jo deriva aquesta llista de SharePoint 2010 medi ambient, edició d'empresa.  Esperançadorament serà útil a algú en el futur.

</final>

Subscriure's al meu blog.

Follow me on Twitter http://www.twitter.com/pagalvin

Una de les raons per a: "Fracassat extreure l'arxiu de cabina a la solució”

Mentre treballava en un element web de estudi visual del projecte avui, Vaig fer un re menor-org d'alguns arxius que es posarà en la carpeta layouts com a part del procés de desplegament. Específicament, Jo el nom d'un arxiu. js des de "TypeAhead.js" a "TypeAhead(vell).JS"  Penso treure-ho tan aviat com el seu successor "TypeAhead.js" és correcta.  S'assemblava a això:

image

Això immediatament causat un problema amb visual studio quan vaig intentar desplegar el projecte:

Occured d'error en el pas de desplegament "Afegir una solució": No ha pogut extreure l'arxiu de cabina a la solució.

Resulta que no ha posat un parèntesi en els noms de fitxer.  Treia el parens i que resolia el problema.

</final>

Subscriure's al meu blog.

Follow me on Twitter http://www.twitter.com/pagalvin