2009-08-17 29 views
234

如何快速確定我的ASP.NET MVC應用程序的根URL是什麼?也就是說,如果IIS設置爲在http://example.com/foo/bar上提供我的應用程序,那麼我希望能夠以可靠的方式獲取該URL,而不需要從請求中獲取當前URL並以某種脆弱的方式將其切碎如果我重新佈置我的動作,就會中斷。如何在ASP.NET MVC中獲取我的webapp的基URL?

我需要基本URL的原因是,此Web應用程序調用另一個需要根的呼叫Web應用程序的回調目的。

回答

319

假設你有一個Request對象,你可以使用:

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

如果它不可用,您可以通過上下文得到它:

var request = HttpContext.Current.Request 
+0

我想這頭,但也HttpContext.Current.Request.Authority,也沒有HttpContext.Current.Request.Scheme被定義。 – 2009-08-18 17:45:27

+7

什麼是'urlHelper.Content(「〜」)'?我如何創建定義'urlHelper'?謝謝! – 2010-08-15 07:38:54

+26

@Maxim,你可以替代** Url.Content(「〜」)** – UpTheCreek 2010-11-24 15:14:19

2

您可以使用靜態方法查看HttpContext.Current並根據主機ID決定使用哪個URL(開發或實時服務器)。 HttpContext甚至可以提供一些更簡單的方法來完成它,但這是我找到的第一個選項,它工作正常。

23

訣竅與依賴於IIS IIS綁定可以不同於你的公共URL(我正在看你的WCF),尤其是在多宿主生產機器上。我傾向於使用配置來爲外部目的顯式定義「基礎」url,因爲這往往比從Request對象中提取它更成功。

+1

似乎明智,不太容易出現配置錯誤。 – 2011-02-13 23:38:28

+1

同樣適用於負載均衡器或代理服務器之後的服務器。 – Ishmaeel 2014-05-06 13:45:12

48

代碼:

Url.Content("~/"); 

MVC3剃刀語法:

@Url.Content("~/") 
+10

這適合在Razor頁面上使用,但如果您嘗試將URL傳遞給外部來源,它將不會爲您提供完整的URL。 – krillgar 2014-04-03 14:03:37

+3

它不起作用。它只會添加'/'而不是實際的名稱。 – Mrchief 2016-04-21 02:15:25

+0

Code在哪裏可以找到Url助手嗎?也許只有在'Controller'中。當然不是在'ViewModel'或任何其他'類'你可能需要這個.. – 2016-08-12 23:31:49

4

這對我來說工作正常(也帶有負載平衡器):

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

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

特別是如果你正在使用非標準端口號,使用Request.Url.Authority首先看起來像一個好的領導,但在LB環境中失敗。

21

下面的代碼片段很好地工作,我在MVC4,並不需要一個HttpContext可供選擇:

System.Web.HttpRuntime.AppDomainAppVirtualPath 
+0

似乎也適用於MVC3。我在'jQuery.load()'中使用它來構造我想調用的控制器和動作的URL: '$('#myplaceholder')。load('@(Html.Raw(HttpRuntime.AppDomainAppVirtualPath))/ MyController/MyAction',...);' – 2012-10-19 09:17:56

+0

你爲什麼要那樣做?而不是調用Url.Action? – BlackTigerX 2014-07-10 22:05:10

+3

部署到Azure時不起作用。在這種情況下,評分較高的答案有效 – 2015-05-18 08:51:45

77

所以沒有列在這裏爲我工作,但使用一些答案的那些,我得到的東西的工作:

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核心/ MVC 6:

ASP.NET Core化妝這個過程更加痛苦,特別是如果你深入你的代碼。您有2個選項在HttpContext

1獲得)從controller在它傳遞:

var model = new MyClass(HttpContext); 

然後在model

private HttpContext currentContext; 

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

2)也許更清潔的方法是把它注射進入你的班級,開始在你的類型中註冊Startup:

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

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

然後把它注入了你這個樣子:

private HttpContext currentContext; 

