webrequest get выдает исключение “Удаленный сервер вернул ошибку:(501) Не реализовано”.
-
13-10-2019 - |
Вопрос
Я пытаюсь загрузить файл, используя метод webrequest.Сначала мне нужно войти в систему, а затем получить список файлов или каталогов. 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.Net.WebException:Удаленный сервер вернул сообщение об ошибке:(501) Не реализовано.в System.Net.HttpWebRequest.GetResponse()
Я прочитал все, что смог найти об этой ошибке - и кажется, что проблема должна быть в том, как я получаю - в запросе есть что-то, что неправильно обрабатывается на сервере - но я не вижу, что не так.
Решение 2
Проблема была в постдате. По -видимому, удаленному серверу не понравилось "user =" + username + "& password =" + pass; Стинг - он ожидал именно этот Sting "user = id & password = pass". Что не имеет смысла, но это то, что мне сказали, и это работает. Большое спасибо за ваши предложения. Дженни
Другие советы
"не реализовано" - это потому, что вы указываете ContentType для запроса GET.Это ничего не значит для сервера (в основном оно используется во время запроса POST, и вы хотите отправить полезную нагрузку, такую как XML).Вам нужно проверить ответ на наличие правильного типа контента, чтобы убедиться, что вы получаете zip-файл, но чтобы отправить запрос, вы должны удалить эту спецификацию ContentType.
Я думаю, что именно на это указывает Мистерзимбу в комментарии.:)