Ответ 1
Попробуйте следующее:
string baseUrl = Request.Url.Scheme + "://" + Request.Url.Authority +
Request.ApplicationPath.TrimEnd('/') + "/";
Я хочу написать небольшой вспомогательный метод, который возвращает базовый 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);
Для меня, @warlock выглядит как лучший ответ здесь до сих пор, но я всегда использовал это в прошлом;
string baseUrl = Request.Url.GetComponents(
UriComponents.SchemeAndServer, UriFormat.UriEscaped)
Или в контроллере WebAPI;
string baseUrl = Url.Request.RequestUri.GetComponents(
UriComponents.SchemeAndServer, UriFormat.Unescaped)
что удобно, поэтому вы можете выбрать желаемый формат. Я не понимаю, почему существуют две такие разные реализации, и, насколько я могу судить, этот метод и @warlock возвращают тот же результат в этом случае, но похоже, что GetLeftPart()
также будет работать для не-сервера Uri, как mailto
, например.
Я иду с
HttpContext.Current.Request.ServerVariables["HTTP_HOST"]
Я считаю, что приведенные выше ответы не учитывают, когда сайт не находится в корне сайта.
Это для контроллера WebApi:
string baseUrl = (Url.Request.RequestUri.GetComponents(
UriComponents.SchemeAndServer, UriFormat.Unescaped).TrimEnd('/')
+ HttpContext.Current.Request.ApplicationPath).TrimEnd('/') ;
Основываясь на том, что написал Warlock, я обнаружил, что корень виртуального пути необходим, если вы не размещены в корне вашей сети. (Это работает для контроллеров MVC Web API)
String baseUrl = Request.RequestUri.GetLeftPart(UriPartial.Authority)
+ Configuration.VirtualPathRoot;
Это гораздо более надежный метод.
VirtualPathUtility.ToAbsolute("~/");
Это работает для меня.
Request.Url.OriginalString.Replace(Request.Url.PathAndQuery, "") + Request.ApplicationPath;
Итак, если вы хотите получить доступ к своему доменному имени, подумайте о том, чтобы включить имя приложения в случае:
Я использую следующий код из Application_Start
String baseUrl = Path.GetDirectoryName(HttpContext.Current.Request.Url.OriginalString);
вы могли бы добавить в порт для порта 80/SSL?
что-то вроде:
if (HttpContext.Current.Request.ServerVariables["SERVER_PORT"] != null && HttpContext.Current.Request.ServerVariables["SERVER_PORT"].ToString() != "80" && HttpContext.Current.Request.ServerVariables["SERVER_PORT"].ToString() != "443")
{
port = String.Concat(":", HttpContext.Current.Request.ServerVariables["SERVER_PORT"].ToString());
}
и использовать это в конечном результате?