public MyClass(IHttpContextAccessor httpContextAccessor) 
{ 
    currentContext = httpContextAccessor.HttpContext; 
} 
在這兩種情況下

,這裏是更新爲.NET CoreGetBaseUrl()

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

    var host = request.Host.ToUriComponent(); 

    var pathBase = request.PathBase.ToUriComponent(); 

    return $"{request.Scheme}://{host}{pathBase}"; 
} 
+0

你把這個方法放在哪裏? – 2013-05-28 00:05:07

+3

這真的取決於你需要多久使用它......如果這是一次性使用交易,那麼就把它放在你需要這些數據的類中,如果你預期在你的應用中的多個類中使用它,那麼我使用一個名爲'Helpers'的文件夾在我的應用程序的基礎中,我有一個名爲'Statics'的靜態類,並且把上面的函數放在那裏......只要確保你從'public string GetBaseUrl()'到'public static string GetBaseUrl()' – 2013-05-28 17:02:57

+0

作爲一個更新,我不再使用一個名爲'Statics'的類,而是將它分解成更具體的用途,所以在這種情況下,這將進入我的'UrlHelper'類 – 2016-08-14 22:29:57

2

您可以使用視圖下面的腳本:

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

也許這是在這裏發佈的答案的擴展或修改,但我使用簡單的下面一行,它的工作原理:

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

當我的路徑是:http://host/iis_foldername/controller/action
後來我收到:http://host/iis_foldername/

2

對於ASP.NET MVC 4這是一個有點不同:

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

對於一個絕對的基本URL使用。適用於HTTP和HTTPS。

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

對於MVC 4:

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

在MVC _Layout.cshtml:

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

那是我們用什麼!

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

而Uri是?呃... – 2014-09-12 12:00:47

+0

+1使用''。您也可以省略該計劃,以便它可以使用http或https。這意味着你可以用''''開始url。 – Jess 2016-12-09 19:01:26

13

This is a conversion of an asp.net property to MVC。這是一個幾乎所有的歌唱都跳舞得到根網址的方法。

聲明一個輔助類:

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

用法:

要從控制器使用方法:

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

在視圖中使用:

@using MyTestProject.Helpers 

PathHelper.FullyQualifiedApplicationPath(Request) 
+1

這是唯一的答案,說明網站在80以外的端口上運行的可能性。就我而言,所有其他答案都是不安全的。謝謝! – jebar8 2015-01-07 22:25:02

1

也許是更好的解決方案。

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

使用

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

我沒有測試,但我懷疑這將工作時,基地的網址是直接虛擬。即。 localhost/myApp – emragins 2015-12-16 04:46:12

2

這是在ASP .NET MVC 4 工作中,你可以寫任何控制器動作: 1stline獲得了整個網址+查詢字符串。 第二行刪除本地路徑&查詢,最後一個'/'符號。 第3行在最後位置添加'/'符號。

Uri url = System.Web.HttpContext.Current.Request.Url; 
string UrlLink = url.OriginalString.Replace(url.PathAndQuery,""); 
UrlLink = String.Concat(UrlLink,"/"); 
2
在簡單的HTML和ASP.NET或ASP.NET MVC

如果您使用的標籤:

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

在網頁本身:

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

在JavaScript:

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

這適用於我的MVC項目,希望它h ELPS

+0

@hemp編輯它,但沒有投票嗎?希望積分對你有價值 – 2017-10-04 13:17:36

+0

這個問題和相關的答案對我的特殊問題沒有幫助,所以我沒有嘗試或投票支持他們中的任何一個。我編輯了這一個,因爲我碰巧看到它,並認爲它可能是一個體面的答案,如果它格式正確。只是想成爲一個好公民。 – hemp 2017-10-08 01:24:28

+0

另外,編輯答案時沒有獲得聲望點。 – hemp 2018-01-06 01:40:15

2

對於aplication別名像http://example.com/appAlias/網址...你可以試試這個:

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

我把這個在我_Layout.cshtml

<base href="~/" /> 
相關問題