当前位置:  开发笔记 > 后端 > 正文

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

如何解决《如何在ASP.NETMVC中获取我的webapp基本URL?》经验,为你挑选了10个好方法。

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

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



1> tghw..:

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

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

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

var request = HttpContext.Current.Request


@Maxim,你可以用problly替换**Url.Content("〜")**
我最终使用的是:`var request = HttpContext.Current.Request; urlBase = string.Format("{0}:// {1} {2}",request.Url.Scheme,request.Url.Authority,(new System.Web.Mvc.UrlHelper(request.RequestContext)). ( "〜"));`
什么是`urlHelper.Content("〜")`?如何创建定义`urlHelper`?谢谢!
对于MVC 4,我使用`ControllerContext.RequestContext.HttpContext.Request`
`@Url.Content("〜")`解析为`"/"`,这不是基本网址.
当您在负载均衡器后面并且当公共URL是https://www.example.com时,服务器真的在http://10.55.44.33:1234处接收请求时会发生什么?
var urlHelper = new UrlHelper(html.ViewContext.RequestContext);

2> Serj Sagan..:

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

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();
    services.TryAddSingleton();
}

然后让它为你注入这样:

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


这实际上取决于您需要使用它的频率...如果这是一次性使用交易,那么只需将它放在您需要此数据的类中,如果您预计在应用程序中的多个类中使用它,那么我使用在我的应用程序的基础上名为`Helpers`的文件夹,我有一个名为`Statics`的`static`类,我把上面的函数放在那里...只是确保你将上面的`public string GetBaseUrl()`更改为`public static string GetBaseUrl()`

3> mxasim..:

在代码中:

Url.Content("~/");

MVC3 Razor语法:

@Url.Content("~/")


这适用于在Razor页面上使用,但如果您尝试将URL传递给外部源,它将不会为您提供完整的URL.
它不起作用.它只是添加`/`而不是实际名称.

4> Bronek..:

也许它是对此处发布的答案的扩展或修改,但我只使用以下行并且它有效:

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

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



5> Wyatt Barnet..:

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


对于负载均衡器或代理服务器后面的服务器也是如此.

6> 小智..:

以下代码片段适用于MVC4,并且不需要HttpContext可用:

System.Web.HttpRuntime.AppDomainAppVirtualPath


部署到Azure时不起作用.评分较高的答案适用于此方案.

7> arni..:

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

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



8> Paul Zahra..:

这是asp.net属性到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)



9> katibaer..:

在MVC _Layout.cshtml中:


多数民众赞成我们用的!

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



10> 小智..:

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

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


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

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有