ASP.NET MVC'de web uygulamamın temel URL'sini nasıl alabilirim?


300

ASP.NET MVC uygulamamın kök URL'sinin ne olduğunu hızlı bir şekilde nasıl belirleyebilirim? Yani, IIS http://example.com/foo/bar adresindeki uygulamamı sunacak şekilde ayarlanmışsa , o URL'yi geçerli URL'yi eylemimi yeniden yönlendirirsem kırılmayacak şekilde kırılır.

Temel URL'ye ihtiyacımın nedeni, bu web uygulamasının, geri arama amacıyla arayan web uygulamasına root gerektiren başka bir uygulama çağırmasıdır.

Yanıtlar:


399

Kullanılabilir bir Request nesnesiniz olduğunu varsayarsak, şunları kullanabilirsiniz:

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

Kullanılamıyorsa, içeriğe erişebilirsiniz:

var request = HttpContext.Current.Request

8
Nedir urlHelper.Content("~")? Nasıl tanımlayabilirim urlHelper? Teşekkürler!
Maxim Zaslavsky

31
@Maxim, muhtemelen Url.Content ("~")
UpTheCreek

13
Ne kullanarak sona erdi:var request = HttpContext.Current.Request; urlBase = string.Format("{0}://{1}{2}", request.Url.Scheme, request.Url.Authority, (new System.Web.Mvc.UrlHelper(request.RequestContext)).Content("~"));
Peter

7
MVC 4 için kullanıyorumControllerContext.RequestContext.HttpContext.Request
row1

7
@Url.Content("~")çözülür "/", bu temel URL değildir.
Andrew Hoffman

114

Burada listelenenlerin hiçbiri benim için işe yaramadı, ancak birkaç cevabı kullanarak, çalışan bir şey aldım:

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

ASP.NET Core / MVC 6 Güncellemesi:

ASP.NET Coreözellikle kodunuzun derinliklerinde iseniz bu işlemi biraz daha acı verici hale getirir. Almak için 2 seçeneğiniz varHttpContext

1) sizin içinden geçirin controller:

var model = new MyClass(HttpContext);

sonra model:

private HttpContext currentContext;

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

2) Belki de daha temiz bir yol, onu sınıfınıza enjekte etmektir. Startup:

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

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

sonra sizin için böyle enjekte var:

private HttpContext currentContext;

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

her iki durumda da, aşağıdakiler için güncellenmiştir .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}";
}

Bu yöntemi nereye koydunuz?
Josh Dean

3
Bu gerçekten ne sıklıkta kullanmanız gerektiğine bağlıdır ... eğer bu tek kullanımlık bir anlaşma ise, sadece bu verilere ihtiyacınız olan sınıfa koyun, eğer uygulamanızda birden fazla sınıfta kullanmayı bekliyorsanız, denilen klasörüne Helpersuygulamamda tabanında, bir adres staticsınıf denilen Staticssadece yukarıdan değiştirmek emin olun ... ve orada yukarıda gibi işlevleri koymak public string GetBaseUrl()içinpublic static string GetBaseUrl()
Serj Sagan

Bir güncelleme olarak, artık denilen bir sınıf kullanmak Staticsyerine bu kadar bu durumda bu benim girecek, daha spesifik kullanımlar içine ayrı kırık var UrlHelpersınıfta
Serj Sagan

1
Bulduğum tüm seçeneklerden, aslında benim için çalışan tek seçenek bu. Senin # 2. Çok teşekkürler!
adeldegan

2
Bu, çünkü tam olarak ihtiyacım olan PathBase'den bahseten tek kişi oldu. Teşekkürler!
Dave

69

Kod İçinde:

Url.Content("~/");

MVC3 Jilet Sözdizimi:

@Url.Content("~/")

11
Bu, Razor sayfalarında kullanmak için iyidir, ancak URL'yi harici bir kaynağa aktarmaya çalışıyorsanız, size tam URL'yi vermez.
krillgar

5
Çalışmıyor. Sadece /gerçek ad yerine ekleyecektir .
Mrchief

2
UrlYardımcı , yarasadan hemen nerede yararlanabilir? Belki sadece Controller. Kesinlikle buna ihtiyacınız olabilecek ViewModelbaşka bir classyerde değil ..
Serj Sagan

43

Belki burada yayınlanan cevapların uzantısı veya modifikasyonu ama sadece aşağıdaki satırı kullanıyorum ve işe yarıyor:

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

Yolum şu olduğunda http://host/iis_foldername/controller/action
:http://host/iis_foldername/


26

Aşağıdaki snippet, MVC4'te benim için iyi çalışıyor ve kullanılabilir olması gerekmiyor HttpContext:

System.Web.HttpRuntime.AppDomainAppVirtualPath

MVC3'te de çalışıyor gibi görünüyor. Ben kullanmak jQuery.load(): Ben görüşmesi yapmak istiyorsunuz denetleyicisi ve eylem için URL'yi oluşturmak için $('#myplaceholder').load('@(Html.Raw(HttpRuntime.AppDomainAppVirtualPath))/MyController/MyAction', ...);
Kjell Rilbe

