[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


Voilà les slides de ma keynote #Microsoft lors de @ContainerDay16 aujourd'hui : https://t.co/Lys4Ocmrgg #Azure #Docker #Windows #Linux

June 29, 2016 20:08

Et merci @jlrigau pour l'invitation ! :) https://t.co/6gSmALVAi9

June 29, 2016 18:11

Super journée à @ContainerDay16 ! Super sessions & rencontres! Bravo à l'équipe @XebiaFr et merci aux sponsors! See you next year? ;)

June 29, 2016 17:28

Microservices avec #Azure ! @ContainerDay16 @cellenza @MichelHubert https://t.co/Rsh5pAsKNq

June 29, 2016 14:36

RT @jlrigau: Création d'un cluster Swarm en quelques clics par @jcorioland sur Azure Container Servive au @ContainerDay16 https://t.co/4TCg…

June 29, 2016 09:27

RT @jlrigau: "Microsoft Azure ❤️ Linux" by @jcorioland at @ContainerDay16 https://t.co/7dRrJhZO2v

June 29, 2016 09:27

Use the power and simplicity of #containers to tame your IT - https://t.co/yq7ZTdToDw #Docker #Mesosphere #Azure

June 29, 2016 04:37

.@Docker 1.12 with native #Swarm orchestration is really awesome! https://t.co/40jzI0A4OM

June 28, 2016 12:52

Migrate your Web/Worker roles to #ServiceFabric stateless services https://t.co/5VAjq65E6M #Azure #Cloud #architecture

June 28, 2016 12:33

The differences between #Cloud Services and #ServiceFabric before migrating applications: https://t.co/ZtHyqPQ1l3 #Azure #architecture

June 28, 2016 12:30

#DevOps: Continuons Deployment/Delivery with @jenkinsci and @VSTeam Services https://t.co/hJyNBieOuK

June 28, 2016 11:33

.NET Core 1.0 is now released! https://t.co/fWLvyV0GIa #dotnet #dotnetcore

June 28, 2016 08:57

.@ContainerDay16 c'est demain! Rdv à 10h15 pour la keynote Microsoft. J'y parlerai #Linux, #Azure et #Windows ! https://t.co/fMZboCeBGD

June 28, 2016 08:00

RT @markrussinovich: You can start playing with Service Fabric on Linux by signing up for the private preview here: https://t.co/zimHPNpn87

June 28, 2016 07:05

RT @markrussinovich: DockerCon keynotes are posted, including my Docker Datacenter+Azure+VSCode+VSTS+Azure Stack+SQL on Linux demo https://…

June 28, 2016 07:05