当前位置:编程学习 > C#/ASP.NET >>

Exchange2003 webdav 远程服务器返回错误: (400) 错误的请求

在读取邮件时报400错误,大虾们帮忙看看是什么原因,代码如下
          string url = @"http://60.1.1.76/exchange/"; 
            System.Net.HttpWebRequest Request;
            System.Net.WebResponse Response;
            System.Net.CredentialCache MyCredentialCache;
            string strUserName = "http://60.1.1.76/exchange/"; //指定登录的用户名
            string strRootURI = url + strUserName.Trim() + "/收件箱/"; //得到要访问邮箱的WebDAV地址
            string strPassword = "123456"; //指定该用户的密码
            string strDomain = "sipspf.org.cn"; //指定域名
            string strQuery = "";
            byte[] bytes = null;
            System.IO.Stream RequestStream = null;
            System.IO.Stream ResponseStream = null;
            XmlDocument ResponseXmlDoc = null;

            try
            {

                // 用SQL查询WebDAV返回结果中的unreadcount节点.
                strQuery = "<?xml version=\"1.0\"?><D:searchrequest xmlns:D = \"DAV:\" >"
                                   + "<D:sql>SELECT \"urn:schemas:httpmail:importance\",\"urn:schemas:httpmail:from\",\"urn:schemas:httpmail:read\",\"urn:schemas:httpmail:datereceived\",\"urn:schemas:httpmail:subject\",\"urn:schemas:httpmail:hasattachment\","
                                   + "\"DAV:contentclass\",\"DAV:getcontentlength\",\"DAV:displayname\""
                                   + "FROM \"" + strRootURI + "\""
                                   + "WHERE \"DAV:ishidden\" = false AND \"DAV:isfolder\" = false"
                                   + "</D:sql></D:searchrequest>";



                // 创建新的CredentialCache对象,构建身份凭据
                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);

                // 指定HttpWebRequest的身份凭据,此处为关键所在。如果使用之前
                // 创建的MyCredentialCache,则这个身份凭据是可以从Web服务器传递
                // 到Exchange服务器的,但是这样带来的问题也很明显,就是不能够自
                // 动获取当前登录到域的用户的身份。即便已经成功登录到域,那也只
                // 能通过form再次输入用户名密码。因此,我在这里用的是
                // Request.Credentials = CredentialCache.DefaultCredentials,
                // 这样便可以获得当前用户的凭据,但是这样带来的问题便是上面提到的
                // 身份凭据无法传递的问题,解决方法请关注下篇文章。
                Request.Credentials = MyCredentialCache;

                // 指定WebDAV的SEARCH方法
                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();

                // 创建XmlDocument对象,并获取收件箱的unreadcount节点的值
                ResponseXmlDoc = new XmlDocument();
                ResponseXmlDoc.Load(ResponseStream);

                XmlNodeList idNodes = ResponseXmlDoc.GetElementsByTagName("a:displayname");
                XmlNodeList SenderNodes = ResponseXmlDoc.GetElementsByTagName("d:from");
                XmlNodeList importanceNodes = ResponseXmlDoc.GetElementsByTagName("d:importance");
                XmlNodeList contextclassNodes = ResponseXmlDoc.GetElementsByTagName("a:contentclass");
                XmlNodeList readNodes = ResponseXmlDoc.GetElementsByTagName("d:read");
                XmlNodeList datareceiveNodes = ResponseXmlDoc.GetElementsByTagName("d:datereceived");
                XmlNodeList subjectNodes = ResponseXmlDoc.GetElementsByTagName("d:subject");
                XmlNodeList getcontentlengthNodes = ResponseXmlDoc.GetElementsByTagName("a:getcontentlength");
                XmlNodeList hasattachmentNodes = ResponseXmlDoc.GetElementsByTagName("d:hasattachment");
                XmlNodeList hrefNodes = ResponseXmlDoc.GetElementsByTagName("a:href");
                XmlNodeList dateNodes = ResponseXmlDoc.GetElementsByTagName("d:date");

                DataTable dt = new DataTable();

                dt.Columns.Add("Subject");
                dt.Columns.Add("Href");
                dt.Columns.Add("Time");
                dt.Columns["Time"].DataType = Type.GetType("System.DateTime");

                for (int j = 0; j < readNodes.Count; j++)
                {
                    dt.Rows.Add(subjectNodes[j].InnerText, hrefNodes[j].InnerText, DateTime.Parse(datareceiveNodes[j].InnerText));

                }
                ResponseStream.Close();
                Response.Close();


                return dt;
            }
            catch
            {
                return null;
            }
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,