Как получить список папок и файлов, развернутых в Linux WebDav? - PullRequest
0 голосов
/ 23 июня 2010

Я развернул сервер WebDav в Debian Linux и дал соответствующее разрешение.

Когда я пытаюсь получить доступ к списку (SEARCH) папок через следующий код, я получаю следующую ошибку:

The remote server returned an error: (405) Method Not Allowed.

Используемый код:

try{
    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)
                       );

                    // 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();
}

Я получил код от http://msdn.microsoft.com/en-us/library/ms992615(EXCHG.65).aspx

1 Ответ

1 голос
/ 23 июня 2010

ПОИСК поддерживается только несколькими серверами, и, кроме того, грамматика D: sql является изобретением Microsoft, присутствующим только на некоторых серверах Microsoft.

Что вам действительно нужно, так это PROPFIND ( RFC 4918, раздел 9.1 ).

...