2012-04-10 61 views
0

我正在使用以下代码从Exchange 2003服务器检索电子邮件。所有人都在星期五工作,现在失败了。指定日期时WebDAV Exchange 2003失败

从一些调查我已经缩小到targetDate变量。似乎4月份的日期是否会从服务器返回400。我已经评论了这一行,并尝试了2012年3月29日,2012年4月1日,2012年4月10日(今天)的各种日期,4月份的日期似乎失败了。

某种生病的愚人笑话?

代码本身是从这篇文章中得出:http://www.codeproject.com/Articles/42458/Using-Exchange-2003-with-Webdav-Send-Retrieve-Atta

public XmlDocument GetMailAll() 
    { 
     HttpWebRequest request = default(HttpWebRequest); 
     HttpWebResponse response = default(HttpWebResponse); 
     string rootUri = null; 
     string query = null; 
     byte[] bytes = null; 

     Stream requestStream = default(Stream); 
     Stream responseStream = default(Stream); 
     XmlDocument xmlDoc = default(XmlDocument); 
     xmlDoc = new XmlDocument(); 
     try 
     { 
      DateTime targetDateTime = DateTime.Today.AddDays(-5); 
      String targetDate = ""+targetDateTime.Year + "-" + targetDateTime.Month + "-" + targetDateTime.Day; 

      rootUri = server + "/Exchange/" + alias + "/" + inbox; 
      query = "<?xml version=\"1.0\"?>" 
         + "<D:searchrequest xmlns:D = \"DAV:\" xmlns:m=\"urn:schemas:httpmail:\">" 
         + "<D:sql>SELECT \"urn:schemas:httpmail:hasattachment\", \"DAV:displayname\", " 
         + "\"urn:schemas:httpmail:from\", \"urn:schemas:httpmail:subject\", " 
         //+ "\"urn:schemas:httpmail:htmldescription\"," //Return full body (not necessary right now) 
         + "\"urn:schemas:httpmail:datereceived\", \"urn:schemas:httpmail:read\" FROM \"" + rootUri 
         + "\" WHERE \"DAV:ishidden\" = false " 
         + "AND \"DAV:isfolder\" = false " 
         //+ "AND \"urn:schemas:httpmail:read\" = false" 
         + "AND \"urn:schemas:httpmail:datereceived\" >= CAST(\"" + targetDate + "T00:00:000Z\" AS 'dateTime.tz')" 
         + "</D:sql></D:searchrequest>"; 
      request = (HttpWebRequest)WebRequest.Create(rootUri); 
      request.Timeout = 5000; 
      request.Credentials = new NetworkCredential(alias, password, domain); 
      request.Method = "SEARCH"; 
      request.ContentType = "text/xml"; 
      request.Headers.Add("Translate", "F"); 
      bytes = System.Text.Encoding.UTF8.GetBytes(query); 
      request.ContentLength = bytes.Length; 

      requestStream = request.GetRequestStream(); 
      requestStream.Write(bytes, 0, bytes.Length); 
      requestStream.Close(); 
      response = (HttpWebResponse)request.GetResponse(); 

      authCookies = new List<Cookie>(); 
      foreach(Cookie cookie in response.Cookies) 
      { 
       authCookies.Add(cookie); 
      } 

      responseStream = response.GetResponseStream(); 
      xmlDoc.Load(responseStream); 
      responseStream.Close(); 
     } 
     catch (WebException ex) 
     { 
      if (ex.Response == null) 
      { 
       throw new Exception(); 
      } 
      else if ((ex.Response as HttpWebResponse).StatusCode == HttpStatusCode.Unauthorized) 
      { 
       throw new ExchangeCatastrophicException(); 
      } 
      else 
      { 
       throw new ExchangeFailedException(); 
      } 
     } 
     catch (Exception ex) 
     { 
      throw; 
     } 
     return xmlDoc; 
    } 

回答

0

终于得到它的工作。确切targetDate投包括T00:00:..ž部分必须http://msdn.microsoft.com/en-us/library/aa123600%28v=exchg.65%29.aspx

符合规格要求我现在有:

DateTime targetDateTime = DateTime.Today; 
string targetDate = targetDateTime.ToString("yyyy-MM-dd"); 

剪断

+ "AND \"urn:schemas:httpmail:datereceived\" >= CAST(\"" + targetDate + "T00:00:00Z" + "\" AS 'dateTime.tz')" 

注意,秒部分两个零而不是三个。