ASP.NET MVC에서 웹앱의 기본 URL을 어떻게 얻을 수 있습니까?


300

ASP.NET MVC 응용 프로그램의 루트 URL이 무엇인지 어떻게 빨리 확인할 수 있습니까? 즉, IIS가 http://example.com/foo/bar 에서 내 응용 프로그램을 제공하도록 설정되어 있으면 현재 URL을 가져 오지 않는 안정적인 방식으로 해당 URL을 얻을 수 있기를 원합니다. 내 행동을 다시 라우팅하면 깨지기 쉬운 방법으로 요청하고 자릅니다.

기본 URL이 필요한 이유는이 웹 응용 프로그램이 콜백을 위해 발신자 웹 응용 프로그램의 루트가 필요한 다른 웹 응용 프로그램을 호출하기 때문입니다.

답변:


399

사용 가능한 Request 객체가 있다고 가정하면 다음을 사용할 수 있습니다.

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

사용할 수없는 경우 컨텍스트를 통해 얻을 수 있습니다.

var request = HttpContext.Current.Request

8
무엇입니까 urlHelper.Content("~")? define을 어떻게 만듭니 urlHelper까? 감사!
Maxim Zaslavsky

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

13
내가 사용한 것 :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의 경우ControllerContext.RequestContext.HttpContext.Request
row1

7
@Url.Content("~")결의에 "/"기본 URL하지 않은.
앤드류 호프만

114

그래서 여기에 나열된 것들 중 어느 것도 나를 위해 일하지 않았지만 몇 가지 답변을 사용하면 뭔가 효과가 있습니다.

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

이 방법을 어디에 넣었습니까?
Josh Dean

3
그것은 실제로 얼마나 자주 사용 해야하는지에 달려 있습니다 ...이 단일 사용 거래 인 경우이 데이터가 필요한 클래스에 넣으십시오. 앱의 여러 클래스에서 사용할 것으로 예상되면 a Helpers내 응용 프로그램의 기본 폴더에 호출 된 static클래스가 Statics있고 위와 같은 기능을 거기에 넣었습니다 ... 위에서 public string GetBaseUrl()public static string GetBaseUrl()
Serj Sagan으로

업데이트로 더 이상이라는 클래스를 사용하지 않고 Statics대신 더 구체적인 용도로 구분했습니다.이 경우이 UrlHelper클래스 로 이동합니다.
Serj Sagan

1
내가 찾은 모든 옵션 중 이것이 실제로 나를 위해 일한 유일한 옵션입니다. 당신의 # 2입니다. 무리 감사!
adeldegan

2
PathBase를 언급하는 유일한 사람이기 때문에 이것을 필연적으로 바꿨습니다. 감사!
데이브

69

코드에서 :

Url.Content("~/");

MVC3 면도기 구문 :

@Url.Content("~/")

11
이것은 Razor 페이지에서 사용하기에 적합하지만 URL을 외부 소스로 전달하려고하면 전체 URL을 제공하지 않습니다.
krillgar

5
작동하지 않습니다. /실제 이름 대신 추가 됩니다.
Mr.

2
Url박쥐 는 코드를 어디에서 바로 사용할 수 있습니까? 에있을 수도 Controller있습니다. 확실히 당신이 이것을 필요로하는 곳 ViewModel이나 다른 class곳에는 없습니다 ..
Serj Sagan

43

어쩌면 여기에 게시 된 답변의 확장 또는 수정 일 수 있지만 간단히 다음 줄을 사용하면 작동합니다.

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

내 길은 : http://host/iis_foldername/controller/action
다음과 같습니다 :http://host/iis_foldername/


26

다음 스 니펫은 MVC4에서 잘 작동하며 HttpContext사용할 수 없습니다.

System.Web.HttpRuntime.AppDomainAppVirtualPath

MVC3에서도 작동하는 것 같습니다. 나는 그것을 사용 jQuery.load(): 내가 호출 할 컨트롤러와 액션에 대한 URL 구축 $('#myplaceholder').load('@(Html.Raw(HttpRuntime.AppDomainAppVirtualPath))/MyController/MyAction', ...);
의 Kjell Rilbe

