[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


C'est bon ça !! >> MSBuild is going cross-platform with .NET Core! - http://t.co/BZuOmBxOP9

September 03, 2015 17:28

Developing #ASPNET 5 Web Apps with #VisualStudio #Code http://t.co/LexJhHbMlS

September 03, 2015 11:54

Announcing Availability of #ASPNET 5 Beta7 http://t.co/ADF7dkYSye

September 03, 2015 09:37

Announcing the Biggest VM Sizes Available in the #Cloud: New #Azure GS-VM Series http://t.co/EEF0CRWfPX

September 03, 2015 08:21

How Different Team Topologies Influence #DevOps Culture http://t.co/9qbuJyIBf0

September 02, 2015 17:28

An introduction to immutable infrastructure http://t.co/tmF9ntEqjP #DevOps

September 02, 2015 15:16

Immutable Infrastructure and Containers http://t.co/8EImSCPtzS #DevOps

September 02, 2015 13:17

Cloud, frozen pizza model and the immutable infrastructure http://t.co/OoaDtiq0oj #DevOps

September 02, 2015 12:01

Trash Your Servers and Burn Your Code: Immutable Infrastructure and Disposable Components http://t.co/g5LLgPvxy2 #DevOps

September 02, 2015 11:54

Amazon, Netflix, Google, Microsoft, Mozilla And Others Partner To Create Next-Gen Video Format http://t.co/mtfx6irVGE

September 02, 2015 09:37

Release Management vNext Plans http://t.co/da6TLhKNdX #VisualStudio #DevOps #VSO

September 02, 2015 08:21

#Microsoft announces new #Azure #ResourceManager SDKs (in preview) for #Java, #Python, #Go and #Ruby ! http://t.co/dxbpRh6q4p

September 02, 2015 07:01

#ContinuousDelivery - the missing parts http://t.co/QHg13iToLg #NDC2015

September 01, 2015 09:37

Demo: #Mesos Running a Single Cluster of #Linux and #Windows Machines http://t.co/YNiQbH33X5

September 01, 2015 08:21

Dino Esposito on CQRS, Messages and Events http://t.co/Vx1HDZvYxW

September 01, 2015 07:01