neden bunu yapasın ki? Url.Action'ı çağırmak yerine?
BlackTigerX

4
Azure'a konuşlandırıldığında çalışmaz. Bu senaryoda daha yüksek puanlı cevaplar işe yarar.
Jeff Dunlop

25

IIS'ye güvenmenin hilesi, IIS bağlantılarının genel URL'lerinizden (size baktığım WCF'den) farklı olabileceğidir, özellikle çok bağlantılı üretim makinelerinde. Ben istek nesnesinden ayıklamak biraz daha başarılı olma eğiliminde olduğu gibi harici amaçlar için "temel" url açıkça tanımlamak için yapılandırma kullanarak vektör eğilimindedir.


2
Yük dengeleyicilerinin veya proxy'lerin arkasındaki sunucular için de geçerlidir.
İshmaeel

20

Mutlak temel URL için bunu kullanın. Hem HTTP hem de HTTPS ile çalışır.

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

15

Bu, asp.net özelliğinin MVC'ye dönüştürülmesidir . Bu hemen hemen tüm dans şarkı kök url yöntemi şarkı.

Bir yardımcı sınıf bildirin:

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

Kullanımı:

Bir denetleyiciden kullanmak için:

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

Bir görünümde kullanmak için:

@using MyTestProject.Helpers

PathHelper.FullyQualifiedApplicationPath(Request)

1
Bu, 80 dışında bir bağlantı noktasında çalışan bir sitenin olasılığını açıklayan tek yanıttır. Diğer tüm yanıtlar, endişelendiğim kadarıyla güvensizdir. Teşekkürler!
15:22

12

MVC _Layout.cshtml dosyasında:

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

Bu ne kullanıyoruz!

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

Kullanmak için +1 <base>. Ayrıca, şemayı http veya https ile çalışacak şekilde atlayabilirsiniz. Bu, url ile başlayabileceğiniz anlamına gelir //.
Jess

5

Bu benim için iyi çalışıyor (ayrıca bir yük dengeleyici ile):

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

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

Özellikle standart dışı bağlantı noktası numaralarını kullanıyorsanız, Request.Url.Authority kullanmak ilk başta iyi bir ipucu gibi görünür, ancak bir LB ortamında başarısız olur.


3

HttpContext.Current'a bakan ve ana makine kimliğine bağlı olarak hangi URL'nin (geliştirme veya canlı sunucu) kullanılacağına karar veren statik bir yönteminiz olabilir. HttpContext bunu yapmanın daha kolay bir yolunu bile sunabilir, ancak bulduğum ilk seçenek bu ve iyi çalışıyor.


3

Görünümde aşağıdaki komut dosyasını kullanabilirsiniz:

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


3

Bu ASP .NET MVC 4 çalışıyor Herhangi bir denetleyici eyleminde yazabilirsiniz: 1stline tüm url + Sorgu Dizesi alır. 2. satır yerel yolu ve sorguyu kaldır, son '/' sembolü. 3. satır son konuma '/' sembolü ekler.

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

3

etiketi kullanıyorsanız basit html ve ASP.NET veya ASP.NET MVC'de:

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

3

Http://example.com/appAlias/ gibi uygulama takma adı olan URL için ... Bunu deneyebilirsiniz:

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

3

Web sayfasının kendisinde:

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

Javascript'te:

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

Bu benim MVC projem için çalışıyor, umarım yardımcı olur


@hemp Düzenledi ancak oylamadı mı? Umarım puanlar sizin için değerlidir
Andrew Day

Bu soru ve ilgili cevaplar özel sorunum için yararlı olmadı, bu yüzden bunlardan hiçbirine oy vermedim veya oy vermedim. Bunu düzenledim çünkü gördüm ve doğru biçimlendirilmişse iyi bir cevap olabileceğini düşündüm. Sadece iyi bir vatandaş olmaya çalışıyorum.
kenevir

Ayrıca, bir yanıtı düzenlemek için kazanılan itibar puanı yoktur.
kenevir


2

Belki daha iyi bir çözümdür.

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

kullanma

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

1
Test etmedim, ancak temel url doğrudan sanal olduğunda bunun işe yarayacağından şüpheliyim. yani. localhost /
myApp

1

MVC 4 için:

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

1

Aşağıdaki benim için sağlam çalıştı

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");


1

Bu benim çözümüm (bir api denetleyicisinde .net core 3.1 kullanarak):

string baseUrl = $"{Request.Scheme}://{Request.Headers.Where(h => h.Key == "Host").First().Value}";

0

Sadece bir satırda BaseUrl olsun

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

//output example: https://stackoverflow.com


0

bu işlevi, yardımcı sınıf gibi projedeki statik sınıfta ekleyin

utility.cs içeriği:

public static class Utility
{
    public static string GetBaseUrl()
    {
        var request = HttpContext.Current.Request;
        var urlHelper = new UrlHelper(request.RequestContext);
        var baseUrl = $"{request.Url.Scheme}://{request.Url.Authority}{urlHelper.Content("~")}";
        return baseUrl;
    }
}

bu kodu herhangi bir yerde kullanın ve keyfini çıkarın:

var baseUrl = Utility.GetBaseUrl();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.