3

数週間前に C# をいじり始めたばかりです。私は実行しようとしているタスクを取得しましたが、現在の方法が正しいアプローチであるかどうかわかりません。

Web サイト (私の場合は WordPress Web サイト - より良いオプションの湖) にログインしようとしており、C# を使用して管理パネルをナビゲートしています。

これまでのところ、新しいプロジェクトである Windows フォーム アプリケーションを作成してきました。

次のコード - パスワード/ユーザー名およびその他のパラメーターを POST として Web サイトに要求を送信します。

private void button2_Click(object sender, EventArgs e)
{
    CookieContainer cookieJar = new CookieContainer();
    CookieContainer cookieJar2 = new CookieContainer(); // will use this later
    string testaa = ""; // will use this later
    string paramaters = "log=xxxx&pwd=xxxx&testcookie=1&redirect_to=http://www.example.com/wp-admin/&wp-submit=Log In";
    string strResponse;
    HttpWebRequest requestLogin = (HttpWebRequest)WebRequest.Create("http://www.lyndatobin-howes.com/wp-login.php");
    requestLogin.Method = "POST";
    requestLogin.AllowAutoRedirect = false;
    requestLogin.ContentType = "application/x-www-form-urlencoded";
    requestLogin.CookieContainer = cookieJar;
    requestLogin.ContentLength = paramaters.Length;
    StreamWriter stOut = new StreamWriter(requestLogin.GetRequestStream(), Encoding.ASCII);
    stOut.Write(paramaters);
    stOut.Close();
}

次に、このコードを使用して、応答の Cookie を取得します。

HttpWebResponse response = (HttpWebResponse)requestLogin.GetResponse();
foreach (Cookie c in response.Cookies)
{
    cookieJar2.Add(new Cookie(c.Name, c.Value, c.Path, c.Domain));
}

次に、これを使用して応答を読み取り、いくつかのストリームを閉じます。

StreamReader stIn = new StreamReader(requestLogin.GetResponse().GetResponseStream());
strResponse = stIn.ReadToEnd();
string responseFromServer = stIn.ReadToEnd();
webBrowser1.DocumentText = responseFromServer;
stIn.Close();
response.Close();

そして、次のようにアクセスしようとしているページに上記のCookieを使用してみます:

HttpWebRequest requestLogin2 = (HttpWebRequest)WebRequest.Create("http://www.example.com/wp-admin/");
requestLogin2.Method = "POST";
requestLogin2.AllowAutoRedirect = false;
requestLogin2.ContentType = "application/x-www-form-urlencoded";
requestLogin2.CookieContainer = cookieJar2;
requestLogin2.ContentLength = paramaters.Length;
StreamWriter stOut2 = new StreamWriter(requestLogin2.GetRequestStream(), System.Text.Encoding.ASCII);
stOut2.Write(paramaters);
stOut2.Close();

StreamReader stIn2 = new StreamReader(requestLogin2.GetResponse().GetResponseStream());
strResponse = stIn2.ReadToEnd();
string responseFromServer2 = stIn2.ReadToEnd();
webBrowser1.DocumentText = responseFromServer2;
richTextBox2.Text += "\n\n\n" + responseFromServer2;
stIn.Close(); 

なんらかの理由で機能しません。これを1週間試しています。

ヘッダーを表示しようとしました-最初のリクエストの後、返されるヘッダーを確認しました。そして、私が作成したCookie(cookieJar2)を調べましたが、それらは同じではないようです..

とにかく、この問題に関する助けは素晴らしく、高く評価されます。私はできるだけ多くの詳細を提供しようとしました。

4

1 に答える 1

0

GetResponse()コードについて最初に気付くのは、最初のログインで次のように 2 回呼び出していることです。

HttpWebResponse response = (HttpWebResponse)requestLogin.GetResponse();

StreamReader stIn = new StreamReader(requestLogin.GetResponse().GetResponseStream());

その結果、ログイン要求を 2 回行うことになり、2 つの異なる Cookie が返されます。cookieJar2これが、後で出力するものとCookie が一致しない理由です。responseオブジェクトを再利用します。

StreamReader stIn = new StreamReader(response.GetResponseStream());

次に、管理ページをロードしようとするときは、ロードしないPOSTでください。2 番目のリクエストはGET、ページのコンテンツを取得するためのものです。

于 2012-04-11T21:36:39.277 に答える