2010-03-29 3 views
8

Sto cercando di determinare se una qualifica esiste http://www.accreditedqualifications.org.uk nella forma:C# rilevano pagina di reindirizzamento

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

50084811 essere una qualifica scopo da entrato da parte dell'utente finale.

Se entrano in uno non valido, ad es.

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

Essi vengono reindirizzati a una pagina di errore (con intestazioni HTTP non corrette, per quanto posso vedere). C'è un modo per rilevare il reindirizzamento in C#. Spero di essere in grado di rilevare il reindirizzamento nelle intestazioni http (pensando che emetterà 2) o simili in opposizione al dover scaricare l'intera pagina. Questo potrebbe accadere molto, quindi vorrei ridurre al minimo il traffico.

Modifica

usato questo per avere uno sguardo le intestazioni si presenta come due sono rilasciati per una pagina non valida:

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

risposta

12

Il modo più semplice è probabilmente quello di recuperare il contenuto utilizzando un Richiesta HEAD (impostare Method su "HEAD") in un HttpWebRequest dopo aver impostato AllowAutoRedirect su falso. Non riesco a ricordare se ciò causerà un'eccezione o meno, ma in ogni caso dovrebbe essere facile da gestire.

+0

Abbiamo trovato questo http://stackoverflow.com/questions/924679/c-how-can-i-check-if-a-url-exists-is-valid Penso che sia lungo le linee corrette, ma dal momento che il sito non emette un 404 o simili non funziona. Continuerò a sperimentare. – PeteT

+0

@ petebob796: l'utilizzo di 'WebClient' potrebbe non fornire un controllo sufficiente. In particolare, non ti permette di disattivare il reindirizzamento automatico (per quanto posso vedere). Utilizzare HttpWebRequest e osservare il codice di risposta. 301 e 302 sono i normali codici di risposta di reindirizzamento. –

+0

Grazie ordinati ora utilizzando HttpWebRequest e HttpWebResponse insieme a request.AllowAutoRedirect = false; e request.Method = "HEAD" ;. Per chiunque stia leggendo, per un secondo sono stato catturato dallo StatusCode, restituisce "OK", "NOT FOUND" ... ma è un enum e può essere lanciato sull'errore vero 301, 302 ... – PeteT

0

È possibile farlo utilizzando un client Web dal proprio server. Se fornisci il link al tuo cliente, non sarai in parte tra la comunicazione tra lui e il server qualificationsweb accreditato, e quindi non sarai in grado di ottenere l'informazione che il link è stato reindirizzato a un errore.

Per quanto riguarda il mio progetto, vorrei effettuare alcune chiamate utilizzando Webclient (o qualsiasi altra cosa) dal mio server per assicurarmi che la qualifica esista e memorizzi il risultato nel database con un tempo di buffering. Permetterebbe di non fare troppe chiamate e comunque ottenere informazioni affidabili.

+0

Questo è in realtà un progetto winforms non asp.net Ho solo bisogno di convalidare l'obiettivo che entrano è valido in base al fatto che sia sul sito. – PeteT

10

Esistono diversi codici che è possibile restituire. Si potrebbe verificare i vari codici a la:

response.StatusCode == HttpStatusCode.Redirect 

È possibile visualizzare tutte le possibilità a http://msdn.microsoft.com/en-us/library/system.net.httpstatuscode.aspx

In alternativa, si potrebbe trovare sufficienti per verificare se la posizione nella risposta è diversa.

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);