SaveBinaryDirect löst nicht autorisierte Fehler aus, wenn das Clientobjektmodell einwandfrei funktioniert

sharepoint.stackexchange https://sharepoint.stackexchange.com//questions/70562

Frage

Ich habe mich entschieden, die SaveBinaryDirect-Methode zum Hochladen von Dokumenten auf die Sharepoint-Site zu verwenden, da es nicht die Anforderungen/Dateigrößenbeschränkungen gibt, die das Clientobjektmodell hat.

Die Anwendung führt zwei Dinge aus: Sie fügt einen Ordner hinzu (mithilfe des Client-Objektmodells) und lädt dann eine ausgewählte Datei in den gerade erstellten Ordner hoch (mithilfe von „Save Binary Direct“).

Das funktioniert bei meinem Setup hier einwandfrei.Aber auf der Website unseres Kunden wird der Ordner einwandfrei erstellt, aber der Datei-Upload-Teil gibt den Fehler „Unauthorized 401“ zurück.

            SP.ClientContext ctx = new SP.ClientContext(siteurl);
            SP.Web currentWeb = ctx.Web;
            //Pass user details from config (That has owner permissions)
            ctx.Credentials = new NetworkCredential(username, password, domain);   
            //create folder method (checks if the folder exists and creates using Client Object Model)
            CreateFolder(ctx,libraryUrl,folderName)

            //Save Binary Direct Method
            string fileUrl = "/"+ libraryname + "/" + folderName + "/" + fileName;
            using (data)
            {
                //upload by passing the context, file url, file data stream, 
                //set overwrite to true
                SP.File.SaveBinaryDirect(ctx, fileUrl,data, true);
            }

Das lässt mich eines von zwei Dingen denken

  1. Es gibt eine Einstellung, die hinsichtlich der Autorisierung/Authentifizierung auf dem Netzwerkvolume oder Webserver geändert werden muss.
  2. Die Art und Weise, wie ich die Netzwerkanmeldeinformationen verwende, ist falsch.da dies nur für das Client-Objektmodell gilt, nicht jedoch für die direkte Speicherung der Binärdatei.

Ich bin mir bewusst, dass wir das Client-Objektmodell verwenden können und möglicherweise eine weitere Veröffentlichung durchführen müssen, wenn es sich nicht um ein Konfigurations-/Setup-Problem handelt.

Hat jemand mehr Erfahrung damit und eine Idee, warum das so ist?

War es hilfreich?

Lösung

Wenn Sie SharePoint 2013 verwenden, können Sie SaveBarinaryDirect nicht verwenden, sondern nicht mit der Ansprücheauthentifizierung.Der Anruf von SaveBarinaryDirect enthält nicht die erforderlichen Berechtigungs-Cookies.Details werden in den Kommentaren zu diesem Blog-Beitrag diskutiert: So tun Sie die aktive Authentifizierung für Office 365 und SharePoint Online

update (2. Juli 2016):

Ich nahm einen weiteren Blick darauf, nachdem ich den Kommentar von James Love gesehen habe.Ich bin nicht sicher, was sich nicht geändert hat, aber mein Test zeigt an, dass SaveBarinaryDirect jetzt mit SharePoint 2013 und SharePoint Online arbeitet.

Hier ist der Code, den ich verwendete Code: generasacodicetagpre.

Andere Tipps

Versuchen Sie das: generasacodicetagpre.

Ich kann die Datei mit dem Client-Objektmodell von Dateisystem in SharePoint 2010 hochladen.

Wenn Sie nicht autorisierten 401 erhalten, stellen Sie sicher, dass Sie die richtigen Anmeldeinformationen und die korrekte Relative-URL des Ziel-SharePoint-Dokumentbibliotheksordner angeben. generasacodicetagpre.

Ich denke, Sie müssen dies hinzufügen: generasacodicetagpre.

Ich bin auf das gleiche Problem gestoßen und fand eine Problemumgehung, obwohl ich nicht weiß, ob es legitim ist. generasacodicetagpre.

TLDR:Sie müssen das verwenden Server relative URL, auch wenn der Kontext die Site-Informationen enthält.

Ich hatte das gleiche Problem und habe es mithilfe von Fiddler gelöst.Als ich das Client-Objektmodell verwendet habe, habe ich den Kontext mit dem Site-Pfad erstellt, d. h."https://server/sites/siteName", Dann

var docs = web.Lists.GetByTitle(documentLibraryName);
SP.File uploadFile = docs.RootFolder.Files.Add(newFile);
context.Load(uploadFile);
context.ExecuteQuery();

Dies führte zu einem POST an https://<server>/sites/<siteName>/_vti_bin/client.svc/ProcessQueryDer Pfad und der Dateiname (und der Inhalt) wurden vom CSOM in das XML eingebettet.

Jetzt die SP.File.SaveBinaryDirect Unterschrift ist SaveBinaryDirect(ClientContext context, string serverRelativeUrl, Stream stream, bool overwriteIfExists) -- aber die Bitte SaveBinaryDirect(context, "/<library>/<folder>/filename", stream, true) mit Fehler 401 fehlgeschlagen.Schauen Sie in Fiddler nach, und hier ist die gestellte Anfrage:

PUT https://<server>/<library>/<filename>

Auch wenn der Kontext beinhaltet die Seite, du musst ihr das geben ganzen Weg vom Server-Root.Der erfolgreiche Anruf war

SaveBinaryDirect(context, "/sites/<sitename>/<library>/<folder>/filename", stream, true)

und das führt zu einem PUT an der richtigen Stelle.Der Parameter Ist angerufen serverRelativeUrl schließlich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit sharepoint.stackexchange
scroll top