1

次の関数は C# で記述されており、Web サイトへのログイン (POST メソッドの使用と Cookie の設定) に使用されます。

問題は、間違ったユーザー名またはパスワードで最初にログインした場合、プログラムを再度実行するまで再度ログインできないことです。関数は 1 回実行され、ログイン情報が間違っている場合、数分後に次のエラーで終了します。

Stream newStream = getRequest.GetRequestStream(); // open connection

WebException はユーザー コードによって処理されませんでした: タイムアウトの期限が切れました

何が悪いのかを知るために少し助けを求めたいと思います。私の意見では、間違いは CookieCollection の使用にある可能性があります。ログインに失敗した場合に備えて、既存のすべての Cookie を削除したいのですが、それがわかりません。私はこのソリューションを使用しています:

private bool Login(string name, string password) 
   { 
       HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://.../login-page/"); 
       request.CookieContainer = new CookieContainer(); 
       request.CookieContainer.Add(cookies); 
       //Get the response from the server and save the cookies from the first request.. 
       HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
       cookies = response.Cookies; 

       string sourceCode; 
       string getUrl = "http://.../login/"; 
       string postData = String.Format("username={0}&password={1}", name, password); 
       HttpWebRequest getRequest = (HttpWebRequest)WebRequest.Create(getUrl); 
       getRequest.CookieContainer = new CookieContainer(); 
       getRequest.CookieContainer.Add(cookies); //recover cookies First request 
       getRequest.Method = WebRequestMethods.Http.Post; 
       getRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2"; 
       getRequest.AllowWriteStreamBuffering = true; 
       getRequest.ProtocolVersion = HttpVersion.Version11; 
       getRequest.AllowAutoRedirect = true; 
       getRequest.ContentType = "application/x-www-form-urlencoded"; 

       byte[] byteArray = Encoding.ASCII.GetBytes(postData); 
       getRequest.ContentLength = byteArray.Length; 
       Stream newStream = getRequest.GetRequestStream(); // open connection 
       newStream.Write(byteArray, 0, byteArray.Length);  // Send the data. 
       newStream.Close(); 

       HttpWebResponse getResponse = (HttpWebResponse)getRequest.GetResponse(); 
       cookies = getResponse.Cookies; 
       using (StreamReader sr = new StreamReader(getResponse.GetResponseStream())) 
       { 
           sourceCode = sr.ReadToEnd(); 
       } 

       if (sourceCode.Contains("<div id='login'>Přihlášení se zdařilo</div>")) 
       { 
           return true; 
       } 
       return false; 
   }

コード: https://stackoverflow.com/a/8542205/2715725

どんな種類の助けでも本当に感謝します。私は C# にはあまり興味がなく、この種のコードをまとめるのに問題があります。私はこれを何日も解決しようとしてきましたが、Google でさえ助けてくれませんでした。どこでも解決策を探していました ありがとう!

4

3 に答える 3

0

これを関数に追加します。

request.KeepAlive = false;
response.Close();
getRequest.KeepAlive = false;
getResponse.Close();
于 2013-09-07T23:35:08.413 に答える