[C#] 사이트의 baseurl을 어떻게 얻을 수 있습니까?

사이트의 기본 URL을 반환하는 작은 도우미 메서드를 작성하고 싶습니다. 이것이 내가 생각해 낸 것입니다.

public static string GetSiteUrl()
{
    string url = string.Empty;
    HttpRequest request = HttpContext.Current.Request;

    if (request.IsSecureConnection)
        url = "https://";
    else
        url = "http://";

    url += request["HTTP_HOST"] + "/";

    return url;
}

당신이 생각할 수있는 실수가 있습니까? 누구든지 이것을 개선 할 수 있습니까?



답변

이 시도:

string baseUrl = Request.Url.Scheme + "://" + Request.Url.Authority +
    Request.ApplicationPath.TrimEnd('/') + "/";


답변

string baseUrl = Request.Url.GetLeftPart(UriPartial.Authority)

그게 다야;)


답변

불행히도 인기있는 GetLeftPart솔루션은의 PCL 버전에서 지원되지 않습니다 Uri. GetComponents그러나 이식성이 필요한 경우 다음과 같은 트릭을 수행해야합니다.

uri.GetComponents(
    UriComponents.SchemeAndServer | UriComponents.UserInfo, UriFormat.Unescaped);


답변

사이트가 웹 사이트의 루트에 있지 않은 경우 위의 답변은 고려하지 않는다고 생각합니다.

이것은 WebApi 컨트롤러 용입니다.

string baseUrl = (Url.Request.RequestUri.GetComponents(
                    UriComponents.SchemeAndServer, UriFormat.Unescaped).TrimEnd('/')
                 + HttpContext.Current.Request.ApplicationPath).TrimEnd('/') ;


답변

나에게 @warlock은 지금까지 가장 좋은 대답처럼 보이지만 과거에는 항상 이것을 사용했습니다.

string baseUrl = Request.Url.GetComponents(
    UriComponents.SchemeAndServer, UriFormat.UriEscaped)   

또는 WebAPI 컨트롤러에서;

string baseUrl = Url.Request.RequestUri.GetComponents(
    UriComponents.SchemeAndServer, UriFormat.Unescaped)

원하는 이스케이프 형식을 선택할 수있어 편리합니다. 왜 두 가지 다른 구현이 있는지 분명하지 않으며,이 방법과 @ warlock ‘s 가이 경우에도 동일한 결과를 반환하지만 GetLeftPart()서버 비 Uri의 mailto태그 와 같은 경우 에도 작동 하는 것처럼 보입니다. .


답변

이것은 훨씬 더 바보 같은 방법입니다.

VirtualPathUtility.ToAbsolute("~/");


답변

나는 함께 간다

HttpContext.Current.Request.ServerVariables["HTTP_HOST"]