[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


Encore des doutes sur les sessions à aller voir lors des Microsoft #experiences ? https://t.co/Hrym1Lufbf https://t.co/q1QkfI84NU

September 30, 2016 14:30

Atelier #craftmanship et #Docker sous Windows à ne pas manquer lors de Microsoft #experiences ->… https://t.co/TeMZWnVSDj

September 30, 2016 08:30

Microsoft #experiences'16 - découvrez le parcours Data & IoT https://t.co/kNJRdAIlRA

September 28, 2016 16:30

Vous voulez y voir plus clair sur la #BlockChain ? Suivez la BlockChain Hackademy lors de Microsoft #experienceshttps://t.co/sSzIDOrOOx

September 28, 2016 15:30

Des doutes sur la capacité d'#Azure à accueillir des technologies open source ? https://t.co/zGB9kE4ka5 @benjiiimhttps://t.co/RIxIZubv3a

September 28, 2016 09:00

Join @shanselman speaking about the Microsoft’s 15 years journey on .NET ! https://t.co/HqYQrhrOM9 #dotnethttps://t.co/SpZ2g4wBp6

September 27, 2016 16:00

#DevOps, #NoOps, everything-as-code, commoditisation. Quel futur pour les #ops ? https://t.co/uIpjsl3Dm6 @adrienblind @patcito #experiences

September 27, 2016 09:00

Docker & DevOps : adopter les mêmes pratiques sous #Windows et sous #Linux https://t.co/vixudq72h0 @treeptik #devopsdday

September 27, 2016 08:47

Finalisation de notre session #aspnet core pour Microsoft #experiences ! https://t.co/DOwuXI9il3 @benjiiimhttps://t.co/DnMw2FyVxR

September 27, 2016 07:20

Microsoft CEO Satya Nadella on how #AI will transform his company https://t.co/kQ7snrxpaV

September 27, 2016 04:28

Announcing @Azure Command-Line Interface (Azure CLI) 2.0 Preview https://t.co/UfXH6FTC73 #AzureCLI

September 26, 2016 20:49

@asiffermann des news de KeyVault :) https://t.co/PBmbLjVPu7

September 26, 2016 20:11

#Cloud innovations empowering IT for business transformation https://t.co/n0vylJAavj #Azure #Hybrid #HyperScale #EnterpriseGrade

September 26, 2016 20:11

Announcing the public preview of #Azure Monitor https://t.co/lutbdfd1Ne

September 26, 2016 20:06

#Microsoft and #Docker offer supported Docker Engine to #WindowsServer 2016 customers https://t.co/JnXqgkaDao

September 26, 2016 19:51