如何在ASP.NET MVC中获取我的webapp基本URL?

时间:2009-08-17 13:47:42

标签: .net asp.net asp.net-mvc iis

如何快速确定ASP.NET MVC应用程序的根URL?即,如果IIS设置为在http://example.com/foo/bar处为我的应用程序提供服务,那么我希望能够以可靠的方式获取该URL,而不涉及从请求获取当前URL并将其删除如果我重新开始行动,那一些脆弱的方式就会破裂。

我需要基本URL的原因是此Web应用程序调用另一个需要root用户来调用Web应用程序以进行回调。

27 个答案:

答案 0 :(得分:369)

假设您有一个Request对象,您可以使用:

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

如果它不可用,您可以通过上下文访问它:

var request = HttpContext.Current.Request

答案 1 :(得分:94)

所以这里列出的没有一个对我有用,但是使用了一些答案,我得到了一些工作:

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的更新:

ASP.NET Core会让这个过程变得更加痛苦,特别是如果你的代码很深。您有两个选项可以访问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 Core GetBaseUrl()更新的内容:

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

    var host = request.Host.ToUriComponent();

    var pathBase = request.PathBase.ToUriComponent();

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

答案 2 :(得分:61)

在代码中:

Url.Content("~/");

MVC3 Razor语法:

@Url.Content("~/")

答案 3 :(得分:39)

也许是这里发布的答案的扩展或修改,但我只使用以下行并且它可以工作:

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

当我的路径是:http://host/iis_foldername/controller/action
然后我收到:http://host/iis_foldername/

答案 4 :(得分:25)

依赖IIS的诀窍是IIS绑定可能与您的公共URL(我正在看着您的WCF)不同,特别是对于多宿主生产机器。我倾向于使用配置来明确定义用于外部目的的“基础”URL,因为这比从Request对象中提取它更加成功。

答案 5 :(得分:25)

以下代码段在MVC4中对我很有效,并且不需要HttpContext可用:

System.Web.HttpRuntime.AppDomainAppVirtualPath

答案 6 :(得分:19)

对于绝对基本URL,请使用此选项。适用于HTTP和HTTPS。

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

答案 7 :(得分:15)

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)

答案 8 :(得分:12)

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

答案 9 :(得分:5)

这对我来说很好(也有负载均衡器):

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

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

特别是如果您使用的是非标准端口号,则使用Request.Url.Authority最初看起来好像很好,但在LB环境中失败。

答案 10 :(得分:3)

对于ASP.NET MVC 4,它有点不同:

string url = HttpContext.Request.Url.AbsoluteUri;

答案 11 :(得分:3)

在网页上:

System.Xml.Linq

在javascript中:

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

这适用于我的MVC项目,希望它有所帮助

答案 12 :(得分:3)

在简单的html和ASP.NET或ASP.NET MVC中如果使用标记:

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

答案 13 :(得分:3)

这适用于ASP .NET MVC 4  在任何控制器操作中,您可以编写: 1stline获取整个URL +查询字符串。 第二行删除本地路径&amp;查询,最后&#39; /&#39;符号。 第3行添加&#39; /&#39;最后一个位置的符号。

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

答案 14 :(得分:3)

您可以使用静态方法查看HttpContext.Current,并根据主机ID决定使用哪个URL(开发服务器或实时服务器)。 HttpContext甚至可以提供一些更简单的方法,但这是我找到的第一个选项,它工作正常。

答案 15 :(得分:3)

您可以在视图中使用以下脚本:

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

答案 16 :(得分:2)

也许这是一个更好的解决方案。

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

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

答案 17 :(得分:2)

对于包含http://example.com/appAlias/等应用别名的网址...您可以尝试:

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

答案 18 :(得分:2)

我把它放在我的_Layout.cshtml

的头部
 <base href="~/" />

答案 19 :(得分:1)

对于MVC 4:

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

答案 20 :(得分:1)

@{
    var baseurl = Request.Url.Scheme + "://" + Request.Url.Host + ":" + Request.Url.Port + Url.Content("~");
}
@baseurl

-输出 http://localhost:49626/TEST/

答案 21 :(得分:1)

这是我的解决方案(在api控制器中使用.net core 3.1):

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

答案 22 :(得分:1)

在.net core 3.1中,我使用了这种方法:

$"{Request.Scheme}://{Request.Host}{Url.Content("~/")}"

答案 23 :(得分:0)

以下内容对我来说很有效

echo get_post_field('post_content', $id);

答案 24 :(得分:0)

只需一行即可获取BaseUrl

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

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

答案 25 :(得分:0)

您也可以使用它。对于剃须刀页面,最好使用其他页面。

https://ml-software.ch/posts/getting-the-base-url-for-an-asp-net-core-mvc-web-application-in-your-static-javascript-files

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <base href='@Url.AbsoluteContent("~/")'>
    <title>@ViewBag.Title - ASP.NET Core Web Application</title>
    <!-- ... -->
</head>
<body>

答案 26 :(得分:0)

在类似于实用程序类的项目的静态类中添加此功能:

utility.cs 内容:

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

在任何地方使用此代码并享受它:

var baseUrl = Utility.GetBaseUrl();