[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


#Kubernetes for Edge Computing: The Microsoft #Azure Approach https://t.co/D6pGrqIBKm

May 25, 2018 05:52

#Azure the cloud for all – highlights from Microsoft BUILD 2018 https://t.co/TH5poYxV0D

May 25, 2018 05:44

RT @satyanadella: @EmmanuelMacron Honored to join the #TechforGood Summit with @EmmanuelMacron. Collectively we have a responsibility to en…

May 23, 2018 15:44

@IOI__655321 @StravaSupport It would be nice if the sync was working all the time and does not take 5+ hours to app… https://t.co/YFOaVCMNRS

May 20, 2018 15:41

RT @brendandburns: More container wisdom from @jessfraz This time in multitenant kubernetes! Really great stuff. https://t.co/Y8xD3qWnVO

May 19, 2018 06:40

RT @Tyriar: VS @code tip: Turn VS Code into a quick notepad with highlighting by adding `"files.defaultLanguage": "markdown"` to your setti…

May 18, 2018 13:45

RT @brendandburns: Great article on how @azure is delivering on the vision of an intelligent edge for IoT via containers, kubernetes and th…

May 17, 2018 06:27

This is really awesome. #SurfaceHub2 https://t.co/HOhrMcRBBp

May 15, 2018 17:05

@benjiiim WOW!

May 15, 2018 17:03

#Azure confidential computing https://t.co/gSuQekTNrb

May 15, 2018 17:03

Azure #Kubernetes Service now has built-in http ingress application routing using #Azure DNS Zone -> https://t.co/tXuAC0cMEa

May 14, 2018 09:01

@lamouetterieuse Ce n'est pas avec docker compose mais il y a une notion de container group avec ACI: https://t.co/G4GLsfjGKP

May 11, 2018 19:57

#Azure SignalR Service, a fully-managed service to add real-time functionality https://t.co/wLiDQveigC

May 11, 2018 17:28

Virtual Network Service Endpoints for Azure #CosmosDB is now generally available https://t.co/ahJT2KnimD

May 11, 2018 16:18

Multi-container on #Azure #Linux Web App, w/ #docker compose and #Kubernetes manifests support! https://t.co/p4tiCPFH67

May 11, 2018 14:40