Wer schon einmal Dokumente per WSS Objektmodell hochgeladen hat weiss wie einfach das geht - wieso dann noch nach einer alternativen Lösung suchen ?
Spätestens wenn jedoch versioniert wird werdet ihr gemerkt haben dass plötzlich 2 Versionen (1x das Dokument und 1x das Dokument mit den Metadaten) erzeugt wurden.
Die Lösung um ein Dokument hochzuladen (so wie es auch der Office-Client macht) ist FrontPage RPC.
Mit RPC hat dies jedoch nicht im Entferntesten etwas zu tun, genaugenommen ist es ein speziell formatierter HTTP Post-Request (also Port 80/443) - die Namensgebung ist historisch gewachsen, früher hat der Frontpage Client Daten so über die Frontpage Extensions auf einen Webserver hochgeladen.
Anbei 2 Funktionen die den Einsatz von Frontpage RPC aufzeigen:
public static string UploadDocument(string url, string folderName, string fileName, byte[] fileData, string putOpt, string extVersion) { Uri uri = new Uri(url); string method = "put document:" + extVersion; string serviceName = uri.AbsolutePath; string document = "[document_name={0};meta_info=[]]"; string putOption = putOpt; string comment = ""; string keepCheckedOut = "false"; string fpRPCCallStr = "method={0}&service_name={1}&document={2}&put_option={3}&comment={4}&keep_checked_out={5}"; method = HttpUtility.UrlEncode(method); serviceName = HttpUtility.UrlEncode(serviceName); document = HttpUtility.UrlEncode(String.Format(document, folderName + "/" + fileName)); putOption = HttpUtility.UrlEncode(putOption); comment = HttpUtility.UrlEncode(comment); keepCheckedOut = HttpUtility.UrlEncode(keepCheckedOut); fpRPCCallStr = String.Format(fpRPCCallStr, method, serviceName, document, putOption, comment, keepCheckedOut); fpRPCCallStr.Replace(".", "%2e"); fpRPCCallStr.Replace("_", "%5f"); byte[] fpRPCCall = System.Text.Encoding.UTF8.GetBytes(fpRPCCallStr); byte[] data = new byte[fpRPCCall.Length + fileData.Length + 1]; fpRPCCall.CopyTo(data, 0); data[fpRPCCall.Length] = 0x0A; fileData.CopyTo(data, fpRPCCall.Length + 1); return PostDataToWSS(url, data); } private static string PostDataToWSS(string url, byte[] data) { WebClient webClient = null; byte[] returnData = null; string errorMsg = string.Empty; try { webClient = new WebClient(); webClient.Credentials = System.Net.CredentialCache.DefaultCredentials; webClient.Headers.Add("Content-Type", "application/x-vermeer-urlencoded"); webClient.Headers.Add("X-Vermeer-Content-Type", "application/x-vermeer-urlencoded"); returnData = webClient.UploadData(url + "/_vti_bin/_vti_aut/author.dll", "POST", data); } catch (Exception ex) { errorMsg = "Exception occured:\n" + ex.Message; } finally { if (webClient != null) { webClient.Dispose(); } } string returnStr = String.Empty; if (errorMsg.Length > 0) { returnStr = errorMsg + "\n\n" + returnStr; } else { returnStr = System.Text.Encoding.UTF8.GetString(returnData); } }
Viel Spass beim Hochladen - Sven