FrontPage RPC - ein anderer Weg Dokumente in WSS 3.0 hochzuladen
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:
- UploadDcoument - setzt die Metadaten und Command-Verbs für den Request
- PostDataToWSS - ist eine generische Hilfsfunktion und könnte auch noch für andere FrontpageRPC Funktionen genutzt werden (so z.B: GetDocsMetaData ...)
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
Comments
Anonymous
September 04, 2008
PingBack from http://www.easycoded.com/frontpage-rpc-ein-anderer-weg-dokumente-in-wss-30-hochzuladen/Anonymous
September 04, 2008
PingBack from http://housesfunnywallpaper.cn/?p=4232