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