왜 그렇게 하시겠습니까? Url.Action을 호출하는 대신?
BlackTigerX

4
Azure에 배포 할 때는 작동하지 않습니다. 이 시나리오에서는 더 높은 등급의 답변이 작동합니다.
Jeff Dunlop

25

IIS에 의존하는 요령은 특히 멀티 홈 프로덕션 시스템에서 IIS 바인딩이 공개 URL (WCF에서보고 있음)과 다를 수 있다는 것입니다. Request 객체에서 추출하는 것보다 약간 더 성공하는 경향이 있으므로 외부 목적으로 "기본"URL을 명시 적으로 정의하기 위해 구성을 사용하는 경향이 있습니다.


2
로드 밸런서 또는 프록시 뒤의 서버에도 적용됩니다.
Ishmaeel

20

절대 기본 URL의 경우이를 사용하십시오. HTTP와 HTTPS 모두에서 작동합니다.

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

15

이것은 asp.net 속성을 MVC로 변환 한 것입니다 . 거의 모든 노래가 춤을 춰 루트 URL 방법을 얻습니다.

도우미 클래스를 선언하십시오.

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

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

사용하는 일 <base>. 또한 Scheme을 생략하여 http 또는 https와 작동 할 수 있습니다. 즉,로 URL을 시작할 수 있습니다 //.
Jess

5

이것은 나를 위해 잘 작동합니다 (로드 밸런서와 함께).

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

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

특히 비표준 포트 번호를 사용하는 경우 Request.Url.Authority를 ​​사용하면 처음에는 좋은 리드처럼 보이지만 LB 환경에서는 실패합니다.


3

HttpContext.Current를보고 호스트 ID에 따라 사용할 URL (개발 또는 라이브 서버)을 결정하는 정적 메소드가있을 수 있습니다. HttpContext는 더 쉬운 방법을 제공 할 수도 있지만 이것이 내가 찾은 첫 번째 옵션이며 제대로 작동합니다.


3

다음 스크립트를 볼 수 있습니다.

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


3

이것은 ASP .NET MVC 4에서 작동합니다. 모든 컨트롤러 작업에서 다음을 작성할 수 있습니다. 1stline은 전체 url + Query String을 가져옵니다. 두 번째 줄은 로컬 경로 및 쿼리, 마지막 '/'기호를 제거합니다. 세 번째 줄은 마지막 위치에 '/'기호를 추가합니다.

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

3

태그를 사용하는 경우 간단한 html 및 ASP.NET 또는 ASP.NET MVC에서 :

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

3

http://example.com/appAlias/ 와 같은 복제 별칭이있는 URL의 경우 다음을 시도 할 수 있습니다.

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

3

웹 페이지 자체에서 :

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

자바 스크립트에서 :

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

이것은 내 MVC 프로젝트에서 작동합니다.


@hemp 편집했지만 투표하지 않았습니까? 포인트가 당신에게 가치가 있기를 바랍니다
Andrew Day

이 질문과 관련 답변은 내 특정 문제에 도움이되지 않았으므로 그중 하나에 대해 시도하거나 투표하지 않았습니다. 나는 이것을 보았 기 때문에 이것을 편집했고 그것이 올바르게 포맷되면 괜찮은 대답이라고 생각했습니다. 좋은 시민이 되려고 노력하고 있습니다.
hemp

또한 답변을 편집하면 얻을 수있는 평판이 없습니다.
hemp


2

아마도 더 나은 해결책 일 것입니다.

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

사용

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

1
테스트하지는 않았지만 기본 URL이 가상 일 때 이것이 작동하지 않을 것입니다. 즉. localhost / myApp
emragins


1

다음은 나를 위해 제대로 작동했습니다.

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

이것은 내 솔루션이었습니다 (API 컨트롤러에서 .net core 3.1 사용).

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

0

한 줄로 간단히 BaseUrl을 얻으십시오.

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

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


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();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.