Comment puis-je obtenir L'URL de base de mon webapp ASP.NET MVC?

Comment puis-je déterminer rapidement ce QU'est L'URL racine pour mon ASP.NET MVC application? C'est-à-dire: si IIS est réglé pour signifier mon application à http://example.com/foo/bar , alors j'aimerais pouvoir obtenir cette URL d'une manière fiable qui n'implique pas de récupérer L'URL actuelle de la requête et de la découper d'une manière fragile qui casse si je redirige mon action.

la raison pour laquelle j'ai besoin de L'URL de base est que cette application web appelle un autre qui a besoin de la racine de l'appelant application web pour rappel fins.

255
demandé sur Benjamin Pollack 2009-08-17 17:47:41

20 réponses

si vous avez un objet Request disponible, vous pouvez utiliser:

string.Format("{0}://{1}{2}", Request.Url.Scheme, Request.Url.Authority, Url.Content("~"));

si elle n'est pas disponible, vous pouvez y accéder via le contexte:

var request = HttpContext.Current.Request
347
répondu tghw 2013-12-20 12:50:26

donc aucun de ceux énumérés ici n'a travaillé pour moi, mais en utilisant quelques-unes des réponses, j'ai obtenu quelque chose de travail:

public string GetBaseUrl()
{
    var request = HttpContext.Current.Request;
    var appUrl = HttpRuntime.AppDomainAppVirtualPath;

    if (appUrl != "/") 
        appUrl = "/" + appUrl;

    var baseUrl = string.Format("{0}://{1}{2}", request.Url.Scheme, request.Url.Authority, appUrl);

    return baseUrl;
}

mise à jour pour ASP.NET Core / MVC 6:

ASP.NET Core rend ce processus un peu plus douloureuses, surtout si vous êtes profondément dans votre code. Vous avez 2 options pour obtenir à la HttpContext

1) Passez-le de votre controller :

var model = new MyClass(HttpContext);

puis dans model :

private HttpContext currentContext;

public MyClass(HttpContext currentContext)
{
    this.currentContext = currentContext;
}

2) peut-être que le moyen le plus propre est de l'injecter dans votre classe, qui commence par Enregistrer les types dans votre Startup:

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddMvc();

    services.AddTransient<MyClass, MyClass>();
    services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}

alors faites-le injecter pour vous comme ceci:

private HttpContext currentContext;

public MyClass(IHttpContextAccessor httpContextAccessor)
{
    currentContext = httpContextAccessor.HttpContext;
}

dans tous les cas, voici la mise à jour pour .NET Core GetBaseUrl() :

public string GetBaseUrl()
{
    var request = currentContext.Request;

    var host = request.Host.ToUriComponent();

    var pathBase = request.PathBase.ToUriComponent();

    return $"{request.Scheme}://{host}{pathBase}";
}
86
répondu Serj Sagan 2017-03-17 00:07:08

Dans Le Code:

Url.Content("~/");

MVC3 Razor syntaxe:

@Url.Content("~/")
55
répondu mxasim 2012-05-03 15:32:54

peut-être est-ce une extension ou une modification des réponses postées ici, mais j'utilise simplement la ligne suivante et cela fonctionne:

Request.Url.GetLeftPart(UriPartial.Authority) + Url.Content("~")

quand mon chemin est: http://host/iis_foldername/controller/action

puis je reçois: http://host/iis_foldername/

36
répondu Bronek 2016-07-26 20:35:32

le truc avec la confiance sur IIS est que les fixations IIS peuvent être différentes de vos URLs publiques (WCF je vous regarde), surtout avec les machines de production multi-homed. J'ai tendance à me diriger vers l'utilisation de la configuration pour définir explicitement l'url "de base" à des fins externes, car cela a tendance à être un peu plus efficace que de l'extraire de l'objet de la requête.

24
répondu Wyatt Barnett 2009-08-17 15:17:59

l'extrait suivant fonctionne bien pour moi dans MVC4, et n'a pas besoin d'un HttpContext disponible:

System.Web.HttpRuntime.AppDomainAppVirtualPath
22
répondu user666142 2014-12-21 06:02:07

pour une URL de base absolue utilisez ceci. Fonctionne avec les protocoles HTTP et HTTPS.

new Uri(Request.Url, Url.Content("~"))
17
répondu arni 2013-12-29 20:22:27

il s'agit d'une conversion d'un asp.net propriété à MVC . C'est à peu près tout en chantant tout en dansant la méthode de l'url racine.

Déclarer une classe helper:

namespace MyTestProject.Helpers
{
    using System.Web;

