次の関数は 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 でさえ助けてくれませんでした。どこでも解決策を探していました ありがとう!