ASP.NET MVC에서 웹앱의 기본 URL을 어떻게 얻을 수 있습니까?
ASP.NET MVC 응용 프로그램의 루트 URL이 무엇인지 어떻게 빨리 확인할 수 있습니까? 즉, 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
특히 코드가 깊다면이 과정을 조금 더 고통스럽게 만듭니다. 당신이 얻을 수있는 두 가지 옵션이 있습니다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/
IIS에 의존하는 요령은 특히 멀티 홈 프로덕션 시스템에서 IIS 바인딩이 공개 URL (WCF에서보고 있음)과 다를 수 있다는 것입니다. 외부 적으로 목적을 위해 "기본"URL을 명시 적으로 정의하기 위해 구성을 사용하는 경향이 있습니다. 요청 객체에서 추출하는 것보다 조금 더 성공하는 경향이 있습니다.
다음 스 니펫은 MVC4에서 잘 작동하며 HttpContext
사용할 수 없습니다.
System.Web.HttpRuntime.AppDomainAppVirtualPath
절대 기본 URL의 경우이를 사용하십시오. HTTP와 HTTPS 모두에서 작동합니다.
new Uri(Request.Url, Url.Content("~"))
이것은 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)
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.Current를보고 호스트 ID에 따라 사용할 URL (개발 또는 라이브 서버)을 결정하는 정적 메소드가있을 수 있습니다. HttpContext는 더 쉬운 방법을 제공 할 수도 있지만 이것이 내가 찾은 첫 번째 옵션이며 제대로 작동합니다.
다음 스크립트를 볼 수 있습니다.
<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("~"))" />
자바 스크립트에서 :
function getReportFormGeneratorPath() {
var formPath = $('#reportForm').attr('action');
var newPath = $("#basePath").val() + formPath;
return newPath;
}
이것은 내 MVC 프로젝트에서 작동합니다.
나는 이것을 _Layout.cshtml의 머리에 넣었다.
<base href="~/" />
아마도 더 나은 해결책 일 것입니다.
@{
var baseUrl = @Request.Host("/");
}
사용
<a href="@baseUrl" class="link">Base URL</a>
MVC 4의 경우 :
String.Format("{0}://{1}{2}", Url.Request.RequestUri.Scheme, Url.Request.RequestUri.Authority, ControllerContext.Configuration.VirtualPathRoot);
다음은 나를 위해 제대로 작동했습니다.
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");
한 줄로 간단히 BaseUrl을 얻으십시오.
string baseUrl = new Uri(Request.Url, Url.Content("~")).AbsoluteUri;
//output example: https://stackoverflow.com
또한 이것을 사용할 수 있습니다. 면도기 페이지의 경우 다른 페이지보다 사용하는 것이 좋습니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<base href='@Url.AbsoluteContent("~/")'>
<title>@ViewBag.Title - ASP.NET Core Web Application</title>
<!-- ... -->
</head>
<body>
참고 URL : https://stackoverflow.com/questions/1288046/how-can-i-get-my-webapps-base-url-in-asp-net-mvc
'IT' 카테고리의 다른 글
프로그래밍 방식으로 안드로이드 응용 프로그램을 종료하는 방법 (0) | 2020.03.19 |
---|---|
오류 : java : 유효하지 않은 소스 릴리스 : Intellij에서 8 (0) | 2020.03.19 |
자식 무시 예외 (0) | 2020.03.19 |
점이 원 안에 있는지 테스트하기위한 방정식 (0) | 2020.03.19 |
컬렉션의 hashCode 메서드에 대한 최상의 구현 (0) | 2020.03.19 |