2009-03-31 11 views
7

Następujący kod kończy się niepowodzeniem z wyjątkiem 400 nieprawidłowych żądań. Moje połączenie sieciowe jest dobre i mogę przejść do witryny, ale nie mogę uzyskać tego uri z HttpWebRequest.Dlaczego moje żądanie HttpWebRequest Return 400 jest nieprawidłowe?

private void button3_Click(object sender, EventArgs e) 
{ 
    WebRequest req = HttpWebRequest.Create(@"http://www.youtube.com/"); 
    try 
    { 
     //returns a 400 bad request... Any ideas??? 
     WebResponse response = req.GetResponse(); 
    } 
    catch (WebException ex) 
    { 
     Log(ex.Message);     
    } 
} 
+0

czy jest to asp.net lub formularz Windows? – eglasius

Odpowiedz

13

Najpierw rzucił WebRequest do tak HttpWebRequest:

HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(@"http://www.youtube.com/"); 

Następnie dodaj ten wiersz kodu:

req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"; 
+0

To działa jak mistrz! – user74373

3

Może masz uruchomiony serwer proxy i nie ustawiłeś właściwości serwera proxy HttpWebRequest?

+0

Dobrze zgaduję. Jest to wewnętrzne dla proxy, który piszę. – user74373

4

Przyczyn tego problemu może być wiele. Czy masz więcej szczegółów na temat wyjątku WebException?

Jedną z przyczyn, które napotkałem wcześniej, jest zły ciąg agenta użytkownika. Niektóre witryny (na przykład Google) sprawdzają, czy żądania pochodzą od znanych agentów użytkownika, aby zapobiec atakom automatycznym na ich strony.

W rzeczywistości możesz sprawdzić, czy umowa użytkownika dla serwisu YouTube nie uniemożliwia wykonania tego, co robisz. Jeśli tak, to to, co robisz, może być lepiej zrealizowane, przechodząc przez zatwierdzone kanały, takie jak usługi internetowe.

5

Ustaw UserAgent i Referer w swojej HttpWebRequest :

var request = (HttpWebRequest)WebRequest.Create(@"http://www.youtube.com/"); 
request.Referer = "http://www.youtube.com/"; // optional 
request.UserAgent = 
    "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; WOW64; " + 
    "Trident/4.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; " + 
    ".NET CLR 3.5.21022; .NET CLR 3.5.30729; .NET CLR 3.0.30618; " + 
    "InfoPath.2; OfficeLiveConnector.1.3; OfficeLivePatch.0.0)"; 
try 
{ 
    var response = (HttpWebResponse)request.GetResponse(); 
    using (var reader = new StreamReader(response.GetResponseStream())) 
    { 
     var html = reader.ReadToEnd(); 
    } 
} 
catch (WebException ex) 
{ 
    Log(ex); 
} 
+0

Sugeruję, aby używał Debug.WriteLine (ex.ToString()), więc otrzymuje cały wyjątek, a nie tylko wiadomość. –

+0

@John, który sprawia, że ​​sence –

Powiązane problemy