2

Web サイトにログインして特定のデータを取得するプログラムに取り組んでいます。ただし、「ログアウトしたか、セッションの有効期限が切れました」というページが表示されるたびに、ログインパラメーターの投稿と Cookie の処理に問題があります。明らかに、パラメーターの投稿またはCookieの処理に問題がありますが、どちらがわかりません。私はしばらくこれに取り組んできましたが、なぜこれが正しく機能しないのか理解できません。

void Login2(string username, string password)
    {
        string pageSource;
        string formUrl = "https://forUrl.com";
        string formParams = string.Format("login={0}&sslProt={1}&pwd={2}&gru={3}", username, "", password, "115237091");
        string cookieHeader;

        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(formUrl);
        req.AllowAutoRedirect = false;
        req.ContentType = "application/x-www-form-urlencoded";
        req.Method = "POST";
        byte[] bytes = System.Text.Encoding.ASCII.GetBytes(formParams);
        req.ContentLength = bytes.Length;
        using (Stream os = req.GetRequestStream())
        {
            os.Write(bytes, 0, bytes.Length);
        }
        HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
        cookieHeader = resp.Headers["Set-cookie"];

        string getUrl = "https://Urlbehindform.com";   
        HttpWebRequest getRequest = (HttpWebRequest)WebRequest.Create(getUrl);
        getRequest.Method = "GET";
        getRequest.AllowAutoRedirect = false;
        getRequest.Headers.Add("Cookie", cookieHeader);
        HttpWebResponse getResponse = (HttpWebResponse)getRequest.GetResponse();
        using (StreamReader sr = new StreamReader(getResponse.GetResponseStream()))
        {
            pageSource = sr.ReadToEnd();
        }
        Response.Redirect(getUrl);

    }

POST を実行したときに Cookie を取得し、GET を実行したときにそれを送り返していますが、何らかの理由でこれが機能していないようです。最初はパラメータだと思っていましたが、Firefox で Tamper Data を使用してさらに問題を調べたところ、ログイン パラメータは正常に機能しているようです。私はこれにしばらく取り組んでいて、頭を包むことができないので、どんな助けも素晴らしいでしょう. ありがとう!

更新

いくつかの提案を試した後、私はまだこれを機能させることができません。ただし、Data Tamper を詳しく調べると、ログイン パラメータを含む POST があり、次に別のページへの GET があり、最後にログイン ページの後のページへの GET があるようです (取得しようとしているページ) . さらにデバッグを行った後、応答ヘッダーの場所に「/cv/scripts/A028/eng/logErr.asp」が表示されているため、ログイン POST が思ったように機能していないことが実際にわかりました。つまり、コードの残りの部分はずっと問題なく機能していた可能性があり、POST が有効なログインを提供していなかったということです。ログインエラーページが常に表示される理由について何か提案はありますか? いつも助けてくれてありがとう。

更新

改ざんデータをさらにいじった後、ログインに成功できない理由は、パラメーターの POST を成功させるためには、Cookie が既に取得されている必要があるためです。どうすればこれを行うことができますか?

4

2 に答える 2

2

Use a single CookieContainer for both requests. Then you don't have to copy cookies manually.

I [BMW1] added in a CookieContainer called cookies, but it still not working, Im not sure if im using the CookieContainer the right way. Here is an updated version of my code.

And edited by me [Hans Kesting], see comments with [HK]

    void Login2(string username, string password)
    {
        string pageSource;
        string formUrl = "https://server/cv/scripts/A028/eng/logProc.asp?ntry=0&dbg=";
        string formParams = string.Format("login={0}&sslProt={1}&pwd={2}&gru={3}", username, "", password, "115237091");

        // [HK] create a container for the cookies, where they are added automatically
        CookieContainer cookies = new CookieContainer();
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(formUrl);
        req.CookieContainer = cookies;
        req.AllowAutoRedirect = false;
        req.ContentType = "application/x-www-form-urlencoded";
        req.Method = "POST";
        byte[] bytes = System.Text.Encoding.ASCII.GetBytes(formParams);
        req.ContentLength = bytes.Length;
        using (Stream os = req.GetRequestStream())
        {
            os.Write(bytes, 0, bytes.Length);
        }
        HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
        // [HK] no need to add cookies "by hand", that will happen automatically
        //cookies.Add(resp.Cookies);


        string getUrl = "https://server/cv/scripts/A028/eng/home.asp";
        HttpWebRequest getRequest = (HttpWebRequest)WebRequest.Create(getUrl);
        // [HK] use the same cookiecontainer as on the first request - correct
        getRequest.CookieContainer = cookies; 
        getRequest.Method = "GET";
        getRequest.AllowAutoRedirect = false;
        HttpWebResponse getResponse = (HttpWebResponse)getRequest.GetResponse();
        // [HK] no need to add cookies, they should be there already
        //cookies.Add(getResponse.Cookies);
        using (StreamReader sr = new StreamReader(getResponse.GetResponseStream()))
        {
            pageSource = sr.ReadToEnd();
        }
        // [HK] no need to add cookies, they should be there already
        // cookies.Add(getResponse.Cookies);
        Response.Redirect(getUrl);

    }
于 2012-06-14T13:57:02.553 に答える
0

Cookie対応のWebクライアントを使用できます。

public class CookieAwareWebClient : WebClient
{
    public CookieContainer CookieContainer { get; set; }
    public Uri Uri { get; set; }

    public CookieAwareWebClient() : this (new CookieContainer())
    {
    }

    public CookieAwareWebClient(CookieContainer cookies)
    {
        this.CookieContainer = cookies;
    }

    protected override WebRequest GetWebRequest(Uri address)
    {
        WebRequest request = base.GetWebRequest(address);
        if (request is HttpWebRequest)
    {
         (request as HttpWebRequest).CookieContainer = this.CookieContainer;
    }
    HttpWebRequest httpRequest = (HttpWebRequest) request;
    httpRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
    return httpRequest;
    }

    protected override WebResponse GetWebResponse(WebRequest request)
    {
        WebResponse response = base.GetWebResponse(request);
    String setCookieHeader = response.Headers[HttpResponseHeader.SetCookie];

    if (setCookieHeader != null)
    {
        //do something if needed to parse out the cookie.
        if (setCookieHeader != null)
        {
            Cookie cookie = new Cookie(); //create cookie
        this.CookieContainer.Add(cookie);
        }
    }
    return response;
    }
}

使用例:


var wc = new CookieAwareWebClient ();
wc.Headers["Content-type"] = "application/x-www-form-urlencoded";
string HtmlResult = wc.UploadString(URI, myParameters);
于 2012-06-14T13:59:12.070 に答える