it-swarm.com.de

Wie kann ich die Basis-URL meiner Webanwendung in ASP.NET MVC abrufen?

Wie kann ich schnell feststellen, wie die Stamm-URL für meine ASP.NET MVC-Anwendung lautet? Dh, wenn IIS für meine Anwendung unter http://example.com/foo/bar eingestellt ist, würde ich das gerne bekommen Eine zuverlässige URL, bei der die aktuelle URL nicht aus der Anforderung abgerufen und auf eine fragile Weise zerlegt wird, die beim erneuten Weiterleiten meiner Aktion unterbrochen wird.

Der Grund, warum ich die Basis-URL benötige, besteht darin, dass diese Webanwendung eine andere aufruft, die den Stamm der aufrufenden Webanwendung für Rückrufzwecke benötigt.

286

Angenommen, Sie haben ein Request-Objekt zur Verfügung, können Sie Folgendes verwenden:

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

Wenn es nicht verfügbar ist, können Sie es über den Kontext erreichen:

var request = HttpContext.Current.Request
379
tghw

Keiner der hier aufgelisteten hat für mich funktioniert, aber mit ein paar der Antworten habe ich etwas erreicht:

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;
}

pdate für ASP.NET Core/MVC 6:

ASP.NET Core Macht diesen Vorgang etwas schmerzhafter, insbesondere wenn Sie tief in Ihrem Code stecken. Sie haben 2 Möglichkeiten, um an die HttpContext

1) Gib es von deinem controller ein:

var model = new MyClass(HttpContext);

dann in model:

private HttpContext currentContext;

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

2) Vielleicht ist der sauberere Weg, es in Ihre Klasse zu injizieren, was mit der Registrierung der Typen in Ihrem Startup: Beginnt.

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

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

dann lass es dir so spritzen:

private HttpContext currentContext;

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

in beiden Fällen ist hier das aktualisierte für .NET CoreGetBaseUrl():

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

    var Host = request.Host.ToUriComponent();

    var pathBase = request.PathBase.ToUriComponent();

    return $"{request.Scheme}://{Host}{pathBase}";
}
100
Serj Sagan

In Code:

Url.Content("~/");

MVC3 Razor Syntax:

@Url.Content("~/")
64
mxasim

Vielleicht ist es eine Erweiterung oder Änderung der hier geposteten Antworten, aber ich benutze einfach die folgende Zeile und es funktioniert:

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

Wenn mein Weg ist: http://Host/iis_foldername/controller/action
dann erhalte ich: http://Host/iis_foldername/

41
Bronek

Der Trick, sich auf IIS zu verlassen, ist, dass IIS Bindungen sich von Ihren öffentlichen URLs (WCF, auf die ich Sie sehe) unterscheiden können, insbesondere bei Multi-Homed Ich tendiere dazu, die Konfiguration zu verwenden, um die "Basis" -URL für externe Zwecke explizit zu definieren, da dies ein bisschen erfolgreicher ist als das Extrahieren aus dem Request-Objekt.

25
Wyatt Barnett

Das folgende Snippet funktioniert in MVC4 einwandfrei und benötigt kein HttpContext:

System.Web.HttpRuntime.AppDomainAppVirtualPath
25
user666142

Verwenden Sie dies für eine absolute Basis-URL. Funktioniert mit HTTP und HTTPS.

new Uri(Request.Url, Url.Content("~"))
19
arni

Dies ist eine Konvertierung einer asp.net-Eigenschaft in MVC . Es ist so ziemlich alles, was singt, alles tanzt, bekommt eine Root-URL-Methode.

Deklarieren Sie eine Helferklasse:

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;
        }
    }
}

Verwendungszweck:

Verwendung von einem Controller aus:

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

In einer Ansicht verwenden:

@using MyTestProject.Helpers

PathHelper.FullyQualifiedApplicationPath(Request)
15
Paul Zahra

In MVC _Layout.cshtml:

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

Das benutzen wir!

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("~/");
        }
}
12
katibaer

Das funktioniert gut für mich (auch mit einem Load Balancer):

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

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

Insbesondere, wenn Sie nicht standardmäßige Portnummern verwenden, scheint die Verwendung von Request.Url.Authority zunächst ein guter Hinweis zu sein, schlägt jedoch in einer LB-Umgebung fehl.

5
Tadej Gregorcic

Auf der Webseite selbst:

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

Im Javascript:

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

Das funktioniert für mein MVC-Projekt, hoffe es hilft

3
Andrew Day

Dies funktioniert in ASP .NET MVC 4 In jeder Controller-Aktion, die Sie schreiben können: 1stline ruft die gesamte URL + Abfragezeichenfolge ab Zeile '/' an letzter Stelle einfügen.

Uri url = System.Web.HttpContext.Current.Request.Url;
string UrlLink = url.OriginalString.Replace(url.PathAndQuery,"");
UrlLink = String.Concat(UrlLink,"/" );

Bei ASP.NET MVC 4 ist das etwas anders:

string url = HttpContext.Request.Url.AbsoluteUri;
3

Für URLs mit einem Anwendungsalias wie http://example.com/appAlias/ ... können Sie Folgendes versuchen:

var req = HttpContext.Current.Request;
string baseUrl = string.Format("{0}://{1}/{2}", req.Url.Scheme, req.Url.Authority, req.ApplicationPath);
3
Jacek Gzel

Sie können eine statische Methode verwenden, die sich HttpContext.Current ansieht und abhängig von der Host-ID entscheidet, welche URL verwendet werden soll (Entwicklungs- oder Live-Server). HttpContext bietet vielleicht sogar eine einfachere Möglichkeit, dies zu tun, aber dies ist die erste Option, die ich gefunden habe, und sie funktioniert einwandfrei.

3
Adrian Grigore

Sie können das folgende Skript in der Ansicht verwenden:

<script type="text/javascript">
    var BASE_URL = '<%= ResolveUrl("~/") %>';
</script>
3
Andrus

in einfachem HTML und ASP.NET oder ASP.NET MVC, wenn Sie Tag verwenden:

<a href="~/#about">About us</a>
3
Ravi Anand

Ich habe dies in den Kopf meiner _Layout.cshtml eingefügt

 <base href="~/" />
2
cineam mispelt

Vielleicht ist es eine bessere Lösung.

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

mit

<a href="@baseUrl" class="link">Base URL</a>
2
msavara

Für MVC 4:

String.Format("{0}://{1}{2}", Url.Request.RequestUri.Scheme, Url.Request.RequestUri.Authority, ControllerContext.Configuration.VirtualPathRoot);
1
r.pankevicius

Einfach in einer Zeile BaseUrl holen

string baseUrl = new Uri(Request.Url, Url.Content("~")).AbsoluteUri;

//output example: https://stackoverflow.com
0
Zahid Tanveer

Folgendes hat für mich solide funktioniert

var request = HttpContext.Request;
                        var appUrl = System.Web.HttpRuntime.AppDomainAppVirtualPath;

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

                        var newUrl = string.Format("{0}://{1}{2}{3}/{4}", request.Url.Scheme, request.UrlReferrer.Host, appUrl, "Controller", "Action");
0
venu