Веб-сервер не позволяет использовать почтовый метод

0

Я хочу подключить веб-сайт с моим идентификатором пользователя и паролем и получить мои данные с веб-сайта и сохранить их в текстовом файле, но я получаю ошибку 405, что метод не разрешен. Может ли кто-нибудь помочь мне разобраться в этом? Вот html-код веб-сервера:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>blablbablablabl</title>
</head>
<script type="text/javascript">
function login() {
    setTimeout('window.close()',1000);
} 
</script>
<body>
<div><h3>blablablaasdasd</h3><form onSubmit="javascript:login();" style='margin-  top:10px;' id='loginPageForm' action='http://website.com' method='post' target='_blank'
<div>
<input name='t:ac' type='hidden'  value='$002f$002website.com$002fclient$002fdefault$002fsearch$002faccount$003f'  />
<input name='t:formdata' type='hidden' value='H4sIAAAAAAAAAJWQv0oDQRDGx4NAMJ1gEURstN2zMI02BkEQDgkc1mFvb7xs2Ntdd/ZMbKx8CRufQKz0CVLY+Q4+gI2FlYV7J6Lg/274mJnv932XD9CarMAyIXdiFA+4d0YnppB6czysCJ3mJZKDnnEF45aLETLPLZJ3Jz0mjEMlM5ZxQtbPgsiF35Wo8tUUfWXXDmad+8Xb5wjmEugIo8N3tR8+elhIxvyYx4rrIk69k7rYmloP8++uf8Hq/xdr4IxAorTKSkkkjZ5d5RuHTxd3EcDUfmtpOdHEuJyO4BSgwXyTfr2pT1qTJeh+sUU1hw9Btn8MIkxpjUbtiTXk/nOO8/Sxe3N9thNBlEBbKBm29xrvunpUWAahrr6R6qrbr+bD9Q/jCx9ggTUPAgAA' /></div>
<label for='identity'>Card Number:</label><div><input type='text' name='j_username'  /</div>
<div style='clear:both;'></div>
<label for='password'>Password:</label>
<div><input name='j_password' type='password' class='pass' value='' /><input type='submit' value='Login' /></div></form></div>
</body>
</html>

Вот код С#, который я пытаюсь достичь на сервере.

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://website.com/file.html");
        request.AllowAutoRedirect = true;  
        request.Timeout = 10000;           // timeout 10s
        request.Method = "POST";

        String formContent = "t:ac=$002f$002website.com$002fclient$002fdefault$002fsearch$002faccount$003f&t:formdata=H4sIAAAAAAAAAJWQv0oDQRDGx4NAMJ1gEURstN2zMI02BkEQDgkc1mFvb7xs2Ntdd/ZMbKx8CRufQKz0CVLY+Q4+gI2FlYV7J6Lg/274mJnv932XD9CarMAyIXdiFA+4d0YnppB6czysCJ3mJZKDnnEF45aLETLPLZJ3Jz0mjEMlM5ZxQtbPgsiF35Wo8tUUfWXXDmad+8Xb5wjmEugIo8N3tR8+elhIxvyYx4rrIk69k7rYmloP8++uf8Hq/xdr4IxAorTKSkkkjZ5d5RuHTxd3EcDUfmtpOdHEuJyO4BSgwXyTfr2pT1qTJeh+sUU1hw9Btn8MIkxpjUbtiTXk/nOO8/Sxe3N9thNBlEBbKBm29xrvunpUWAahrr6R6qrbr+bD9Q/jCx9ggTUPAgAA&j_username=johndoe0&j_password=12345";

        byte[] byteArray = Encoding.UTF8.GetBytes(formContent);
        request.ContentType = "application/x-www-form-urlencoded";
        request.ContentLength = byteArray.Length;
        Stream dataStream = request.GetRequestStream();
        dataStream.Write(byteArray, 0, byteArray.Length);
        dataStream.Close();
       // Get the response ...
        WebResponse response;
        response = (HttpWebResponse)request.GetResponse();//ERROR OCCURS HERE!!! 
        dataStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(dataStream);
        richTextBox1.AppendText(HttpUtility.UrlDecode(reader.ReadToEnd()));
        reader.Close();
        dataStream.Close();
        response.Close();

EDIT: проблема решена, найден другой URL-адрес на этом веб-сайте, который позволяет использовать метод POST.

Теги:
http

3 ответа

1
Лучший ответ

Решение @GSiry - это, вероятно, путь, если вы управляете сервером, из которого вы извлекаете данные.

В противном случае проблема заключается в настройке вашего запроса на любой метод HTTP, который принимает удаленный сервер: метод "Не разрешено" означает, что сервер не будет принимать какие-то определенные методы при принятии других и по уважительным причинам. См. Больше по запросу безопасность и идемпотентность.

Что произойдет, если вы используете GET вместо POST?

EDIT: Предполагая, что вы действительно отправляете POST на один и тот же веб-URL как из HTML-формы, так и с вашего запроса С# (что, похоже, не так), причина, по которой она ведет себя по-другому, не очевидна и на самом деле зависит от реализации на сервере, Это означает, что мы можем делать только догадки (например, может не понравиться получаемый им пользовательский агент (или его отсутствие)) из вашего кода на С#.

Во всяком случае, я согласен с рекомендацией использовать GET. По всей видимости, нет никаких причин для запроса POST-запроса, поскольку вы не собираетесь изменять website.com/file.html, что является заявленной целью метода POST.

EDIT2: Не нужно использовать POST для входа в систему. HTTP-аутентификацию можно выполнить через параметры формы, через заголовки запросов HTTP или через собственную авторитетную часть имени домена (http://имя пользователя: пароль@website.com/your_file.html). Но это зависит исключительно от конкретной реализации сервера.

Если вы не можете получить доступ к журналам сервера, я боюсь, что у вас есть сеанс проб и ошибок. Начните имитируя запрос браузера точно. Firebug, консоль разработчика Chrome или Safari будут вашими друзьями, чтобы точно определить, какие заголовки передаются вместе с запросом браузера, чтобы разрешить метод POST.

С другой стороны, то, что вы должны использовать для процедуры аутентификации, это SSL/TLS (https ://...)

  • 0
    Я хотел бы, чтобы он разместил больше информации о своем серверном коде и архитектуре
  • 0
    Он работает с методом GET. Я получаю весь HTML-код, который я скопировал с веб-сайта в мой объект richtextbox. Но есть вещь, которую я не могу понять в html-коде веб-сайта, рядом с методом есть метод post, и с помощью браузера я отправляю данные на сервер, и он работает, но почему не работает в C #? Пожалуйста, поймите, потому что я очень новичок в веб-кодировании.
Показать ещё 6 комментариев
1

Если вы используете MVC, это может быть так же просто, как добавление

[HttpPost]

атрибут функции контроллера, который принимает ваш запрос на отправку

  • 0
    Это не сработало.
0

Если вы пытаетесь получить доступ к WebService, добавьте следующий раздел на целевой сайт Web.config в System.Web:

<webServices>
   <protocols>
      <add name="HttpPost"/>
   </protocols>
</webServices>
  • 0
    Я не могу добавить это, потому что сервер не мой.
  • 0
    Хорошо, если вы не контролируете это и не можете попросить тех, кто делает изменения, а сервер не разрешает эти запросы - вы ничего не можете сделать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню