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.

Skip to main content