2011-02-25 5 views
10

Sto tentando di salvare un file su un server Sharepoint utilizzando JAX-WS. La chiamata al servizio web segnala un successo, ma il file non viene visualizzato.Salva file su Sharepoint Server utilizzando JAX-WS

Ho usato questo comando (da un WinXP) per generare il codice Java per effettuare la chiamata JAX-WS:

wsimport -keep -extension -Xnocompile http://hostname/sites/teamname/_vti_bin/Copy.asmx?WSDL 

ricevo una maniglia sul servizio web che ho chiamato port utilizzando la seguente: CopySoap port = null;

if (userName != null && password != null) { 
    Copy service = new Copy(); 
    port = service.getCopySoap(); 
    ((BindingProvider) port).getRequestContext().put(BindingProvider.USERNAME_PROPERTY, userName); 
    ((BindingProvider) port).getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, password); 
} else { 
    throw new Exception("Holy Frijolé! Null userName and/or password!"); 
} 

Ho chiamato il servizio Web utilizzando il seguente:

port.copyIntoItems(sourceUrl, destUrlCollection, fields , 
    "Contents of the file".getBytes(), 
    copyIntoItemsResult, copyResultCollection) 

Il sourceUrl e l'unico url destUrlCollection è uguale a "hostname/siti/Teamname/Tech Docs/sottocartella".

L'oggetto FieldInformationCollectionfields contiene solo uno FieldInformation. L'oggetto FieldInformation ha "HelloWorld.txt" come valore per displayName, internalName e valore. La proprietà type è impostata su FieldType.FILE. La proprietà id è impostata su (java.util.UUID.randomUUID()).toString().

La chiamata a copyIntoItems restituisce correttamente; copyIntoItemsResult contiene un valore 0 e l'unico oggetto impostato su copyResultCollection ha un codice di errore "SUCCESSO" con un messaggio di errore nullo.

Quando analizzo la libreria "Tech Docs" su Sharepoint, nella "Cartella secondaria" non è presente alcun file.

Perché non dovrebbe dirmi cosa ho sbagliato? Ho appena perso un passaggio?

aggiornamento (Feb 26, 2011)

ho cambiato proprietà displayName e InternalName del mio oggetto FieldInformation di essere "Titolo" come suggerito. Ancora nessuna gioia, ma un passo nella giusta direzione.

Dopo aver suonato in giro con gli URL per un po ', ho ottenuto questi risultati:

Con sia il SourceURL e l'unico equivalente URL di destinazione, senza protocollo, ottengo la risposta successo, ma nessun documento attuale appare nella biblioteca di documenti.

Con entrambi gli URL equivalenti ma con un protocollo "http: //" specificato, viene visualizzato un errore SCONOSCIUTO con "Riferimento oggetto non impostato su un'istanza di un oggetto". come il messaggio.

Con l'URL di origine una stringa vuota o null, viene visualizzato un errore SCONOSCIUTO con "Il valore non rientra nell'intervallo previsto." come il messaggio di errore.

Update (2 Marzo 2011)

Come suggerito da Alexei Levenkov, ho usato Fiddler per vedere che cosa stava succedendo e ho trovato questo:

# Result Protocol Host URL Body Caching Content-Type Process Comments Custom 
34 401 HTTP hostname /sites/teamname/_vti_bin/Copy.asmx?WSDL 1,656  text/html javaw:5304   
35 401 HTTP hostname /sites/teamname/_vti_bin/Copy.asmx?WSDL 1,539  text/html javaw:5304   
36 200 HTTP hostname /sites/teamname/_vti_bin/Copy.asmx?WSDL 10,887 private  text/xml; charset=utf-8 javaw:5304   
37 401 HTTP hostname /sites/teamname/_vti_bin/Copy.asmx 1,656  text/html javaw:5304   
38 401 HTTP hostname /sites/teamname/_vti_bin/Copy.asmx 1,539  text/html javaw:5304   
39 200 HTTP hostname /sites/teamname/_vti_bin/Copy.asmx 611 private, max-age=0  text/xml; charset=utf-8 javaw:5304   

Sembra una semplice stretta di mano in corso acceso fino a quando non ottiene l'HTTP 200 sia per il WSDL che per la chiamata al servizio web.

Così ho provato a non mettere il mio nome utente e password nel RequestContext e ottengo una cosa simile come faccio sopra per la richiesta WSDL (due HTTP 401 e una HTTP 200), ma la chiamata WebService ha solo un HTTP 200. Se non utilizza più il mio nome utente/password, dovrebbe teoricamente fallire l'autenticazione.

+2

+1 per il messaggio di errore :) –

risposta

4

URL di destinazione devono contenere tutti i percorsi di file. Esamino il campione sulla pagina di descrizione del metodo - http://msdn.microsoft.com/en-us/library/copy.copy.copyintoitems.aspx.

+0

Quando uso percorsi completi per l'origine e destnation (cioè includono il http: // parte) "Il riferimento non impostato a un'istanza di un oggetto" ottengo come un messaggio di errore. Quando utilizzo solo il percorso completo solo per la destinazione e lascia l'origine come stringa vuota, viene visualizzato il messaggio "Il valore non rientra nell'intervallo previsto". –

+2

Ha funzionato per me (C# ... ma finché riesci a chiamare WS non dovrebbe importare quale lingua usi): fileName per origine, Url assoluto (con parte file) per destinazione, raccolta campo vuota. Prova a raccogliere la traccia di Fiddler (o altro osservatore HTTP) e vedere se c'è qualcosa di sospetto. Puoi anche vedere la traccia mentre usi la funzionalità Copia di SharePoint in confronto con la tua. –

+0

In sostanza, la mia installazione di Java è stato l'invio nelle mie macchine username/password invece di quello che stavo impostazione. Non so come forzarlo per inviare il nome utente/password che voglio. Ci scusiamo per il ritardo nell'accettare la risposta. –

2

Il tuo problema è probabilmente i campi.

DisplayName e InternalName vogliono essere "Titolo", e il valore di essere HelloWorld.txt

Inoltre, lasciare vuota ID, SharePoint popolerà tale.

+0

ho provato, ma senza fortuna. Potrebbe essere che gli URL di origine e di destinazione non abbiano un http: // o https: // davanti a loro? –

+0

Forse. Se stai caricando un file da qualche parte che non è sharepoint, penso che l'URL sorgente possa essere nullo, o almeno una stringa vuota. –

0

log Controllare SharePoint in C: Web server extensions Files \ Programmi \ File comuni \ Microsoft Shared \ \ 12 \ Logs. Forse la mancanza della parte del dominio nel nome utente sta causando problemi?

+0

Immagino di non poter più evitare gli amministratori di SharePoint. Ho notato che l '"Auth" riportato da Fiddler riportava l'utente e il dominio con cui ho effettuato il login nella mia macchina di sviluppo, non il nome utente che uso per Sharepoint che sembra strano dato che utilizzo le credenziali di Sharepoint nel mio codice Java. –