[ASPNET MVC] Génération d’URL absolue dans un environnement Windows Azure

April 09, 2013 -

C’est assez fréquent d’avoir à générer des URLs absolues dans une application ASP.NET MVC.

cela, il est possible de faire appel à l’UrlHelper, disponible sur n’importe quelle page ou n’importe quel contrôleur, via la propriété “Url” :

@Url.Action("About", "Home", null, "http")

Si vous êtes sur un applicatif ayant un seul frontal web, aucun problème l’url qui sera générée sera complètement exploitable. Par contre, dès lors que vous serez sur un applicatif hébergée dans une ferme derrière un NLB, vous récupèrerez l’adresse de la machine (IP + port) et non le DNS qui va bien pour contacter votre site. Le code ci-dessus executé dans la fabrique Azure locale donne :

image

Bien que l’on appelle l’adresse sur le port 81 (NLB de la fabrique locale) on récupère bien une URL sur le port 82 !

Pour corriger ce problème, il faut générer l’URL relative en utilisant l’UrlHelper, puis se baser sur le Host header de la requête http courante pour récupérer la bonne adresse. Aussi, il est possible de créer des méthodes d’extensions à l’UrlHelper pour faire cela :

public static class UrlHelperExtensions
{
    public static string ToAzureComplientAbsoluteUrl(this UrlHelper helper, string action, string controller)
    {
        return helper.ToAzureComplientAbsoluteUrl(action, controller, null);
    }

    public static string ToAzureComplientAbsoluteUrl(this UrlHelper helper, string action, string controller, object routeValues)
    {
        var relativeUrl = helper.Action(action, controller, routeValues);
        var host = helper.RequestContext.HttpContext.Request.Headers["Host"];
        var scheme = helper.RequestContext.HttpContext.Request.Url.Scheme;

        return string.Format("{0}://{1}{2}", scheme, host, relativeUrl);
    }
}

Du coup, il est possible de l’utiliser de la manière suivante :

@Url.ToAzureComplientAbsoluteUrl("About", "Home")

Et voilà le résultat :

image

A présent, plus de problème !

Enjoy Smile

Julien

Comments

Share

Tags


Twitter


.@FredericWickert nous présente une archi full #PaaS dans @Azure ! @ArollaFr https://t.co/saXb2JsUAu

December 06, 2016 20:54

#Jenkins pipeline continuous deployment of a #Java application in @Azure #AppService w/ @jpbriend https://t.co/jpVEfd1MwE

December 06, 2016 20:07

What’s new upcoming in #Docker #Compose v1.9.0? https://t.co/ME15cFHHAh

December 06, 2016 08:30

#howto -> NoSQL #dotnetcore development using an local @Azure DocumentDB Emulator https://t.co/sJpwzIiymP

December 05, 2016 18:37

Want to know more about #VisualStudio #MobileCenter? Check this new @CloudCoverShow episode! https://t.co/3hVZ0tk7Bz

December 05, 2016 18:36

A #Kafka connector is now available for @Azure #IoT Hub https://t.co/pDWKuWizoo

December 05, 2016 18:33

Running #Azure "Functions Locally with the CLI and VS @Code https://t.co/7nou4YYAUm #serverless

December 05, 2016 18:31

Yey! #VisualStudio Tools for @Azure #Functions!! https://t.co/E5DaIs4jJb

December 01, 2016 19:45

From “A PC on every desktop” to “Deep Learning in every software” https://t.co/8mOOdjO9kM

December 01, 2016 08:44

Full CI/CD pipeline with @Docker #Swarm on #Azure #ContainerService #DevOps @VSTeam https://t.co/UHeBBxSaHz

November 30, 2016 20:50

@sandayuu thanks ;-)

November 30, 2016 06:37

@lamouetterieuse ni l'un ni l'autre :)

November 29, 2016 19:08

Just blogged: full CI/CD pipeline to deploy a multi-containers application on @Azure #ContainerService with #VSTShttps://t.co/PEAxL13eRf

November 29, 2016 18:16

Announcing #Azure #DevTest Labs support for creating environment with ARM templates https://t.co/AzCCuRZSqZ

November 29, 2016 09:52

Les conteneurs @Docker sous #Windows, accélérateurs de votre démarche #DevOps https://t.co/QecTyHY1hc

November 28, 2016 12:16