WebRequest suit réoriente sans intervention de l'utilisateur, donc si les redirections utilisent 301/302 codes d'état les commandes suivantes vont travailler
WebRequest request = WebRequest.Create(destination);
WebResponse response = request.GetResponse();
Console.WriteLine(response.ResponseUri);
Si les redirections sont créés en utilisant javascript ou balises meta http-equiv vous » re faire d'avoir à analyser la page et chercher ceux-ci. Le pack d'agilité HTML est probablement le meilleur moyen de le faire.
Pour prendre un peu plus loin ce qui suit est une classe qui résoudra manuellement les principaux codes d'état de redirection HTTP, la construction d'une histoire comme il va
/// <summary>
/// Digs through HTTP redirects until a non-redirected URL is found.
/// </summary>
public class Digger
{
/// <summary>
/// Initializes a new instance of the <see cref="Digger"/> class.
/// </summary>
public Digger() : this(20)
{
}
/// <summary>
/// Initializes a new instance of the <see cref="Digger"/> class.
/// </summary>
/// <param name="maximumDepth">The maximum depth of redirects to parse.</param>
public Digger(int maximumDepth)
{
this.MaximumDepth = maximumDepth;
}
/// <summary>
/// Gets the maximum depth of redirects to parse.
/// </summary>
/// <value>The maximum depth of redirects to parse.</value>
public int MaximumDepth
{
get;
private set;
}
/// <summary>
/// Resolves any redirects at the specified URI.
/// </summary>
/// <param name="destination">The initial URI.</param>
/// <returns>The URI after resolving any HTTP redirects.</returns>
public Uri Resolve(Uri destination)
{
List<Uri> redirectHistory = new List<Uri>();
return this.Resolve(destination, redirectHistory);
}
/// <summary>
/// Resolves any redirects at the specified URI.
/// </summary>
/// <param name="destination">The initial URI.</param>
/// <param name="redirectHistory">A collection of <see cref="Uri"/> objects representing the redirect history.</param>
/// <returns>The URI after resolving any HTTP redirects.</returns>
public Uri Resolve(Uri destination, ICollection<Uri> redirectHistory)
{
redirectHistory.Add(destination);
return this.Resolve(destination, this.MaximumDepth, redirectHistory);
}
/// <summary>
/// Resolves any redirects at the specified URI.
/// </summary>
/// <param name="destination">The initial URI.</param>
/// <param name="hopsLeft">The maximum number of redirects left to follow.</param>
/// <param name="redirectHistory">A collection of <see cref="Uri"/> objects representing the redirect history.</param>
/// <returns>The URI after resolving any HTTP redirects.</returns>
private Uri Resolve(Uri destination, int hopsLeft, ICollection<Uri> redirectHistory)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(destination);
request.AllowAutoRedirect = false;
request.Method = "HEAD";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Uri resolvedUri;
if (response.StatusCode == HttpStatusCode.Redirect ||
response.StatusCode == HttpStatusCode.Moved ||
response.StatusCode == HttpStatusCode.MovedPermanently)
{
if (hopsLeft > 0)
{
Uri redirectUri = new Uri(response.GetResponseHeader("Location"));
if (redirectHistory.Contains(redirectUri))
{
throw new Exception("Recursive redirection found");
}
redirectHistory.Add(redirectUri);
resolvedUri = this.Resolve(redirectUri, hopsLeft - 1, redirectHistory);
}
else
{
throw new Exception("Maximum redirect depth reached");
}
}
else
{
resolvedUri = response.ResponseUri;
}
return resolvedUri;
}
}
dépend de la façon la redirection fonctionne. Du côté serveur? Côté client (c'est-à-dire JS)? Essayez d'extraire l'URL avec tous les wrappers http que possède C#, et après tout 301s/302s. Si vous êtes chanceux, il pourrait même y avoir une bibliothèque pour le faire pour vous. Que faire si B redirige vers C? Voulez-vous stocker B ou C? Jusqu'où allez-vous suivre les redirections? Que faire si C redirige vers B? Assurez-vous d'éviter les boucles de redirection infinies en gardant une trace des adresses que vous avez visitées, ou en définissant une limite de redirection (ce qui est la manière dont Firefox/Chrome gère ce problème). –
Exemple côté serveur serait bien ... c'est juste un outil pour extraire des données (c'est-à-dire l'URL finale) donc ne doit pas être fantaisie ... peut être fait en aucune façon! "A" redirigera toujours vers "B" et il n'y a plus de redirection à venir de là-bas qui est un fait établi. –
Le code côté client ne fait pas trop mal ... Im en supposant qu'une application de formulaire de gain avec une instance de IE à l'intérieur devrait faire le travail ... juste pas sûr –