67 votes

Comment transformer une URL relative en une URL complète ?

Cela s'explique sans doute plus facilement avec un exemple. J'essaie de trouver un moyen de transformer une URL relative, par exemple "/Foo.aspx" ou "~/Foo.aspx" en une URL complète, par exemple http://localhost/Foo.aspx . De cette façon, lorsque je déploie le site pour le tester ou le mettre à l'essai et que le domaine sous lequel le site fonctionne est différent, j'obtiendrai les résultats suivants http://test/Foo.aspx et http://stage/Foo.aspx .

Des idées ?

0 votes

61voto

Oli Points 65050

Jouez avec ceci (modifié) d'ici )

public string ConvertRelativeUrlToAbsoluteUrl(string relativeUrl) {
    return string.Format("http{0}://{1}{2}",
        (Request.IsSecureConnection) ? "s" : "", 
        Request.Url.Host,
        Page.ResolveUrl(relativeUrl)
    );
}

5 votes

J'espérais qu'il y avait quelque chose d'intégré à ASP.NET pour ne pas avoir à se lancer dans la recherche de protocoles, de ports, etc. mais cela devrait faire l'affaire.

7 votes

Remarque : Lorsque j'ai utilisé cette méthode, j'ai ajouté Request.URL.Port entre l'hôte et l'url de la page pour que cela fonctionne sur le serveur de test de Visual Web Dev.

0 votes

@roviuser Cela n'a rien à voir avec MVC. C'est juste une fonction utilitaire, alors mettez-la où vous voulez.

39voto

Josh M. Points 9330

Cette question a déjà été traitée à mort, mais j'ai pensé poster ma propre solution qui, à mon avis, est plus propre que la plupart des autres réponses.

public static string AbsoluteAction(this UrlHelper url, string actionName, string controllerName, object routeValues)
{
    return url.Action(actionName, controllerName, routeValues, url.RequestContext.HttpContext.Request.Url.Scheme);
}

public static string AbsoluteContent(this UrlHelper url, string path)
{
    Uri uri = new Uri(path, UriKind.RelativeOrAbsolute);

    //If the URI is not already absolute, rebuild it based on the current request.
    if (!uri.IsAbsoluteUri)
    {
        Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
        UriBuilder builder = new UriBuilder(requestUrl.Scheme, requestUrl.Host, requestUrl.Port);

        builder.Path = VirtualPathUtility.ToAbsolute(path);
        uri = builder.Uri;
    }

    return uri.ToString();
}

1 votes

Ces méthodes sont géniales. Merci beaucoup ! Superbe extension. J'en ai essayé une autre semblable, mais celle-ci est beaucoup plus propre, et j'aime beaucoup mieux enchaîner les choses. Merci.

2 votes

J'ai trouvé ceci. Merci. J'ai ajouté une légère modification qui permet d'éviter le schéma URl codé en dur : code return url.Action(actionName, controllerName, routeValues, url.RequestContext.HttpContext.Request.Url.Scheme) ; code

0 votes

@LSU.Net : Ajout de votre changement. Je pense que c'est comme ça que je l'ai dans ma réserve de code personnelle aussi.

37voto

Marcus Points 131

Il vous suffit de créer un nouvel URI en utilisant la fonction page.request.url et ensuite obtenir le AbsoluteUri de cela :

New System.Uri(Page.Request.Url, "Foo.aspx").AbsoluteUri

0 votes

Cela semble brillant dans sa simplicité, mais est-ce que les Request.Url inclut généralement le nom de la page déjà demandée ? Pourquoi le OldFoo.aspx entrer en collision avec Foo.aspx ? (c'est-à-dire : est-ce que new Uri() suppression de l'URI de base avant de le combiner avec la partie relative ?)

5 votes

@ebyrob Le constructeur Uri(Uri, string) enlève toute partie relative du premier paramètre et la combine ensuite avec le deuxième paramètre. Les documents MSDN sur Constructeur d'Uri ne sont pas claires, mais cela test de violon vérifie le comportement.

5voto

StocksR Points 668

Voici ma fonction d'aide pour faire cela

public string GetFullUrl(string relativeUrl) {
    string root = Request.Url.GetLeftPart(UriPartial.Authority);
    return root + Page.ResolveUrl("~/" + relativeUrl) ;
}

2 votes

Est-ce que cela fonctionne toujours pour vous en ASP.net 4.0 ? J'ai une approche similaire et j'obtiens l'IP du serveur comme Root, au lieu du domaine. Comment cela se fait-il ?

4voto

stucampbell Points 1653

J'ai pensé que je pourrais partager mon approche pour faire cela dans ASP.NET MVC en utilisant la fonction Uri et un peu de magie d'extension.

public static class UrlHelperExtensions
{
    public static string AbsolutePath(this UrlHelper urlHelper, 
                                      string relativePath)
    {
        return new Uri(urlHelper.RequestContext.HttpContext.Request.Url,
                       relativePath).ToString();
    }
}

Vous pouvez ensuite produire un chemin absolu en utilisant :

// gives absolute path, e.g. https://example.com/customers
Url.AbsolutePath(Url.Action("Index", "Customers"));

Le fait d'avoir des appels de méthodes imbriqués est un peu laid, c'est pourquoi je préfère étendre encore plus la méthode UrlHelper avec des méthodes d'action communes pour que je puisse le faire :

// gives absolute path, e.g. https://example.com/customers
Url.AbsoluteAction("Index", "Customers");

ou

Url.AbsoluteAction("Details", "Customers", new{id = 123});

La classe d'extension complète est la suivante :

public static class UrlHelperExtensions
{
    public static string AbsolutePath(this UrlHelper urlHelper, 
                                      string relativePath)
    {
        return new Uri(urlHelper.RequestContext.HttpContext.Request.Url,
                       relativePath).ToString();
    }

    public static string AbsoluteAction(this UrlHelper urlHelper, 
                                        string actionName, 
                                        string controllerName)
    {
        return AbsolutePath(urlHelper, 
                            urlHelper.Action(actionName, controllerName));
    }

    public static string AbsoluteAction(this UrlHelper urlHelper, 
                                        string actionName, 
                                        string controllerName, 
                                        object routeValues)
    {
        return AbsolutePath(urlHelper, 
                            urlHelper.Action(actionName, 
                                             controllerName, routeValues));
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X