[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


Windows 9 Preview Could Feature Rapid Build Updates - http://t.co/GvgX89xFEv

August 23, 2014 13:17

ScottGu's Blog - #Azure: New #DocumentDB #NoSQL Service, New #Search Service, New SQL AlwaysOn VM Template, and more http://t.co/24NmhsCXm9

August 23, 2014 12:01

50 Things #Cortana Can Do Right Now (Compared To Siri and Google Now) http://t.co/a2h030E2pV

August 23, 2014 09:54

#ASPNET #vNext - Alpha3 http://t.co/Tow4mWUU6u

August 23, 2014 08:37

#Microsoft #Azure #CloudServices Part 3: Service Package - Just Azure http://t.co/iroXgCfSPr

August 23, 2014 07:21

Getting Started With #Microsoft #Azure #Search - Just Azure http://t.co/NR5qAl7KFW

August 23, 2014 07:01

#ASPNET #vNext in #VisualStudio 14 CTP 3 : http://t.co/MfSZlJ72Gs

August 22, 2014 16:28

Deep Dive: #Azure #Websites and Organizational Authentication using Azure AD : http://t.co/un15sFzCzd #WAAD

August 22, 2014 15:16

RT @lingohub: lingohub Daily is out! http://t.co/Fq4VupyvlL Stories via @ClydeMandelin @jcorioland @lingohub

August 20, 2014 18:51

Parametrized Localization in ASPNET http://t.co/a075DrhZLB

August 18, 2014 16:28

Creating Custom #AngularJS Directives Part 3 - Isolate Scope and Function Parameters http://t.co/SVEVyLxHZh

August 18, 2014 15:16

Scripts-to-Tools: Auto-provisioning #Azure Virtual Networks with #PowerShell and XML - http://t.co/7BHjy0IdOT

August 16, 2014 08:37

@CloudExpo | Migrating Apps to the #Cloud - http://t.co/5UOtM6Oo6M

August 16, 2014 07:21

Renowned Security Expert Kevin Mitnick Can Steal Your Identity In Three Minutes - http://t.co/BJxwnRj1Yq

August 16, 2014 07:01

Building #Cloud Based Games – A look into how they did it with Wordament - http://t.co/MTy8wimXtx

August 15, 2014 16:28