Exchange Server: How to retrieve appointments using C# & WebDAV?


Code Snippet (C#):

   //Declaration part
    string strExchSvrName = "";
    string strMailbox = "";
    string strCalendarUri = "";
    string strDomain = "";
    string strUserName = "";
    string strPassword = "";
    System.Net.HttpWebRequest WebDavRequest = null;
    System.Net.HttpWebResponse WebDavResponse = null;
    System.Net.CredentialCache MyCredentialCache = null;
    byte[] bytes = null;
    System.IO.Stream WebDavRequestStream = null;
 
     // Provide the Exchange server name;
      strExchSvrName = "mydomain.in";
 
      // Provide Mailbox folder name.
       strMailbox = "Mailbox1";
 
      //if HTTPS -then provide URI of the user's calendar folder
      strCalendarUri = "https://" + strExchSvrName + "/exchange/"+ strMailbox + "/Calendar/";
 
        //if HTTP -then provide URI of the user's calendar folder
        //strCalendarUri = "http://" + strExchSvrName + "/exchange/" + strMailbox + "/Calendar/";
 
        //Provide the User name and password of appointment creator. Make sure the user has enough permissions to read
        strUserName = "username"; 
        strDomain = "domain";
        strPassword = "password";
 
        //Build the Query
        string query = "<?xml version=\"1.0\"?><D:searchrequest xmlns:D = \"DAV:\" >"
                + "<D:sql>SELECT \"http://schemas.microsoft.com/exchange/outlookmessageclass\", \"DAV:contentclass\", 
\"DAV:displayname\" FROM \""
+ strCalendarUri + "\""
                + "WHERE \"DAV:ishidden\" = true AND \"DAV:isfolder\" = false"
                + "</D:sql></D:searchrequest>";
 
        query = "<?xml version=\"1.0\"?>"
                + "<dav:searchrequest xmlns:dav=\"DAV:\">"
                + "<dav:sql>"
                + "SELECT "
                + "\"DAV:displayname\", " // Appointment Uri portion of the resource
                + "\"DAV:href\", " // Full resource Uri of the appointment
                + "\"urn:schemas:httpmail:subject\", " // Subject of appointment
                + "\"urn:schemas:calendar:dtstart\", " // Start date/time of appointment
                + "\"urn:schemas:calendar:dtend\", " // End date/time of appointment
                + "\"urn:schemas:httpmail:textdescription\", " // Body of appointment
                + "\"urn:schemas:calendar:location\", " // Location of appointment
                + "\"urn:schemas:calendar:alldayevent\", " // Whether appointments an all day appointment
                + "\"urn:schemas:calendar:meetingstatus\", " // Confimed status of the appointment
                + "\"urn:schemas:calendar:busystatus\", " // Comitted status the appointment represents
                + "\"http://schemas.microsoft.com/mapi/proptag/x823D0003\", " // Color of the appointment
                + "\"urn:schemas:calendar:reminderoffset\", " // Reminder offset of the appointment
                + "\"DAV:ishidden\", " // Whether this is hidden
                + "\"urn:schemas:calendar:instancetype\", " // Relation of the appointment to a recurring series
                + "\"urn:schemas:calendar:transparent\", " // Transparency of the appointment to free/busy searches
                + "\"urn:schemas:calendar:timezoneid\" " // Display timezone of the appointment
                + "FROM Scope('SHALLOW TRAVERSAL OF \"" + strCalendarUri + "\"') "
                + "WHERE "
                + "(\"DAV:contentclass\" = 'urn:content-classes:appointment' ) " // Item is an appointment
                + "AND (NOT \"urn:schemas:calendar:instancetype\" = 1) " // appointment is not the master of a recurring series (Get single
appointments or instances of recurring appointments)
                + "AND (\"urn:schemas:calendar:dtend\" &gt; '" + 
                Convert.ToDateTime("3-12-2007").Date.ToUniversalTime().ToString("yyyy/MM/dd HH:mm:ss") + "')
"
//Appointment ends after the start of our range
                + "AND (\"urn:schemas:calendar:dtstart\" &lt; '" + 
Convert.ToDateTime("3-17-2007").Date.ToUniversalTime().ToString("yyyy/MM/dd HH:mm:ss") + "')
"
//Appointment begins before the end of our range
                + "AND (\"DAV:displayname\" like '" + "LS.ImportantDates." + "%' ) "
                + "ORDER BY \"urn:schemas:calendar:dtstart\" "
                + "</dav:sql>"
                + "</dav:searchrequest>";
 
 
        //Provide credentials required to access the server. Here i used the NTLM
        MyCredentialCache = new System.Net.CredentialCache();
        MyCredentialCache.Add(new System.Uri(strCalendarUri), "NTLM", new System.Net.NetworkCredential(strUserName, strPassword, strDomain));
 
        //Create the HttpWebRequest object.
        WebDavRequest = (System.Net.HttpWebRequest)HttpWebRequest.Create(strCalendarUri);
 
        // Add the network credentials to the request.
        WebDavRequest.Credentials = MyCredentialCache;
 
        // Specify the PROPPATCH method.
        WebDavRequest.Method = "SEARCH";
 
        // Encode the body using UTF-8.
        bytes = Encoding.UTF8.GetBytes(query);
 
        // Set the content header length.
        WebDavRequest.ContentLength = bytes.Length;
 
        // Get a reference to the request stream.
        WebDavRequestStream = WebDavRequest.GetRequestStream();
 
        // Write the message body to the request stream.
        WebDavRequestStream.Write(bytes, 0, bytes.Length);
 
        // Release the connection
        WebDavRequestStream.Close();
 
        // Set the content type header.
        WebDavRequest.ContentType = "text/xml";
 
       WebDavResponse = (System.Net.HttpWebResponse)WebDavRequest.GetResponse();
       Response.Write("Calendar : ");
  Response.Write("Status Code: " + WebDavResponse.StatusCode + "Description: " + WebDavResponse.StatusDescription);
       using (System.IO.StreamReader streamReader = new System.IO.StreamReader(WebDavResponse.GetResponseStream()))
       {
             Response.Write(streamReader.ReadToEnd());
       }
       WebDavResponse.Close();
        
 
     You can get more related samples and detailed information from Dan's blog. For more information you can also refer this article 

Skip to main content