webrequest get выдает исключение «Удаленный сервер возвратил ошибку: (501) Не реализовано». - PullRequest
1 голос
/ 20 января 2011

Я пытаюсь загрузить файл, используя метод веб-запроса. Сначала мне нужно войти в систему, затем получить файл или список каталогов. https: ///xxx.yyy.zzz/login_template

Когда я смотрю на исходный сайт в 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 ]

1 голос
/ 21 января 2011

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

Я думаю, что именно на это указывает и MisterZimbu в комментарии.:)

0 голосов
/ 29 января 2011

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

...