2011-02-02 11 views
6

Estoy intentando enviar datos a esta página mediante el uso de la clase HttpWebRequest:envío de datos utilizando HttpWebRequest con una página de inicio de sesión

www.stage1.darotools.com/Quran.v1.admin/_FormsWizard/CreateForm.asp 

pero se enfrentaron a un problema con la autenticación de inicio de sesión. aquí está mi código:

System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding(); 
    string postData = "ctlMessageID=" + 348; 
    postData += ("&ctlUserID=" + 7); 
    postData += ("&ctlTitle=" + 7); 
    postData += ("&ctlEmail=" + "[email protected]"); 
    postData += ("&ctlIsSystem=" + 0); 
    postData += ("&ctlFormBody="); 
    postData += ("&ctlEnableCaptcha="); 
    postData += ("&ctlEmailAttachedFiles="); 
    postData += ("&ctlMailingList="); 
    postData += ("&ctlCommentaryTitle=" + 1); 
    postData += ("&ctlIsActive=" + 2); 
    postData += ("&ctlCommentaryPersonID=" + 6); 
    postData += ("&ctlOrderKey="); 
    postData += ("&Commentary_TextControl_html=" + "aaaaaaaaaaaa"); 
    postData += ("&controlValue4=" + 666666); 
    postData += ("&ctlLanguageID=" + 1); 
    postData += ("&ctlAya=" + 349); 
    postData += ("&PathInfo=" + "dbsFramed, dbsFramed"); 
    postData += ("&Caller=" + "rawhi"); 
    byte[] data = encoding.GetBytes(postData); 

    // Prepare web request... 
    HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create("http://stage1.darotools.com/Quran.v1.admin/_FormsWizard/CreateForm.asp"); 
    myRequest.Method = "POST"; 
    myRequest.ContentType = "application/x-www-form-urlencoded"; 
    myRequest.ContentLength = data.Length; 
    Stream newStream = myRequest.GetRequestStream(); 
    // Send the data. 
    newStream.Write(data, 0, data.Length); 
    newStream.Close(); 

Y esta es la página de inicio de sesión:

www.stage1.darotools.com/Quran.v1.admin/Login.asp 

Gracias de antemano.

+0

Nadie puede ayudar? – Rawhi

+0

¿Qué tipo de autenticación se usa para iniciar sesión? ¿No parece que estás suministrando credenciales? Además, postData debe ser un StringBuilder. Concatenar muchas cadenas de ese tipo es una mala práctica. – TimC

+0

y mucho menos la mala práctica, mi problema es que la página de inicio de sesión no es realmente la página de inicio de sesión real, sino que redirige a otra página web 'PostLogin.asp' que a su vez redirige a la página principal. Intenté usar las cookies pero eso tampoco funcionó para mí. – Rawhi

Respuesta

1

Trate de usar:

myRequest.Credentials = new NetworkCredential("username", "password", "domain"); // domain is not needed in case of forms authentication 

Si esto no funciona se puede autenticar el usuario en la página de inicio de sesión y pasando CookieContainer allí y luego reutilizar ese CookieContainer cuando se solicita la página necesaria.

+0

No podía creer que fuera así de fácil. –

0

Hay un par de cosas diferentes que podrían estar pasando aquí

Pruebe a establecer algunas credenciales

myRequest.Credentials = CredentialCache.DefaultCredentials; 

// if we have a proxy set its creds as well 
if(myRequest.Proxy != null) 
{ 
    myRequest.Proxy.Credentials = CredentialCache.DefaultCredentials; 
} 

y asegúrese de que está configurando un agente de usuario y la configuración de Accpet también.

myRequest.UserAgent = "Foo"; 
myRequest.Accept = "*/*"; 

Si agrega esto, no creo que tenga ningún problema.

4

En primer lugar, parece que en realidad no está enviando la solicitud. Para enviar la solicitud POST al servidor que necesita para solicitar la respuesta:

HttpWebResponse response = (HttpWebResponse)myRequest.GetResponse(); 
string responseContent = null; 
using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
{ 
    //get the text content of the response, if needed 
    responseContent = reader.ReadToEnd(); 
} 

Además, parece que la página que está publicando, está en busca de una sesión establecida y autenticado. Intenta publicar credenciales en la página de inicio de sesión (http://stage1.darotools.com/Quran.v1.admin/Login.asp) primero. Establezca HttpWebRequest.CookieContainer en una nueva instancia de CookieContainer(). A continuación, realice otra publicación en la página CreateForm.asp pero asegúrese de establecer el nuevo objeto HttpWebRequest.CookieContainer para usar la misma instancia del CookieContainer que utilizó cuando realizó una POST en la página de inicio de sesión. A continuación, las cookies recibidas de la página de inicio de sesión se enviarán a la página CreateForm.asp y la sesión se "mantendrá" desde la perspectiva del servidor. Por ejemplo:

CookieContainer m_cookies = new CookieContainer(); 
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create("http://stage1.darotools.com/Quran.v1.admin/Login.asp"); 
... 

HttpWebResponse response = (HttpWebResponse)myRequest.GetResponse(); 
HttpWebRequest formRequest = (HttpWebRequest)WebRequest.Create("http://stage1.darotools.com/Quran.v1.admin/_FormsWizard/CreateForm.asp"); 
formRequest.CookieContainer = myRequest.CookieContainer; 
using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
{ 
    //get the text content of the response, if needed 
    responseContent = reader.ReadToEnd(); 
} 
+0

He intentado esto también, pero cada vez que requiero la página CreatForm, me redirigen a la página de inicio de sesión que contiene solo el formulario de inicio de sesión y la página de inicio de sesión real se maneja en PostLogin.asp – Rawhi

Cuestiones relacionadas