source

ASP에서 웹 앱의 기본 URL을 얻으려면 어떻게 해야 합니까?NET MVC?

gigabyte 2023. 4. 24. 23:25
반응형

ASP에서 웹 앱의 기본 URL을 얻으려면 어떻게 해야 합니까?NET MVC?

ASP의 루트 URL을 빠르게 판별하려면 어떻게 해야 합니까?NET MVC 어플리케이션즉, IIS가 http://example.com/foo/bar,에서 응용 프로그램을 지원하도록 설정되어 있는 경우, 요청에서 현재 URL을 가져와 작업을 재루팅할 때 깨지기 쉬운 방법으로 잘라내지 않고 신뢰할 수 있는 방법으로 해당 URL을 얻을 수 있어야 합니다.

기본 URL이 필요한 이유는 이 웹 어플리케이션이 콜백 목적으로 루트를 필요로 하는 다른 웹 어플리케이션을 발신자 웹 어플리케이션으로 호출하기 때문입니다.

Request 객체를 사용할 수 있는 경우 다음을 사용할 수 있습니다.

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

사용할 수 없는 경우는, 다음의 콘텍스트를 사용해 액세스 할 수 있습니다.

var request = HttpContext.Current.Request

여기에 나와 있는 것 중 어느 것도 도움이 되지 않았지만, 몇 가지 답을 사용하여 뭔가 효과를 볼 수 있었습니다.

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특히 코드에 깊이 빠져 있는 경우에는 이 프로세스가 조금 더 고통스럽게 됩니다.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 Core GetBaseUrl():

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

    var host = request.Host.ToUriComponent();

    var pathBase = request.PathBase.ToUriComponent();

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

코드:

Url.Content("~/");

MVC3 레이저 구문:

@Url.Content("~/")

여기에 게시된 답변의 확장 또는 수정일 수도 있지만, 저는 다음 행을 사용하여 작업을 수행할 수 있습니다.

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

경로가 다음과 같은 경우:http://host/iis_foldername/controller/action
다음에 수신합니다.http://host/iis_foldername/

다음 스니펫은 MVC4에서 나에게 잘 작동하며, 이 스니펫은 필요 없습니다.HttpContext이용 가능:

System.Web.HttpRuntime.AppDomainAppVirtualPath

IIS에 의존할 때의 문제는 IIS 바인딩이 퍼블릭 URL(WCF)과 다를 수 있다는 것입니다.특히 멀티홈 실가동 머신의 경우는 그렇습니다.Configuration을 사용하여 외부 목적을 위해 명시적으로 "base" URL을 정의하는 경향이 있습니다.이는 Request 객체에서 URL을 추출하는 것보다 약간 더 성공적이기 때문입니다.

절대 기준 URL의 경우 이를 사용합니다.HTTP 와 HTTPS 의 양쪽 모두에서 동작합니다.

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

이것은 asp.net 속성을 MVC로 변환한 것입니다.이것은 거의 모두 singing all dancing get root 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)

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

이 조작은, 부하 밸런서에서도 정상적으로 동작합니다.

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

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

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

HttpContext를 조사하는 정적 메서드를 사용할 수 있습니다.현재 호스트 ID에 따라 사용할 URL(개발 서버 또는 라이브 서버)을 결정합니다.Http Context는 더 쉬운 방법을 제공할 수도 있지만, 이것이 제가 발견한 첫 번째 옵션이며, 정상적으로 작동합니다.

보기에서 다음 스크립트를 사용할 수 있습니다.

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

ASP의 경우.NET MVC 4는 조금 다릅니다.

string url = HttpContext.Request.Url.AbsoluteUri;

이것은 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,"/" );

심플한 html과 ASP로.NET 또는 ASP.태그를 사용하는 경우 NET MVC:

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

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

웹 페이지 자체:

<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 프로젝트에 도움이 됩니다.

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

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

MVC 4의 경우:

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

이것을 내 _Layout.cshtml의 머리 속에 넣었다.

 <base href="~/" />

어쩌면 그게 더 나은 해결책일지도 몰라.

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

사용.

<a href="@baseUrl" class="link">Base URL</a>
@{
    var baseurl = Request.Url.Scheme + "://" + Request.Url.Host + ":" + Request.Url.Port + Url.Content("~");
}
@baseurl

--output http://localhost: 49626/TEST/

.net core 3.1에서는 다음 방법을 사용했습니다.

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

다음과 같은 것이 나에게 확실하게 작용했다.

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

이것도 쓸 수 있어요.면도기는 다른 것보다 사용하는 것이 좋습니다.

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>

유틸리티 클래스와 같은 프로젝트의 정적 클래스에 다음 함수를 추가합니다.

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

한 줄에 BaseUrl을 가져옵니다.

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

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

언급URL : https://stackoverflow.com/questions/1288046/how-can-i-get-my-webapps-base-url-in-asp-net-mvc

반응형