[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


.NET Core Open Source Update - February 26, 2015 - http://t.co/IumcRBUMGA

February 27, 2015 13:01

Update for #OneDrive app for #WindowsPhone brings a few new features - http://t.co/Lgyw2VOMgi

February 27, 2015 10:54

#Docker support in #Azure ! Sunny and Swarmy in Azure - http://t.co/aF6Puxzdle

February 27, 2015 09:37

Using #Azure #MediaServices streaming video with DashJS player - http://t.co/wWi9YuvXS2

February 26, 2015 09:37

Identity Updates for Web Developers in Visual Studio 2015 CTP6 - http://t.co/qEXw0ywwXc #aspnet

February 26, 2015 08:21

Limit the exposure of sensitive data in #Azure #SQLDatabase using Dynamic Data Masking - http://t.co/MShrGepdE0

February 26, 2015 08:01

#AngularJS: Pourquoi il ne faut pas utiliser ngCloak ? - http://t.co/lVCLsT1HT2

February 25, 2015 16:16

#Azure Blob #Storage Part 7: Snapshots - http://t.co/KmrQfmH3Ta

February 25, 2015 09:37

Cool :) Pointer Events is now a W3C Standard - http://t.co/Rn0UxBMcSD

February 25, 2015 08:21

Fix for blob trigger -> Announcing the 1.0.1-alpha preview of #Microsoft #Azure #WebJobs SDK - http://t.co/Oan1yDXUj9

February 25, 2015 08:01

RT @VisualStudio: What’s new in Babylon.js v2.0 you ask? http://t.co/csoYv7PVsd http://t.co/9egkm9lx06

February 24, 2015 21:17

RT @msdev_fr: Bonne soirée :) #devlife http://t.co/iH6Mz3qQhW

February 24, 2015 20:50

#MustRead: Introducing #ASPNET 5 - http://t.co/5DOrUs5O7l

February 24, 2015 09:37

New CTPs available -> #VS 2015 CTP6 and #TFS 2015 CTP1 shipped today - http://t.co/tCjEhOBDo9

February 24, 2015 08:21

Interesting reading -> #Windows shapes the world’s languages - http://t.co/7NGz2qNyg7

February 24, 2015 08:01