[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


@InfoAbonneCanal Ça remarche, merci sauf la case à cocher pour retenir la conf. il faut remettre les sous titres à chaque épisode...

January 17, 2017 20:12

Hey bsr @InfoAbonneCanal, FYI depuis 3 jours, plus de sous titres sur la vost de l'application TV connectées​ Samsung ! Merci :-)

January 16, 2017 19:58

A Different Approach To #Test Your @ASPNET Core Application https://t.co/9kjb6NsG1t #dotnet #dotnetcore

January 13, 2017 17:07

Just found this task to generate a release not file at build time using #vsts and #tfs - really cool ! https://t.co/P5tBdRJRnM

January 13, 2017 15:17

RT @brendandburns: The state of Kubernetes in Azure Container Service https://t.co/eruqgVk35l And we're already working on polishing thos…

January 11, 2017 22:26

RT @docker_fr: RT: #Meetup @DockerParis 17/01 chez @venteprivee_fr@benjguin parle comparaison de sol. streaming #bigdata avec https://t.c

January 11, 2017 19:39

CI/CD with #Azure #Container Service and #Docker #Swarm https://t.co/C6ZtoaVNW7 #DevOps #VSTS

January 11, 2017 19:37

RT @rgardler: How to integrate a new Azure Container Service cluster into an existing virtual network using ACS Engine https://t.co/Sxk4h2q…

January 11, 2017 19:35

How to integrate a new @Azure #ContainerService cluster into an existing virtual network using #ACSEnginehttps://t.co/nxRqeVbgcC

January 10, 2017 14:10

RT @fdibot: Envie de comprendre pourquoi @Docker c'est le présent et l'avenir ? venez écouter @jcorioland, @wiboconsulting et moi même au #

January 10, 2017 09:20

#containerd - Core Container Runtime Project For The container Industry https://t.co/1czRFQwcLo

January 05, 2017 08:38

Deprecation of the Team Rooms in #TeamServices and #TFS https://t.co/w2I0tiXqQ7

January 05, 2017 08:02

#Docker Logs API Format Explained https://t.co/0AZEtalRiR

January 05, 2017 07:52

End-to-end cloud #experiences for developers at #Nodejs Interactive North America https://t.co/b8Nbte3i96

January 04, 2017 11:46

Should You Go ‘#Serverless’? The Pros and Cons https://t.co/dvxflKwT5f #Cloud #Architecture

January 03, 2017 08:40