Sharepoint 2010 - ClientObjectModel: File.SaveBinaryDirect() wirft eine Exception
-
Dienstag, 22. Juni 2010 08:37
Hallo zusammen,
ich habe eine Frage zum ClientObjectModel und zwar habe ich in einer Anwendung diverse Standardfunktionen abgebildet wie z.B. Dateien hochladen, Items lesen / aktualisieren.
Auf dem Server, auf dem auch der Sharepoint 2010 läuft, funktioniert die Anwendung problemlos.
Schwierig wird es erst sobald ich die Anwendung auf einem Client laufen lasse.
Beim Hochladen von Dateien kommt es bei der Methode File.SaveBinaryDirect() zu folgender Fehlermeldung:
„Die zugrunde liegende Verbindung wurde geschlossen: Eine Verbindung, deren Aufrechterhaltung erwartet wurde, ist vom Server geschlossen worden..“
Die Fehlermeldung als solches deutet zwar nicht auf ein Berechtigungsproblem hin, aber meine Fehleranalyse hat folgendes ergeben.
- Funktionen wie Items lesen / aktualisieren funktionieren
- Öffne ich im Vorfeld im Internet-Explorer die entsprechende Site bzw. Dokumentenbibliothek und starte anschließend erst die Anwendung so funktioniert auch die Methode File.SaveBinaryDirect()!
Daher gehe ich momentan davon aus, dass das Objekt "ClientContext" nicht ordnungsgemäß am Sharepoint Server angemeldet ist. Hier ein Quellcode-Ausschnitt:
clientContext.AuthenticationMode = ClientOM.ClientAuthenticationMode.Default;
clientContext.Credentials = this.credentials;
Ich verwende den Account des lokalen Administrator bzw. meinen Domainen-Account der volle Berechtigungen trägt.Über den Internet-Explorer stehen alle Funktionen einwandfrei zur Verfügung.
Hier noch mal die vollständige Funktion zum Hochladen einer Datei:
using (ClientOM.ClientContext clientContext = new ClientOM.ClientContext(this.serverUrl + this.mySite)) { clientContext.AuthenticationMode = ClientOM.ClientAuthenticationMode.Default; clientContext.Credentials = this.credentials; this.EnsureFolder(clientContext, bibliothek, String.Empty, objectType); this.EnsureFolder(clientContext, bibliothek, objectType, objectID); string uploadPath = "/" + bibliothek + "/"; if (String.IsNullOrEmpty(objectType) == false) uploadPath += objectType + "/"; if (String.IsNullOrEmpty(objectID) == false) uploadPath += objectID + "/"; using (FileStream fileStream = new FileStream(localFilepath, FileMode.Open)) { ClientOM.File.SaveBinaryDirect(clientContext, mySite + uploadPath + remoteFilename, fileStream, true); } } //Metadaten an DocumentItem übergeben this.SetDocumentProperties(bibliothek, objectType, objectID, remoteFilename, ref1Type, ref1Id, ref2Type, ref2Id); if (showSharepointFolder == true) { this.ShowSharepointList(bibliothek, objectType, objectID); }
Hat vielleicht jemand gleiche Erfahrungen gemacht und eine Lösung?
Viele Grüße,
Sven
Alle Antworten
-
Montag, 16. April 2012 16:29
Hallo Sven,
ich habe das gleiche Problem - mit Dateien von ca. 10 MB und 20 MB Größe.
Im Web findet man Hilfestellung dahingehend,
- Microsoft.SharePoint.Client.ClientContext
.RequestTimeoutzu vergrößern,- System.Net.HttpWebRequest.KeepAlive auf false zu setzen,
- die Max.Uploadgröße des MOSS zu vergrößern oder
- den Fehler im Server-Log des MOSS zu suchen.
Bei mir hat nichts davon geholfen.
Ich habe aber festgestellt - da ich mehrere Dateien hochladen möchte - dass nicht immer alle und nicht immer dieselben Dateien fehlschlagen. Der Fehler trat also nicht systematisch auf, was ebenfalls gegen eine der oben angeführten Lösungen spricht.
Ich habe mir mit einer Schleife beholfen, die den Upload mehrfach versucht und erst nach - z. B. 8 - Versuchen abbricht. Ein zusätzliches System.Threading.Thread.Sleep() verbessert die Erfolgsquote nocheinmal. Soll nur eine Datei hochgeladen werden, ist das immer noch recht unsicher (und vielleicht keine Lösung für Dich). Da ich mehrere Dateien hochlade, wechseln sich bei mir aber die Dateien beim Upload (-Vrsuch) ab (ich gehe alle Dateien durch und fange dann bei den nicht hochgeladenen wieder von Forne an) und die Erfolgsquote scheint dadurch noch mal zu steigen.
Viele Grüße, Steffen

