2010-08-19 5 views
3

Я пытаюсь войти на этот сайт https://www.virginmobile.com.au программно (справа есть форма входа в членство).C# HttpWebRequest к HTTPS не удалось

эта вид работ. Но когда я делаю запрос POST для действия формы (https://www.virginmobile.com.au/selfcare/MyAccount/LogoutLoginPre.jsp), он не прошел.

Он возвращает 302, а затем следующие до нового места, он возвращает 405.

Это мой код test1.aspx.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Net; 
using System.Text; 
using System.IO; 
using System.Security.Cryptography.X509Certificates; 
using System.Net; 


public partial class test1 : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
    string uri = "https://www.virginmobile.com.au/selfcare/MyAccount/LogoutLoginPre.jsp"; 
    string parameters = "username=0411222333&password=123"; 

    System.Net.ServicePointManager.CertificatePolicy = new MyPolicy(); 

    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri); 
    req.Method = "POST"; 
    req.ContentType = "application/x-www-form-urlencoded"; 
    //req.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 (.NET CLR 3.0.4506.2152)"; 
    //req.Referer = "http://www.virginmobile.com.au/"; 
    //req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
    req.AllowAutoRedirect = false; 

    // Send the Post 
    byte[] paramBytes = Encoding.ASCII.GetBytes(parameters); 
    req.ContentLength = paramBytes.Length; 
    Stream reqStream = req.GetRequestStream(); 
    reqStream.Write(paramBytes, 0, paramBytes.Length); //Send it 
    reqStream.Close(); 

    // Get the response 
    HttpWebResponse response = (HttpWebResponse)req.GetResponse(); 
    if (response == null) throw new Exception("Response is null"); 

    if (!string.IsNullOrEmpty(response.Headers["Location"])) 
    { 
     string newLocation = response.Headers["Location"]; 

     // Request the new location 
     req = (HttpWebRequest)WebRequest.Create(newLocation); 
     req.Method = "POST"; 
     req.ContentType = "application/x-www-form-urlencoded"; 
     //req.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 (.NET CLR 3.0.4506.2152)"; 
     //req.Referer = "http://www.virginmobile.com.au/"; 
     //req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
     req.AllowAutoRedirect = false; 
     req.CookieContainer = new CookieContainer(); 
     req.CookieContainer.Add(response.Cookies); 

     // Send the Post 
     paramBytes = Encoding.ASCII.GetBytes(parameters); 
     req.ContentLength = paramBytes.Length; 
     reqStream = req.GetRequestStream(); 
     reqStream.Write(paramBytes, 0, paramBytes.Length); //Send it 
     reqStream.Close(); 

     // Get the response 
     response = (HttpWebResponse)req.GetResponse(); //**** 405 Method Not Allowed here 
    } 

    StreamReader sr = new StreamReader(response.GetResponseStream()); 
    string responseHtml = sr.ReadToEnd().Trim(); 

    Response.Write(responseHtml); 
    } 
} 

public class MyPolicy : ICertificatePolicy 
{ 
    public bool CheckValidationResult(ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem) 
    { 
    return true; // Return true to force the certificate to be accepted. 
    } 
} 

Может кто-нибудь мне помочь? Заранее спасибо!

ответ

5

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

Возможно, попробуйте установить HttpWebRequest.AllowAutoRedirect = false и поймайте исключение, которое вы получите назад. Затем создайте другой запрос перенаправленному URL (указанному в заголовке ответа местоположения), а затем снова выполните запрос с теми же данными POST.

+0

Использование TamperData, я узнал, что реальная форма на virginmobile.com.au также перенаправляет ... но я постараюсь это. Благодаря! – Aximili

+0

Кажется, настроен куки. Как вы получаете «местоположение» с помощью C#? – Aximili

+1

Вы можете найти заголовки ответов в свойстве WebResponse.Headers после вызова GetResponse(). Вы можете использовать 'request.CookieContainer = новый CookieContainer();' для захвата в файл cookie. –

1

