C#: Webclient lädt den Quellcode einer HTML -Seite anstelle der tatsächlichen Ressource herunter

StackOverflow https://stackoverflow.com/questions/6310050

  •  26-10-2019
  •  | 
  •  

Frage

Ich habe diesen Code aus einem der MSDN -Blogs übernommen und WebClient hinzugefügt, um eine Ressource herunterzuladen.

string formUrl = "My login url";
            string formParams = string.Format("userName={0}&password={1}&x={2}&y={3}&login={4}", "user", "password","0","0","login");
            string cookieHeader;
            WebRequest req = WebRequest.Create(formUrl);
            req.ContentType = "application/x-www-form-urlencoded";
            req.Method = "POST";
            byte[] bytes = Encoding.ASCII.GetBytes(formParams);
            req.ContentLength = bytes.Length;
            using (Stream os = req.GetRequestStream())
            {
                os.Write(bytes, 0, bytes.Length);
            }
            WebResponse resp = req.GetResponse();
            cookieHeader = resp.Headers["Set-cookie"];
            string pageSource;
            string getUrl = "Resource url";
            WebRequest getRequest = WebRequest.Create(getUrl);
            getRequest.Headers.Add("Cookie", cookieHeader);
            WebResponse getResponse = getRequest.GetResponse();
            using (StreamReader sr = new StreamReader(getResponse.GetResponseStream()))
            {
                pageSource = sr.ReadToEnd();
                System.Console.WriteLine(sr.ToString());
            }

            WebClient wc = new WebClient();
            wc.Headers["Content-Type"] = "application/x-www-form-urlencoded";

            wc.DownloadFile("Resource url","C:\\abc.tgz");
            Console.Read();

Aber ABC.TGZ ist nicht das, was es sein soll. Als ich es mit Notepad geöffnet habe, bemerkte ich, dass es sich um die Quelldatei der Seite "Meine Login -URL" handelt. Wohin gehe ich falsch?

Gibt es eine Eigenschaft von WebClient, mit der ich den Fehler sehen kann. IE .. Basisadresse usw.?

War es hilfreich?

Lösung

Lassen Sie uns die Dinge einfacher machen, sollen wir:

public class CookiesAwareWebClient : WebClient
{
    public CookieContainer CookieContainer { get; private set; }

    public CookiesAwareWebClient()
    {
        CookieContainer = new CookieContainer();
    }

    protected override WebRequest GetWebRequest(Uri address)
    {
        var request = base.GetWebRequest(address);
        ((HttpWebRequest)request).CookieContainer = CookieContainer;
        return request;
    }
}

class Program
{
    static void Main()
    {
        using (var client = new CookiesAwareWebClient())
        {
            var values = new NameValueCollection
            {
                { "userName", "user" },
                { "password", "password" },
                { "x", "0" }, // <- I doubt the server cares about the x position of where the user clicked on the image submit button :-)
                { "y", "0" }, // <- I doubt the server cares about the y position of where the user clicked on the image submit button :-)
                { "login", "login" },
            };

            // We authenticate first
            client.UploadValues("http://example.com/login", values);

            // Now we can download
            client.DownloadFile("http://example.com/abc.tgz", @"c:\abc.tgz");
        }
    }
}

Übrigens ist das Problem mit Ihrem Code, dass Sie das vom Server ausgegebene Authentifizierungs -Cookie nicht übergeben, wenn Sie die erste Anfrage an die zweite Anfrage gesendet haben, die auf eine geschützte Ressource zugreifen soll. Alles, was Sie übergeben, ist ein Inhaltstyp und kein Cookie und alles. Server wie Cookies :-)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top