2011-01-20 1 views
1

Я пытаюсь загрузить файл, используя метод webrequest. Сначала мне нужно войти в систему, чтобы получить файл или список каталогов. https:///xxx.yyy.zzz/login_templatewebrequest get исключает исключение «Удаленный сервер ответил на ошибку: (501) Не реализовано».

Когда я смотрю на источник сайта в Firefox, я вижу

<META http-equiv="Content-Type" content="text/html"> 
    .... 
    <form method="post" action="/template/login" enctype="application/x-www-form- urlencoded"> 
    .... 
    <input name="user" type="text"> 
    <input name="password" type="password"> 
    <input type=hidden name="switch" value="Log In"> 
    <input type="submit" value="Accept"> 

Итак, я написал этот код:

public static string DownloadFile() 
    { 
    CookieContainer cookieJar = new CookieContainer(); 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https:///xxx.yyy.zzz/login_template"); 
    request.CookieContainer = cookieJar; 

    // Set the credentials. 
    request.Proxy.Credentials = CredentialCache.DefaultNetworkCredentials; 
    request.Credentials = new NetworkCredential(userName, pass); 
    request.KeepAlive = true; 
    request.UserAgent = "SecureTransport"; 
    request.ContentType = @"application/x-www-form-urlencoded"; 
    request.Method = WebRequestMethods.Http.Post; 

    bool loggedin = false; 
    try 
    { 
     // first need to log in 
     string postData = "user=" + userName + "&Password=" + pass; 
     byte[] postBuffer = System.Text.Encoding.GetEncoding(1252).GetBytes(postData); 
     request.ContentLength = postBuffer.Length; 
     Stream newStream = request.GetRequestStream(); 
     // Send the data. 
     newStream.Write(postBuffer, 0, postBuffer.Length); 
     newStream.Close(); 

     using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
     { 
      // Get the stream containing content returned by the server. 
       if (response.StatusCode == HttpStatusCode.OK) 
       { 
        loggedin = true; 
       } 
       response.Close(); 
      } 

Ответ, который я получаю в порядке - так, кажется, Я успешно вошли в систему. Но потом, мне нужно, чтобы перейти на другой URL, чтобы получить файл https:///xxx.yyy.zzz/myfile.zip

HttpWebRequest requestToGetFile = (HttpWebRequest)WebRequest.Create("https:///xxx.yyy.zzz/myfile.zip"); 
requestToGetFile.Method = WebRequestMethods.Http.Get; 
requestToGetFile.CookieContainer = cookieJar; 

requestToGetFile.UserAgent = "SecureTransport"; 
requestToGetFile.ContentType = @"application/octet-stream"; 
using (HttpWebResponse responseToGetFile = (HttpWebResponse)requestToGetFile.GetResponse()) 
{ 
    if (responseToGetDir.StatusCode != HttpStatusCode.OK) 
    {  
     ... 
    } 
} 

Я всегда получаю исключение System.Exception: System.Net.WebException: Удаленный сервер возвратил ошибку: (501) Не реализовано. в System.Net.HttpWebRequest.GetResponse()

Я прочитал все, что мог найти об этой ошибке - и кажется, что проблема должна быть в том, как я это делаю - есть что-то в запросе, что это не правильно обрабатывается на сервере, но я не вижу, что не так.

+2

Сравните ваши запросы с запросами от реального браузера с помощью Fiddler. – SLaks

+0

Это удаленный сервер, который возвращает ошибку. Вот почему WebRequest выдает исключение. Вам нужно выяснить, что это значит, что удаленный сервер не нравится. –

+1

Я думаю, что это может быть строка requestToGetFile.ContentType = "application/octet-stream". Если я не ошибаюсь, * request * не должен быть типом содержимого октетного потока, а скорее должен быть ответ zip-файла. Попробуйте комментировать это и посмотрите, работает ли он? – MisterZimbu

ответ

0

Проблема была в postData. По-видимому, удаленному серверу не понравилось «user =» + userName + «& Password =« + pass; sting - ожидалось именно это жало «user = ID & Password = Pass». Что не имеет смысла, но это то, что мне сказали, и это работает. Спасибо за ваше предложение. Jenny

1

«Не реализовано» - это потому, что вы указываете ContentType на запрос GET. Это ничего не значит для сервера (в основном используется во время запроса POST, и вы хотите отправить полезную нагрузку, например XML). Вам нужно проверить ответ на правильный тип контента, чтобы убедиться, что вы получаете zip-файл, но чтобы сделать запрос, вам нужно удалить эту спецификацию ContentType.

Я думаю, что это также указывает МистерЖимбу в комментарии. :)