[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


#WebJobs goes into full production!! - http://t.co/6Jhxi7Yu2S #Azure

October 23, 2014 08:37

Asynchronously Bootstrapping #AngularJS Applications with Server-Side Data - http://t.co/d17G8AhpPm

October 23, 2014 07:21

MYO kezako ? - http://t.co/P9Nax1YLNX

October 23, 2014 07:01

We’re rolling out our first new build to the Windows Insider Program http://t.co/50a9HukJIO

October 22, 2014 08:37

#Microsoft launches #Azure cloud in a box - http://t.co/GwTtXBEhBL

October 22, 2014 07:21

#Azure’s getting bigger, faster and more open - http://t.co/IOx2506dFF

October 22, 2014 07:01

Mobile Apps for Web Developers : http://t.co/hZwoshOdYd #Cordova

October 21, 2014 07:01

Microsoft #Azure #ActiveDirectory – Part 2 (MFA) - http://t.co/D6MgZabOht

October 20, 2014 07:21

How to Disable SSL 3.0 in #Azure Websites, Roles, and Virtual Machines - http://t.co/zjCof87oRD

October 20, 2014 07:01

RT @MVPAward: Develop a blog using ASPNET vNext, Azure, DocumentDB and Search services from http://t.co/k8a0opUeI0 MVP @jcorioland http://t…

October 17, 2014 21:20

Statya Nadella's talk about what's next for #Microsoft's #cloud on October 20 will be webcast live : http://t.co/leXa7TVC3k

October 17, 2014 09:54

It's also possible to use #Azure #DocumentDB in a #MobileService. Here is an how-to : http://t.co/8U4OC8srpq

October 17, 2014 08:37

Did you know you can use #Azure to send push notifications to mobile devices, including #iOS ? http://t.co/HTkDRvDBiU

October 17, 2014 07:21

#Microsoft announces #VS2013 update 4 RC with a lot of new cool stuff for #aspnet and #azure #website : http://t.co/LkJTUP6lqm, try it now !

October 17, 2014 07:01

#Azure #ActiveDirectory Part 1: An Introduction : http://t.co/5tJ6aJB5hR

October 16, 2014 07:01