    public static class PathHelper
    {
        public static string FullyQualifiedApplicationPath(HttpRequestBase httpRequestBase)
        {
            string appPath = string.Empty;

            if (httpRequestBase != null)
            {
                //Formatting the fully qualified website url/name
                appPath = string.Format("{0}://{1}{2}{3}",
                            httpRequestBase.Url.Scheme,
                            httpRequestBase.Url.Host,
                            httpRequestBase.Url.Port == 80 ? string.Empty : ":" + httpRequestBase.Url.Port,
                            httpRequestBase.ApplicationPath);
            }

            if (!appPath.EndsWith("/"))
            {
                appPath += "/";
            }

            return appPath;
        }
    }
}

Utilisation:

À utiliser à partir d'un contrôleur:

PathHelper.FullyQualifiedApplicationPath(ControllerContext.RequestContext.HttpContext.Request)

à utiliser dans une vue:

@using MyTestProject.Helpers

PathHelper.FullyQualifiedApplicationPath(Request)
14
répondu Paul Zahra 2014-09-12 13:22:10

dans MVC _Layout.cshtml:

<base href="@Request.GetBaseUrl()" />

c'est ce que nous utilisons!

public static class ExtensionMethods
{
public static string GetBaseUrl(this HttpRequestBase request)
        {
          if (request.Url == (Uri) null)
            return string.Empty;
          else
            return request.Url.Scheme + "://" + request.Url.Authority + VirtualPathUtility.ToAbsolute("~/");
        }
}
11
répondu katibaer 2014-03-11 15:02:57

Cela fonctionne très bien pour moi (aussi avec un équilibreur de charge):

@{
    var urlHelper = new UrlHelper(Html.ViewContext.RequestContext);
    var baseurl = urlHelper.Content(“~”);
}

<script>
    var base_url = "@baseurl";
</script>

surtout si vous utilisez des numéros de port non standard, en utilisant Request.URL.L'autorité apparaît d'abord comme une bonne avance, mais elle échoue dans un environnement de LB.

4
répondu Tadej Gregorcic 2012-07-24 00:06:00

vous pouvez avoir une méthode statique qui regarde HttpContext.Courant et décide de L'URL à utiliser (développement ou serveur en direct) en fonction de l'ID de l'hôte. HttpContext pourrait même offrir un moyen plus simple de le faire, mais c'est la première option que j'ai trouvée et ça fonctionne très bien.

2
répondu Adrian Grigore 2009-08-17 14:05:33

vous pouvez utiliser le script suivant en vue:

<script type="text/javascript">
    var BASE_URL = '<%= ResolveUrl("~/") %>';
</script>
2
répondu Andrus 2013-04-14 07:46:31

Pour ASP.NET MVC 4 c'est un peu différent:

string url = HttpContext.Request.Url.AbsoluteUri;
2
répondu Fernando Vezzali 2013-10-03 13:35:40

ça marche dans ASP .NET MVC 4 Dans n'importe quelle action de controller vous pouvez écrire: 1stline obtient la totalité de l'url+chaîne de requête. Deuxième ligne supprimer le chemin local et la requête ,dernier symbole'/'. 3e ligne, ajouter le symbole '/' à la dernière position.

Uri url = System.Web.HttpContext.Current.Request.Url;
string UrlLink = url.OriginalString.Replace(url.PathAndQuery,"");
UrlLink = String.Concat(UrlLink,"/" );
2
répondu Muhammad Ashikuzzaman 2015-09-22 08:29:28

en html simple et ASP.NET ou ASP.NET MVC si vous utilisez tag:

<a href="~/#about">About us</a>
2
répondu Ravi Anand 2016-06-03 08:07:23

pour MVC 4:

String.Format("{0}://{1}{2}", Url.Request.RequestUri.Scheme, Url.Request.RequestUri.Authority, ControllerContext.Configuration.VirtualPathRoot);
1
répondu r.pankevicius 2014-02-14 13:54:10

c'est Peut-être une meilleure solution.

@{
   var baseUrl = @Request.Host("/");
}

utilisant

<a href="@baseUrl" class="link"Base URL</a>
1
répondu msavara 2015-03-31 02:17:41

Pour url avec application alias comme http://example.com/appAlias / ... Vous pouvez essayer ceci:

var req = HttpContext.Current.Request;
string baseUrl = string.Format("{0}://{1}/{2}", req.Url.Scheme, req.Url.Authority, req.ApplicationPath);
1
répondu Jacek Gzel 2017-03-01 12:25:31

sur la page Web elle-même:

<input type="hidden" id="basePath" value="@string.Format("{0}://{1}{2}",
  HttpContext.Current.Request.Url.Scheme,
  HttpContext.Current.Request.Url.Authority,
  Url.Content("~"))" />

dans le javascript:

function getReportFormGeneratorPath() {
  var formPath = $('#reportForm').attr('action');
  var newPath = $("#basePath").val() + formPath;
  return newPath;
}

ça marche pour mon projet MVC, j'espère que ça aide

1
répondu Andrew Day 2017-10-04 07:55:54

j'ai mis ceci dans la tête de mon _Layout.CSHTML

 <base href="~/" />
0
répondu cineam mispelt 2017-05-01 23:01:44