L’Upload sous SharePoint 2007, ASMX et WCF (ainsi que la vision SharePoint 2010)
Je viens juste de finir de coder un petit sample pour aider un partenaire à connecter son application à un stockage SharePoint.
Soit un smart client sur le desktop relié à un serveur WSS pouvant uploader différents fichiers métier sur des listes appropriées.
En codant avec eux, je suis retombé sur quelques points que je pense toujours intéressant de partager, si si.
A) Attention aux API SharePoint 2007
Certes, le Modèle Objet SharePoint est clair et concis
L’upload se fait facilement en quelques lignes :
source : http://vspug.com/apichot/2007/05/31/sharepoint-2007-upload-a-document-with-its-meta-data/
//Use the list as a folder
SPFolder folder = _web.GetFolder(_DestFolder);
SPFileCollection files = folder.Files;
//Get the file
FileStream fStream = File.OpenRead(pdfFile);
HashTable MetaDataTable = new HashTable();
MetaDataTable.Add("nom de colonne", "valeur");
//Set the destination url for SharePoint
string url = _DestUrlPath + _DestFolder + "/" + Path.GetFileName(pdfFile);
//Add document to the list with metadata, and overwrite an existing document
with the same name
SPFile currentFile = files.Add(url, fStream, MetaDataTable, true);
fStream.Close();
Mais il a le défaut de fonctionner uniquement … en local. Soit sur une des machines de la ferme SharePoint.
Rien ne sert de recopier la Dll Microsoft.SharePoint, elle ne fonctionne QUE sur la ferme, question de backoffice ….
Dés lors pour contourner le soucis, il vous reste 2 options
- passer par les Web Services SOAP de SharePoint /_vti_bin/*.asmx
- utiliser le Frontpage RPC
Il existe une troisième option, alternative et tout aussi séduisante : créer votre propre Web Service et derrière implémenter votre code API classique.
Le seul soucis : votre code n’est plus “externe”, il dépend d’un déploiement serveur qu’un admin peut toujours contester. Mais bon, c’est une option viable surtout si l’on connait le coté verbeux et non typé de nos amis ASMX SharePoint.
>>> Quid de 2010 ?

Effectivement, la question est différente, SharePoint 2010 possède désormais un modèle objet SharePoint complet pour les applications distantes
Ce qui de suite facilite grandement le code !!!
Un sample étant toujours plus parlant qu’un long discours, le voila
source issue de http://blogs.msdn.com/sridhara/archive/2010/03/12/uploading-files-using-client-object-model-in-sharepoint-2010.aspx
ClientContext context = new ClientContext("http://spdevinwin");
Web web = context.Web;
FileCreationInformation newFile = new FileCreationInformation();
newFile.Content = System.IO.File.ReadAllBytes(@"C:\Work\Files\17580_FAST2010_S05_Administration.pptx");
newFile.Url = "17580_FAST2010_S05_Administration 4MB file uploaded via client OM.pptx";
List docs = web.Lists.GetByTitle("Documents");
Microsoft.SharePoint.Client.File uploadFile = docs.RootFolder.Files.Add(newFile);
context.Load(uploadFile);
context.ExecuteQuery();
Console.WriteLine("done");
Voir mieux encore par le HTTP DAV et le Client OM : 3 Lignes de code!!!!!
ClientContext context = new ClientContext("http://spdevinwin");
using (FileStream fs = new FileStream(@"C:\Work\Files\17580_FAST2010_S03_Arch.pptx", FileMode.Open))
{
Microsoft.SharePoint.Client.File.SaveBinaryDirect(context, "/documents/17580_FAST2010_S03_Arch from client OM.pptx", fs, true);
}
Bon je pense que vous sentez que j’ai déjà une petit préférence pour la nouvelle cuvée 2010 …
B) Rien ne vaut un bon wrapper pour ses Web Services
Certes SP2010 est plus que prometteur et RTM mais la vrai vie avec les vrais gens m’ont appris que beaucoup sont et resteront encore un bout de temps sous SharePoint 2007.
Et je les comprends ! MOSS est aussi un très bon produit, on ne peut le renier sous principe de la nouveauté !
Dés lors que faire … A vrai dire rien ne vous empêche de faire un peu de pattern genre “Facade”. Soit un sympathique wrapper cachant la complexité XML de ses Web Services et du manifest XML nécessaire au métadonnés
- Votre code sera réutilisable aisément
- Bien plus évolutif
- pourra être mis à jour pour SP2010 en toute transparence.
Toujours dans le cas de l’upload, voici d’ailleurs un très bon sample d’upload avec metadata via Web Service SharePoint 2007 que je vous conseille de connaitre (et de comprendre )
http://geek.hubkey.com/2007/10/upload-file-to-sharepoint-document.html
(testé et validé dans ma propre VPC)
ce qui donne un code client :
DocLibHelper docLibHelper = new DocLibHelper();
Dictionary<string, object> properties = new Dictionary<string, object>();
properties.Add("Title", "Test Title");
//Create or overwrite text file test.txt in 'Docs' document library creating folder 'Test Folder' as required.
docLibHelper.Upload("http://localhost/Docs/Test Folder/test.txt", System.Text.Encoding.ASCII.GetBytes("Test text."), properties);
Un exemple à suivre :)
C) Les “Services references“ WCF et les ASMX de SharePoint 2007
On approche de la fin
En effet, avec VS 2008, vous avez le choix d’utiliser WCF plutôt qu’un simple proxy VS.Net sur SOAP.
Certes, la différence peut vous paraitre minime mais non, elle est importante !
WCF permet d’externaliser la configuration de la communication de votre code.
>>>> Finit par exemple, la gestion en dur des comptes ou du default credential par exemple et vive les .config
Dans le cas de SharePoint et ses ASMX, vous allez juste devoir rajouter dans votre application les fameux “endpoints” WCF et les “binding”.
Je ne vais pas détailler plus cette partie car cet article le fait largement mieux avec détails, sample, le tout en français SVP
SharePoint 2007 et WCF sur Have A Nice Day.Net
Et si vous en voulez plus en anglais : http://petesullivan.spaces.live.com/blog/cns!96D0E96711D2A69E!187.entry
A noté : Si vous ne voulez pas vous embêter, il est toujours possible de passer par les références WS depuis l’interface WCF
D) Vive la virtualisation pour tout tester en multiplatforme
…
==> Il est temps maintenant de conclure je pense, ce sujet de l’upload a été bien couvert.
Bonne réflexion et bon coding et si vous avez des questions, bien venez donc me voir aux WygDays 2010

Renaud Comte aka TheMit (aie aie, les Generics sous VB.Net qd on a pas l’habitude …)
Member of WygTeam
http://www.wygwam.com
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :