L
Hi,
I'm trying to download the attachment from exchange server using WebDav. I used below code. Yesterday it is working fine and successfully downloads all the attachments but when I try today to run it I get below error.
The remote server returned an error: (400) Bad Request.
Code:
namespace ExchangeTest{ public class WebDAV { public static class Authentications { public const string ANONYMOUS = "ANONYMOUS"; public const string BASIC = "BASIC"; public const string DIGEST = "DIGEST"; public const string NTLM = "NTLM"; public const string NEGOTIATE = "NEGOTIATE"; public const string PASSPORT = "PASSPORT"; } public static class Methods { public const string BCOPY = "BCOPY"; public const string BDELETE = "BDELETE"; public const string BMOVE = "BMOVE"; public const string BPROPFIND = "BPROPFIND"; public const string BPROPPATCH = "BPROPPATCH"; public const string COPY = "COPY"; public const string DELETE = "DELETE"; public const string LOCK = "LOCK"; public const string MKCOL = "MKCOL"; public const string MOVE = "MOVE"; public const string NOTIFY = "NOTIFY"; public const string POLL = "POLL"; public const string PROPFIND = "PROPFIND"; public const string PROPPATCH = "PROPPATCH"; public const string SEARCH = "SEARCH"; public const string SUBSCRIBE = "SUBSCRIBE"; public const string UNLOCK = "UNLOCK"; public const string UNSUBSCRIBE = "UNSUBSCRIBE"; public const string X_MS_ENUMATTS = "X-MS-ENUMATTS"; } public const string CONTENT_TYPE_TEXT_XML = "text/xml"; public const string NS_DAV = "DAV:"; public const string PR_DAV_SEARCHREQUEST = "searchrequest"; public const string PR_DAV_SQL = "sql"; public const string PR_DAV_PROPFIND = "propfind"; public const string PR_DAV_PROP = "prop"; public const string PR_DAV_PROPERTYUPDATE = "propertyupdate"; public const string PR_DAV_SET = "set"; public const string PR_DAV_HREF = "href"; public const string PR_DAV_PROPSTAT = "propstat"; public const string PR_DAV_STATUS = "status"; public const string PR_DAV_RESPONSE = "response"; public const string NS_HTTPMAIL = "urn:schemas:httpmail:"; public const string PR_HTTPMAIL_DATE = "date"; public const string PR_HTTPMAIL_SUBJECT = "subject"; public const string PR_HTTPMAIL_FROM = "from"; public const string PR_HTTPMAIL_TO = "to"; public const string PR_HTTPMAIL_READ = "read"; public const string PR_HTTPMAIL_HASATTACHMENT = "hasattachment"; public const string PR_HTTPMAIL_ATTACHMENTFILENAME = "attachmentfilename"; public const string PR_HTTPMAIL_TEXTDESCRIPTION = "textdescription"; public System.Net.ICredentials Credentials; public System.Xml.XmlDocument Search(System.Uri uri, string query) { System.IO.MemoryStream ms = new System.IO.MemoryStream(); System.Xml.XmlTextWriter writer = new System.Xml.XmlTextWriter(ms, null); writer.WriteStartDocument(); writer.WriteStartElement(PR_DAV_SEARCHREQUEST, NS_DAV); writer.WriteStartElement(PR_DAV_SQL, NS_DAV); writer.WriteValue(query); writer.WriteEndElement(); writer.WriteEndElement(); writer.WriteEndDocument(); writer.Close(); writer = null; byte[] data = ms.ToArray(); ms.Close(); ms = null; return GetXmlResponse(uri, Methods.SEARCH, data); } public System.Xml.XmlDocument PropFind(System.Uri uri, string localname, string ns) { System.IO.MemoryStream ms = new System.IO.MemoryStream(); System.Xml.XmlTextWriter writer = new System.Xml.XmlTextWriter(ms, null); writer.WriteStartDocument(); writer.WriteStartElement(PR_DAV_PROPFIND, NS_DAV); writer.WriteStartElement(PR_DAV_PROP, NS_DAV); writer.WriteStartElement(localname, ns); writer.WriteEndElement(); writer.WriteEndElement(); writer.WriteEndElement(); writer.WriteEndDocument(); writer.Close(); writer = null; byte[] data = ms.ToArray(); ms.Close(); ms = null; return GetXmlResponse(uri, Methods.SEARCH, data); } public void Delete(System.Uri uri) { GetEmptyResponse(uri, Methods.DELETE, null); } public System.Xml.XmlDocument PropPatch(System.Uri uri, string localname, string ns, object value) { System.IO.MemoryStream ms = new System.IO.MemoryStream(); System.Xml.XmlTextWriter writer = new System.Xml.XmlTextWriter(ms, null); writer.WriteStartDocument(); writer.WriteStartElement(PR_DAV_PROPERTYUPDATE, NS_DAV); writer.WriteStartElement(PR_DAV_SET, NS_DAV); writer.WriteStartElement(PR_DAV_PROP, NS_DAV); writer.WriteStartElement(localname, ns); writer.WriteValue(value); writer.WriteEndElement(); writer.WriteEndElement(); writer.WriteEndDocument(); writer.Close(); writer = null; byte[] data = ms.ToArray(); ms.Close(); ms = null; return GetXmlResponse(uri, Methods.PROPPATCH, data); } public System.Xml.XmlDocument EnumAtts(System.Uri uri) { return GetXmlResponse(uri, Methods.X_MS_ENUMATTS, null); } private string GetHtmlResponse(System.Uri uri, string method, byte[] data) { System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(uri); request.Credentials = Credentials; request.Method = method; if (data != null) { string xml = System.Text.Encoding.UTF8.GetString(data); request.ContentType = CONTENT_TYPE_TEXT_XML; request.ContentLength = data.Length; System.IO.Stream requestStream = request.GetRequestStream(); requestStream.Write(data, 0, data.Length); requestStream.Close(); } System.Net.HttpWebResponse response = (System.Net.HttpWebResponse)request.GetResponse(); System.IO.Stream responseStream = response.GetResponseStream(); System.IO.MemoryStream memoryStream = new System.IO.MemoryStream(); int length = 8192; byte[] buffer = new byte[length]; int count = responseStream.Read(buffer, 0, length); while (count > 0) { memoryStream.Write(buffer, 0, count); count = responseStream.Read(buffer, 0, length); } buffer = memoryStream.ToArray(); memoryStream.Close(); responseStream.Close(); response.Close(); return System.Text.Encoding.UTF8.GetString(buffer); } private void GetEmptyResponse(System.Uri uri, string method, byte[] data) { System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(uri); request.Credentials = Credentials; request.Method = method; if (data != null) { string xml = System.Text.Encoding.UTF8.GetString(data); request.ContentType = CONTENT_TYPE_TEXT_XML; request.ContentLength = data.Length; System.IO.Stream requestStream = request.GetRequestStream(); requestStream.Write(data, 0, data.Length); requestStream.Close(); } System.Net.HttpWebResponse response = (System.Net.HttpWebResponse)request.GetResponse(); response.Close(); } private System.Xml.XmlDocument GetXmlResponse(System.Uri uri, string method, byte[] data) { System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(uri); request.Credentials = Credentials; request.Method = method; if (data != null) { string xml = System.Text.Encoding.UTF8.GetString(data); request.ContentType = CONTENT_TYPE_TEXT_XML; request.ContentLength = data.Length; System.IO.Stream requestStream = request.GetRequestStream(); requestStream.Write(data, 0, data.Length); requestStream.Close(); } System.Net.HttpWebResponse response = (System.Net.HttpWebResponse)request.GetResponse(); System.IO.Stream responseStream = response.GetResponseStream(); System.Xml.XmlDocument document = new System.Xml.XmlDocument(); document.Load(responseStream); responseStream.Close(); response.Close(); return document; } } public class ExchangeDownloader { public string Username; public string Domain; public string Password; public string MailboxUrl; public string DownloadPath; public void Download() { System.Uri mailboxUri = new System.Uri(MailboxUrl); System.Net.NetworkCredential credential = new System.Net.NetworkCredential(Username, Password, Domain); WebDAV webdav = new WebDAV(); System.Net.CredentialCache credentials = new System.Net.CredentialCache(); credentials.Add(mailboxUri, WebDAV.Authentications.NTLM, credential); webdav.Credentials = credentials; System.Uri[] messageUris = getMessagesWithAttachments(webdav, mailboxUri); foreach (System.Uri messageUri in messageUris) { System.Uri[] attachmentUris = getAttachments(webdav, messageUri); foreach (System.Uri attachmentUri in attachmentUris) { downloadAttachment(webdav, attachmentUri); } webdav.PropPatch(messageUri, WebDAV.PR_HTTPMAIL_READ, WebDAV.NS_HTTPMAIL, "1"); } } private void downloadAttachment(WebDAV webdav, System.Uri uri) { System.Net.WebClient webClient = new System.Net.WebClient(); webClient.Credentials = webdav.Credentials; string file = System.IO.Path.GetFileName(uri.AbsolutePath); string filename = System.IO.Path.Combine(DownloadPath, file); webClient.DownloadFile(uri, filename); } private System.Uri[] getAttachments(WebDAV webdav, System.Uri uri) { System.Collections.ArrayList attachmentList = new System.Collections.ArrayList(); System.Xml.XmlDocument document = webdav.EnumAtts(uri); System.Xml.XmlNodeList responseElements = document.GetElementsByTagName(WebDAV.PR_DAV_RESPONSE, WebDAV.NS_DAV); foreach (System.Xml.XmlElement responseElement in responseElements) { System.Xml.XmlElement hrefElement = responseElement[WebDAV.PR_DAV_HREF, WebDAV.NS_DAV]; System.Uri href = new System.Uri(hrefElement.InnerText); attachmentList.Add(href); } return (System.Uri[])attachmentList.ToArray(typeof(System.Uri)); } private System.Uri[] getMessagesWithAttachments(WebDAV webdav, System.Uri uri) { System.Collections.ArrayList messageList = new System.Collections.ArrayList(); string query = string.Format( "SELECT \"urn:schemas:httpmail:subject\" " + "FROM \"{0}\" " + "WHERE \"urn:schemas:httpmail:hasattachment\"=true " + "ORDER BY \"urn:schemas:httpmail:date DESC\"" , uri); System.Xml.XmlDocument document = webdav.Search(uri, query); System.Xml.XmlNodeList responseElements = document.GetElementsByTagName(WebDAV.PR_DAV_RESPONSE, WebDAV.NS_DAV); foreach (System.Xml.XmlElement responseElement in responseElements) { System.Xml.XmlElement hrefElement = responseElement[WebDAV.PR_DAV_HREF, WebDAV.NS_DAV]; System.Uri href = new System.Uri(hrefElement.InnerText); messageList.Add(href); } return (System.Uri[])messageList.ToArray(typeof(System.Uri)); } } static class Program { static void Main() { ExchangeDownloader exchangeDownloader = new ExchangeDownloader(); exchangeDownloader.Username = "username"; exchangeDownloader.Domain = "domain"; exchangeDownloader.Password = "password"; exchangeDownloader.MailboxUrl = "http://server/exchange/account/inbox"; exchangeDownloader.DownloadPath = "C:\\Downloads"; exchangeDownloader.Download(); } }}