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/
답변
다음 스 니펫은 MVC4에서 잘 작동하며 HttpContext
사용할 수 없습니다.
System.Web.HttpRuntime.AppDomainAppVirtualPath
답변
IIS에 의존하는 요령은 특히 멀티 홈 프로덕션 시스템에서 IIS 바인딩이 공개 URL (WCF에서보고 있음)과 다를 수 있다는 것입니다. Request 객체에서 추출하는 것보다 약간 더 성공하는 경향이 있으므로 외부 목적으로 “기본”URL을 명시 적으로 정의하기 위해 구성을 사용하는 경향이 있습니다.
답변
절대 기본 URL의 경우이를 사용하십시오. HTTP와 HTTPS 모두에서 작동합니다.
new Uri(Request.Url, Url.Content("~"))