WebDAV : How to retrieve list of folders from Exchange Server using Search method (WebDAV) programmatically ?

using System;
using System.Net;
using System.IO;
using System.Text;
using System.Xml;
namespace SampleCode
   class GetFolders
     static void Main(string[] args)
         // Variables.
         System.Net.HttpWebRequest Request;
         System.Net.WebResponse Response;
         System.Net.CredentialCache MyCredentialCache;
         string strRootURI = "http://server/exchange/username/Inbox/"; // Provide the valid URI
         string strUserName = "UserName";
         string strPassword = "Password";
         string strDomain = "Domain";
         string strQuery ="";
         byte[] bytes = null;
         System.IO.Stream RequestStream = null;
         System.IO.Stream ResponseStream = null;
         System.Xml.XmlTextReader XmlReader = null;
            // Build the SQL query.
            strQuery = "<?xml version=\"1.0\"?><D:searchrequest xmlns:D = \"DAV:\" >";
            strQuery += "<D:sql>SELECT \"DAV:href\" FROM scope('hierarchical traversal of \"";
            strQuery += strRootURI + "\"')</D:sql></D:searchrequest>";
            // Create a new CredentialCache object and fill it with the network credentials required to access the server.
            MyCredentialCache = new System.Net.CredentialCache();
            MyCredentialCache.Add( new System.Uri(strRootURI),
               new System.Net.NetworkCredential(strUserName, strPassword, strDomain)
            // Create the HttpWebRequest object.
            Request = (System.Net.HttpWebRequest)HttpWebRequest.Create(strRootURI);
            // Add the network credentials to the request.
            Request.Credentials = MyCredentialCache;
            // Specify the method.
            Request.Method = "SEARCH";
            // Encode the body using UTF-8.
            bytes = Encoding.UTF8.GetBytes((string)strQuery);
            // Set the content header length.  This must be
            // done before writing data to the request stream.
            Request.ContentLength = bytes.Length;
            // Get a reference to the request stream.
            RequestStream = Request.GetRequestStream();
            // Write the SQL query to the request stream.
            RequestStream.Write(bytes, 0, bytes.Length);
            // Close the Stream object to release the connection
            // for further use.
            // Set the content type header.
            Request.ContentType = "text/xml";
            // Send the SEARCH method request and get the
            // response from the server.
            Response = (HttpWebResponse)Request.GetResponse();
            // Get the XML response stream.
            ResponseStream = Response.GetResponseStream();
            // Create the XmlTextReader object from the XML
            // response stream.
            XmlReader = new XmlTextReader(ResponseStream);
            // Read through the XML response, node by node.
               // Look for the opening DAV:href node.  The DAV: namespace is
               //typically assigned the a: prefix in the XML response body.
               if(XmlReader.Name == "a:href")
                  // Advance the reader to the text node.
                  // Display the value of the DAV:href text node.
                  Console.WriteLine("Value: " + XmlReader.Value);
                  //Advance the reader to the closing DAV:href node.
            // Clean up.
         catch(Exception ex)
            // Catch any exceptions. Any error codes from the SEARCH method request

Hope this helps.

Skip to main content