정말 깜짝 넷윈을 .NET 메서드는 절대 url 을 얻을 수 없는 상대 uirl. 지금까지 여러 차례 논의된 그러니까말이야 있지만, 이 방법을 발견한 귀의하지않는다고 만족스러운 처리하는 것. 도와줄 수 있는 방법을 미세 조정 아래?
내 생각엔 이 모든 것이 하드 코딩 대신 왼쪽 데릭쉐퍼드와 자동 고르십시오 프로토콜 (http / https). 다른 사항은요 실로나는 누각되었습니다 (경고, 성능, 등)?
public static string GetAbsoluteUrl(string url)
{
//VALIDATE INPUT FOR ALREADY ABSOLUTE URL
if (url.StartsWith("http://", StringComparison.OrdinalIgnoreCase)
|| url.StartsWith("https://", StringComparison.OrdinalIgnoreCase))
{
return url;
}
//GET PAGE REFERENCE FOR CONTEXT PROCESSING
Page page = HttpContext.Current.Handler as Page;
//RESOLVE PATH FOR APPLICATION BEFORE PROCESSING
if (url.StartsWith("~/"))
{
url = page.ResolveUrl(url);
}
//BUILD AND RETURN ABSOLUTE URL
return "http://" + page.Request.ServerVariables["SERVER_NAME"] + "/"
+ url.TrimStart('/');
}
이 늘 내 외곽진입 이 리틀이에요 문제였다. 버추알파투틸티스토바솔우테 (레이티베어러) 참고합니다 사용할 수 있는 방법을 확장명으로 선언할 수 있는 정적 클래스.
/// <summary>
/// Converts the provided app-relative path into an absolute Url containing the
/// full host name
/// </summary>
/// <param name="relativeUrl">App-Relative path</param>
/// <returns>Provided relativeUrl parameter as fully qualified Url</returns>
/// <example>~/path/to/foo to http://www.web.com/path/to/foo</example>
public static string ToAbsoluteUrl(this string relativeUrl) {
if (string.IsNullOrEmpty(relativeUrl))
return relativeUrl;
if (HttpContext.Current == null)
return relativeUrl;
if (relativeUrl.StartsWith("/"))
relativeUrl = relativeUrl.Insert(0, "~");
if (!relativeUrl.StartsWith("~/"))
relativeUrl = relativeUrl.Insert(0, "~/");
var url = HttpContext.Current.Request.Url;
var port = url.Port != 80 ? (":" + url.Port) : String.Empty;
return String.Format("{0}://{1}{2}{3}",
url.Scheme, url.Host, port, VirtualPathUtility.ToAbsolute(relativeUrl));
}
(ASP.NET) 는, 상대 url" " 참조점 함께 고려해야 합니다. - 페이지 요청, 사용자가 설정한 것은 제어입니다 미디어인지 " relative"; 간단히 /" " 사용하는 사람은 ~?;;
'클래스' 는 간단한 방법으로 상대 Uri map_layer 변환하십시오 url 을 절대 URL (절대 URL 로 주어진 참조점을 상대치 uirl):
var uri = new Uri(absoluteUrl, relativeUrl);
만약 '사실' 는 '다음' 바솔우테우를 레이티베어러 충족되었으며 압둘테 uirl 무시됨.
이 후 어떤 것인지, 단 한 가지 문제는 여전히 참조점은 " ~ /"; Url 을 사용할 수 있습니다 (이하 '열린우리당' 이 구성자를 변환하기에 않습니다).
이것은 내 자신의 현재 위치 및 상대 경로 지정, s # 39 에서 버전 거래할 수 있는 많은 validations user& 디바이스입니다. Feel free to 리팩터링 여기에서:)
/// <summary>
/// Converts the provided app-relative path into an absolute Url containing
/// the full host name
/// </summary>
/// <param name="relativeUrl">App-Relative path</param>
/// <returns>Provided relativeUrl parameter as fully qualified Url</returns>
/// <example>~/path/to/foo to http://www.web.com/path/to/foo</example>
public static string GetAbsoluteUrl(string relativeUrl)
{
//VALIDATE INPUT
if (String.IsNullOrEmpty(relativeUrl))
return String.Empty;
//VALIDATE INPUT FOR ALREADY ABSOLUTE URL
if (relativeUrl.StartsWith("http://", StringComparison.OrdinalIgnoreCase)
|| relativeUrl.StartsWith("https://", StringComparison.OrdinalIgnoreCase))
return relativeUrl;
//VALIDATE CONTEXT
if (HttpContext.Current == null)
return relativeUrl;
//GET CONTEXT OF CURRENT USER
HttpContext context = HttpContext.Current;
//FIX ROOT PATH TO APP ROOT PATH
if (relativeUrl.StartsWith("/"))
relativeUrl = relativeUrl.Insert(0, "~");
//GET RELATIVE PATH
Page page = context.Handler as Page;
if (page != null)
{
//USE PAGE IN CASE RELATIVE TO USER'S CURRENT LOCATION IS NEEDED
relativeUrl = page.ResolveUrl(relativeUrl);
}
else //OTHERWISE ASSUME WE WANT ROOT PATH
{
//PREPARE TO USE IN VIRTUAL PATH UTILITY
if (!relativeUrl.StartsWith("~/"))
relativeUrl = relativeUrl.Insert(0, "~/");
relativeUrl = VirtualPathUtility.ToAbsolute(relativeUrl);
}
var url = context.Request.Url;
var port = url.Port != 80 ? (":" + url.Port) : String.Empty;
//BUILD AND RETURN ABSOLUTE URL
return String.Format("{0}://{1}{2}{3}",
url.Scheme, url.Host, port, relativeUrl);
}
마지막 버전은 이전의 모든 불만을 돌봐 (포트뿐만 로털 uirl, 상대 url 을 기존 상대경로를 루이스 디충) 고려할 때 현재 처리기에서 는 페이지:
public static string ConvertToAbsoluteUrl(string url)
{
if (!IsAbsoluteUrl(url))
{
if (HttpContext.Current != null && HttpContext.Current.Request != null && HttpContext.Current.Handler is System.Web.UI.Page)
{
var originalUrl = HttpContext.Current.Request.Url;
return string.Format("{0}://{1}{2}{3}", originalUrl.Scheme, originalUrl.Host, !originalUrl.IsDefaultPort ? (":" + originalUrl.Port) : string.Empty, ((System.Web.UI.Page)HttpContext.Current.Handler).ResolveUrl(url));
}
throw new Exception("Invalid context!");
}
else
return url;
}
private static bool IsAbsoluteUrl(string url)
{
Uri result;
return Uri.TryCreate(url, UriKind.Absolute, out result);
}
아직 충분히 아무것도아니야 넷윈을 사용하여 얘기입니다. 다음은 내가 됐지 호스트당:
public static string GetAbsoluteUrl(string url)
{
//VALIDATE INPUT
if (String.IsNullOrEmpty(url))
{
return String.Empty;
}
//VALIDATE INPUT FOR ALREADY ABSOLUTE URL
if (url.StartsWith("http://", StringComparison.OrdinalIgnoreCase) || url.StartsWith("https://", StringComparison.OrdinalIgnoreCase))
{
return url;
}
//GET CONTEXT OF CURRENT USER
HttpContext context = HttpContext.Current;
//RESOLVE PATH FOR APPLICATION BEFORE PROCESSING
if (url.StartsWith("~/"))
{
url = (context.Handler as Page).ResolveUrl(url);
}
//BUILD AND RETURN ABSOLUTE URL
string port = (context.Request.Url.Port != 80 && context.Request.Url.Port != 443) ? ":" + context.Request.Url.Port : String.Empty;
return context.Request.Url.Scheme + Uri.SchemeDelimiter + context.Request.Url.Host + port + "/" + url.TrimStart('/');
}
Url.Content("~/content/images/myimage.jpg")
완전 확대 될 수 있는 '/virtual_directoryname/content/images/myimage.jpg'
이 사용할 수 있는 파일 또는 이치타믈 컨트롤러거
Url 을 생성할 때 고객의 비즈니스 로직 계층, 웹 페이지 (ASP.NET) 를 사용하는 Form& 유연도를 없습니다 # 39, s 클래스 / Control& # 39 의 어솔베르거 (.) 상술합니다. , ASP.NET MVC 컨트롤러거 귀의하매 url 을 생성할 수 있는 할 수 있습니다 너무 아니라 웹 Form& 크리스티나랑 # 39 의 어솔베르거 (.) 물론 delaymins 메서드로부터 내려받습니다 우를.악타이온 (.) 비록 단 컨트롤러거 우를.악타이온 이름 및 작업 이름이 아닌 상대치 uirl.
사용하여 찾았다
>. var 열린우리당 = 새로운 Uri (바솔우테우를, 레이티베어러)
외곽진입, 다른 문제가 없다. Iis 웹 응용 프로그램은 있는 url 을 통해 호스팅된 경우 가상 디렉터리인 app 가 다음과 같습니다. '및' http://localhost/MyWebApplication1/ 상대 url 은 " /myPage"; 그런 다음 url 이 같은 ',' http://localhost/MyPage 상대치 해결됨으로 " ". 어떤 것도 문제가 있다.
따라서 이러한 문제를 극복하기 위해, 저는 기록되었으므로 우루티우스 클래스 a 에서 작동할 수 있는 클래스 라이브러리. 이에 따라 못함 , ASP.NET MVC 하지만 페이지 클래스를 따라 달라집니다. 그럼, 그럼 제 마음을 경우 추가 참조입니다 MVC 프로젝트 클래스 라이브러리 dll 않습니다 데이터베이스에구성원을 클래스용 원활하게 작동하도록 했다. 나는 IIS 웹 응용 프로그램 url 이 테스트를 통해 가상 시나리오를 디렉터리입니다 다음과 같습니다. 'http://localhost/MyWebApplication/MyPage'. 아니라는 사실을 깨달은 것을 확인할 수 있도록 하는, 가끔 우리는 절대 url 은 SSL url 이나 비사양 SSL uirl. 그래서 내 클래스 라이브러리 이를 뒷받침하듯 작성했습니까 디바이스입니다. 나는 이 클래스 라이브러리 또는 수 있도록 제한되었거나 상대치 uirl 시작되는 & # 39, 절대 uirl 상대 url / # 39 ~;).
이 라이브러리를 사용하여 호츨 수 있어요.
string absoluteUrl = UrlUtils.MapUrl("~/Contact");
되돌려줍니다: 'http://localhost/Contact' 이 때 페이지 url 입니다. 'http://localhost/Home/About'
되돌려줍니다: 'http://localhost/MyWebApplication/Contact' 이 때 페이지 url 입니다. 'http://localhost/MyWebApplication/Home/About'
string absoluteUrl = UrlUtils.MapUrl("~/Contact", UrlUtils.UrlMapOptions.AlwaysSSL);
되돌려줍니다: 'https://localhost/MyWebApplication/Contac' * 이 때 페이지 url 입니다. 'http://localhost/MyWebApplication/Home/About'
public class UrlUtils
{
public enum UrlMapOptions
{
AlwaysNonSSL,
AlwaysSSL,
BasedOnCurrentScheme
}
public static string MapUrl(string relativeUrl, UrlMapOptions option = UrlMapOptions.BasedOnCurrentScheme)
{
if (relativeUrl.StartsWith("http://", StringComparison.OrdinalIgnoreCase) ||
relativeUrl.StartsWith("https://", StringComparison.OrdinalIgnoreCase))
return relativeUrl;
if (!relativeUrl.StartsWith("~/"))
throw new Exception("The relative url must start with ~/");
UrlHelper theHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);
string theAbsoluteUrl = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) +
theHelper.Content(relativeUrl);
switch (option)
{
case UrlMapOptions.AlwaysNonSSL:
{
return theAbsoluteUrl.StartsWith("https://", StringComparison.OrdinalIgnoreCase)
? string.Format("http://{0}", theAbsoluteUrl.Remove(0, 8))
: theAbsoluteUrl;
}
case UrlMapOptions.AlwaysSSL:
{
return theAbsoluteUrl.StartsWith("https://", StringComparison.OrdinalIgnoreCase)
? theAbsoluteUrl
: string.Format("https://{0}", theAbsoluteUrl.Remove(0, 7));
}
}
return theAbsoluteUrl;
}
}