[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


RT @sitepointdotcom: .@deltakosh Uses Closure Space to Create Real Private Members in JavaScript http://t.co/fYUUqrdtiV

April 27, 2015 05:48

Article: Randy Shoup and Andrew Phillips Answer Questions on #Microservices - http://t.co/BnOLKKxprB

April 26, 2015 13:54

RT @MCKLMT: How #AzureSearch can be improved? Vote on this uservoice! http://t.co/Xh6lqS4nOi #Azure

April 26, 2015 13:22

Check out our open source software projects at #Build 2015! - http://t.co/OLbZOAeTdp #oss

April 26, 2015 11:37

Mary Poppendieck Discusses Containers, Microservices and Contract Tests - http://t.co/T6MnuY3wWP

April 26, 2015 09:21

Les démos de ma session archi distribuée avec #Azure #WebApp #WebJob et #Service bus dispo ici http://t.co/SWdwi6A7Nu #GlobalAzure #Paris

April 26, 2015 08:01

RT @NeowinFeed: Visual Studio 2015 RC page goes live, announcement likely coming next week http://t.co/dJ68unKrGt http://t.co/5qAFVSJrMF

April 26, 2015 07:57

@preguntoncabron Hey, the full source code of my demos is here https://t.co/4BofHBqJ1o #GlobalAzure

April 26, 2015 07:35

Les slides de ma session archi distribuée avec #Azure #WebApp #WebJob et #Service bus dispo ici: http://t.co/f92ecBa2HP #GlobalAzure #Paris

April 25, 2015 20:28

The Best Of #Microsoft + #OpenSource: #Java On #Azure - http://t.co/A7g1P8DIDz #OSS

April 25, 2015 19:16

RT @ZeCloud: Ca bosse fort la @jcorioland le lab racing Game au #globalazure bootcamp Paris http://t.co/uorLHP7D9V

April 25, 2015 15:12

GAB Racing Game lab for #Paris: http://t.co/XpHvrdOcnD #globalazure

April 25, 2015 14:46

La télémétrie et la supervision dans #Azure c'est simple, avec #AppInsights ! #GlobalAzure #Paris @michelhubert http://t.co/zCfhJuUusN

April 25, 2015 13:01

RT @MCKLMT: Cloud computing et scalabilité dans le monde eCommerce par @MichelHubert au #GlobalAzure Bootcamp #Paris http://t.co/SHprFaqBnD

April 25, 2015 12:28

@aymericw fait monter la température au #GlobalAzure bootcamp ! #IoT #EventHub http://t.co/Aao77WXIEY

April 25, 2015 11:55