Вы отправляете довольно мало заголовков по вашему запросу. Очень возможно, что они написали свой сценарий, чтобы он ожидал присутствия определенных заголовков. Заголовки, которые я могу вспомнить с верхней части моей головы:

  • User-Agent (идентифицирует браузер и его версию, вы можете претендовать на Firefox, к примеру)
  • Referer (идентифицирует URL, откуда вы пришли; положить домашнюю страницу URL здесь)
  • Accept-Charset, Accept-Encoding, Accept-Language

, но могут быть и другие. Вероятно, вы можете использовать инструмент Fiddler, который вы упомянули, чтобы узнать, какие заголовки Firefox (или любой другой браузер, который вы используете) отправляет с обычными (не HTTPS) запросами, а затем добавляет некоторые из них в ваш запрос и видит, заставляет ли он работать. (Лично я использую TamperData для этой цели, которая является плагин Firefox.)

+0

Спасибо Timwi, TamperData очень хорошо. Кажется, он настроил куки. Любая идея, как я поймаю файл cookie программно и передаю его следующему запросу (указанному в Location)? – Aximili

+0

LOL! Я честно не ожидал, что вы не позаботились о самом очевидном заголовке, в Cookie. Как вы считаете, что логины работают? :) - Я подозреваю, что все, что вам нужно сделать, это создать экземпляр 'CookieContainer' и назначить его' req.CookieContainer' для каждого запроса. Я не пробовал, но я ожидаю, что в первом запросе будет храниться файл cookie, а второй запрос будет читать его. – Timwi

+0

lol Я не думал об этом. Спасибо, ты, наверное, прав, я попробую! – Aximili

0

Постановили: 405, потому что я посылал POST вместо того, чтобы GET

1

Я получаю ошибку 404 - Удаленный сервер возвращается ошибка: (404) Не найдено. Ниже приведен код, в котором я получаю ошибку в той же строке кода, что и ошибка 405. Если я заменил код предыдущей версией, возвращается 404, но возвращается ошибка 405.

Благодаря

string uri = "https://www.virginmobile.com.au/selfcare/MyAccount/LogoutLoginPre.jsp?username=0466651800&password=160392"; 
string parameters = "username=0411223344&password=123456"; 

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri); 
req.Method = "GET"; 
req.ContentType = "application/x-www-form-urlencoded"; 
//req.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.2)  Gecko/20100316 Firefox/3.6.2 (.NET CLR 3.0.4506.2152)"; 
//req.Referer = "http://www.virginmobile.com.au/"; 
//req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
req.AllowAutoRedirect = false; 

// Send the Post 
byte[] paramBytes = Encoding.ASCII.GetBytes(parameters); 
//req.ContentLength = paramBytes.Length 
//Dim reqStream As Stream = req.GetRequestStream() 
//reqStream.Write(paramBytes, 0, paramBytes.Length) 
//Send it 
//reqStream.Close() 

// Get the response 
HttpWebResponse response__1 = (HttpWebResponse)req.GetResponse(); 
if (response__1 == null) { 
throw new Exception("Response is null"); 
} 

if (!string.IsNullOrEmpty(response__1.Headers("Location"))) { 
string newLocation = response__1.Headers("Location"); 

// Request the new location 
req = (HttpWebRequest)WebRequest.Create(newLocation + "?" + parameters); 
req.Method = "GET"; 
req.ContentType = "application/x-www-form-urlencoded"; 
req.AllowAutoRedirect = false; 
req.CookieContainer = new CookieContainer(); 
req.CookieContainer.Add(response__1.Cookies); 

// Send the Post 
//paramBytes = Encoding.ASCII.GetBytes(parameters) 
//req.ContentLength = paramBytes.Length 
//Dim reqStream As Stream = req.GetRequestStream() 
//reqStream.Write(paramBytes, 0, paramBytes.Length) 
//Send it 
//reqStream.Close() 

// Get the response 
//**** The remote server returned an error: (404) Not Found. 
response__1 = (HttpWebResponse)req.GetResponse(); 
} 

StreamReader sr = new StreamReader(response__1.GetResponseStream()); 
string responseHtml = sr.ReadToEnd().Trim(); 
Смежные вопросы