2010-03-29 5 views
8

Próbuję ustalić, czy kwalifikacje istnieje na http://www.accreditedqualifications.org.uk w postaci:C# wykryć strona przekierować

http://www.accreditedqualifications.org.uk/qualification/50084811.seo.aspx

50084811 jest kwalifikacja Celem wprowadzonych przez użytkownika końcowego.

Jeśli wprowadzą nieprawidłowy numer, np.

http://www.accreditedqualifications.org.uk/qualification/50084911.seo.aspx

zostaje przekierowany na stronę błędu (z błędnych nagłówków miarę widzę). Czy istnieje sposób, aby wykryć przekierowanie w C#. Mam nadzieję, że będę w stanie wykryć przekierowanie w nagłówkach http (myśląc, że wyda 2) lub coś podobnego, co sprzeciwia się konieczności pobrania całej strony. To może się dziać bardzo często, dlatego chciałbym zminimalizować ruch.

Edit

użył tego, aby spojrzeć na nagłówki wygląda dwa są wydawane na nieprawidłowym stronie:

http://pageheaders.com/display-http-headers.php?url=http%3A%2F%2Fwww.accreditedqualifications.org.uk%2Fqualification%2F50084911.seo.aspx&agent=ie6

Odpowiedz

12

Najprostszym sposobem jest prawdopodobnie pobierać zawartość za pomocą Żądanie HEAD (ustaw Method na "HEAD") w HttpWebRequest z ustawieniem AllowAutoRedirect na false. Nie pamiętam od razu, czy spowoduje to wyjątek, czy nie, ale tak czy inaczej powinno być łatwe w obsłudze.

+0

Znaleziony to http://stackoverflow.com/questions/924679/c-how-can-i-check-if-a-url-exists-is-valid myślę, że wzdłuż odpowiednich linii, ale ponieważ na stronie nie ma wydania 404 lub podobnego, nie działa. Będę dalej eksperymentować. – PeteT

+0

@ petebob796: Używanie 'WebClient' może nie zapewniać wystarczającej kontroli. W szczególności nie pozwala ci wyłączyć automatycznego przekierowania (o ile widzę). Użyj HttpWebRequest i spójrz na kod odpowiedzi. 301 i 302 to normalne kody odpowiedzi przekierowania. –

+0

Dzięki posortowane teraz przy użyciu HttpWebRequest i HttpWebResponse wraz z request.AllowAutoRedirect = false; i request.Method = "HEAD" ;. Dla każdego, kto czyta, zostałem złapany przez StatusCode przez sekundę, zwróciło "OK", "NIE ZNALEZIONO" ... ale jest to wyliczenie i może zostać rzucone do rzeczywistego błędu 301, 302 ... – PeteT

0

Możesz to zrobić tylko za pomocą klienta internetowego z serwera. Jeśli podasz link do swojego klienta, nie będziesz w części w komunikacji między nim a akredytowanym serwerem kwalifikacjiweb, a tym samym nie będziesz w stanie uzyskać informacji, że link został przekierowany do błędu.

O ile rozumiem twój projekt, wykonam połączenie przy użyciu klienta WebClient (lub dowolnego innego) z mojego serwera, aby upewnić się, że istnieje kwalifikacja i zapisać wynik w bazie danych z czasem buforowania. Pozwoli to nie wykonywać zbyt wielu połączeń i uzyskać wiarygodne informacje.

+0

To jest w rzeczywistości projekt WinForm, a nie Asp.net Po prostu muszę sprawdzić, czy cel, który wprowadzili, jest ważny na podstawie tego, że jest na stronie. – PeteT

10

Istnieje wiele różnych kodów, które można zwrócić. Można sprawdzić różne kody a la:

response.StatusCode == HttpStatusCode.Redirect 

można zobaczyć wszystkie możliwości w http://msdn.microsoft.com/en-us/library/system.net.httpstatuscode.aspx

Alternatywnie, może się okazać, że wystarczy, aby sprawdzić, czy lokalizacja w odpowiedzi jest inny.

var request = (HttpWebRequest)WebRequest.Create(uri); 
request.Method = "HEAD"; 
request.AllowAutoRedirect = false; 

string location; 
using (var response = request.GetResponse() as HttpWebResponse) 
{ 
    location = response.GetResponseHeader("Location"); 
} 
return (location != uri.OriginalString);