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;
  
          try
          {
             // 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),
                "NTLM",
                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.
             RequestStream.Close();
  
             // 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.
             while(XmlReader.Read())
             {
                // 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.
                   XmlReader.Read();
  
                   // Display the value of the DAV:href text node.
                   Console.WriteLine("Value: " + XmlReader.Value);
                   Console.WriteLine("");
  
                   //Advance the reader to the closing DAV:href node.
                   XmlReader.Read();
                }
             }
  
             // Clean up.
             XmlReader.Close();
             ResponseStream.Close();
             Response.Close();
  
          }
          catch(Exception ex)
          {
             // Catch any exceptions. Any error codes from the SEARCH method request
             Console.WriteLine(ex.Message);
          }
       }
    }
 }

Hope this helps.