IT박스

상대 URL을 전체 URL로 바꾸려면 어떻게합니까?

itboxs 2020. 11. 17. 07:55
반응형

상대 URL을 전체 URL로 바꾸려면 어떻게합니까?


이것은 아마도 예제를 통해 더 쉽게 설명 될 것입니다. "/Foo.aspx"또는 "~ / Foo.aspx"와 같은 상대 URL을 http : //localhost/Foo.aspx 와 같은 전체 URL로 바꾸는 방법을 찾으려고 합니다 . 이렇게하면 사이트가 실행되는 도메인이 다른 테스트 또는 준비에 배포 할 때 http : //test/Foo.aspxhttp : //stage/Foo.aspx가 표시 됩니다.

어떤 아이디어?


이것을 가지고 놀아 라 ( 여기에서 수정 )

public string ConvertRelativeUrlToAbsoluteUrl(string relativeUrl) {
    return string.Format("http{0}://{1}{2}",
        (Request.IsSecureConnection) ? "s" : "", 
        Request.Url.Host,
        Page.ResolveUrl(relativeUrl)
    );
}

이것은 죽을 때까지 맞았지만 다른 많은 답변보다 더 깨끗한 내 자신의 솔루션을 게시 할 것이라고 생각했습니다.

public static string AbsoluteAction(this UrlHelper url, string actionName, string controllerName, object routeValues)
{
    return url.Action(actionName, controllerName, routeValues, url.RequestContext.HttpContext.Request.Url.Scheme);
}

public static string AbsoluteContent(this UrlHelper url, string path)
{
    Uri uri = new Uri(path, UriKind.RelativeOrAbsolute);

    //If the URI is not already absolute, rebuild it based on the current request.
    if (!uri.IsAbsoluteUri)
    {
        Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
        UriBuilder builder = new UriBuilder(requestUrl.Scheme, requestUrl.Host, requestUrl.Port);

        builder.Path = VirtualPathUtility.ToAbsolute(path);
        uri = builder.Uri;
    }

    return uri.ToString();
}

를 사용하여 새 URI를 생성 한 page.request.url다음 다음을 가져 오면됩니다 AbsoluteUri.

New System.Uri(Page.Request.Url, "Foo.aspx").AbsoluteUri

이 작업을 수행하는 내 도우미 기능입니다.

public string GetFullUrl(string relativeUrl) {
    string root = Request.Url.GetLeftPart(UriPartial.Authority);
    return root + Page.ResolveUrl("~/" + relativeUrl) ;
}

Uri클래스와 일부 확장 마법을 사용하여 ASP.NET MVC에서이 작업을 수행하는 방법을 공유 할 것이라고 생각했습니다 .

public static class UrlHelperExtensions
{
    public static string AbsolutePath(this UrlHelper urlHelper, 
                                      string relativePath)
    {
        return new Uri(urlHelper.RequestContext.HttpContext.Request.Url,
                       relativePath).ToString();
    }
}

그런 다음 다음을 사용하여 절대 경로를 출력 할 수 있습니다.

// gives absolute path, e.g. https://example.com/customers
Url.AbsolutePath(Url.Action("Index", "Customers"));

중첩 된 메서드 호출이있는 것처럼 보이므로 UrlHelper일반적인 작업 메서드 를 추가로 확장 하여 수행 할 수 있습니다.

// gives absolute path, e.g. https://example.com/customers
Url.AbsoluteAction("Index", "Customers");

또는

Url.AbsoluteAction("Details", "Customers", new{id = 123});

전체 확장 클래스는 다음과 같습니다.

public static class UrlHelperExtensions
{
    public static string AbsolutePath(this UrlHelper urlHelper, 
                                      string relativePath)
    {
        return new Uri(urlHelper.RequestContext.HttpContext.Request.Url,
                       relativePath).ToString();
    }

    public static string AbsoluteAction(this UrlHelper urlHelper, 
                                        string actionName, 
                                        string controllerName)
    {
        return AbsolutePath(urlHelper, 
                            urlHelper.Action(actionName, controllerName));
    }

    public static string AbsoluteAction(this UrlHelper urlHelper, 
                                        string actionName, 
                                        string controllerName, 
                                        object routeValues)
    {
        return AbsolutePath(urlHelper, 
                            urlHelper.Action(actionName, 
                                             controllerName, routeValues));
    }
}

.NET Uri 클래스를 사용하여 상대 경로와 호스트 이름을 결합합니다.
http://msdn.microsoft.com/en-us/library/system.uri.aspx


이것은 변환을 위해 만든 도우미 함수입니다.

//"~/SomeFolder/SomePage.aspx"
public static string GetFullURL(string relativePath)
{
   string sRelative=Page.ResolveUrl(relativePath);
   string sAbsolute=Request.Url.AbsoluteUri.Replace(Request.Url.PathAndQuery,sRelative);
   return sAbsolute;
}

간단히:

url = new Uri(baseUri, url);

ASP.NET MVC에서 당신의 오버로드를 사용할 수 있습니다 HtmlHelper또는 UrlHelper그이 걸릴 protocol또는 host매개 변수를. 이러한 매개 변수 중 하나가 비어 있지 않으면 도우미는 절대 URL을 생성합니다. 이것은 내가 사용하는 확장 방법입니다.

public static MvcHtmlString ActionLinkAbsolute<TViewModel>(
    this HtmlHelper<TViewModel> html, 
    string linkText, 
    string actionName, 
    string controllerName, 
    object routeValues = null,
    object htmlAttributes = null)
{
    var request = html.ViewContext.HttpContext.Request;
    var url = new UriBuilder(request.Url);
    return html.ActionLink(linkText, actionName, controllerName, url.Scheme, url.Host, null, routeValues, htmlAttributes);
}

And use it from a Razor view, e.g.:

 @Html.ActionLinkAbsolute("Click here", "Action", "Controller", new { id = Model.Id }) 

Ancient question, but I thought I'd answer it since many of the answers are incomplete.

public static string ResolveFullUrl(this System.Web.UI.Page page, string relativeUrl)
{
    if (string.IsNullOrEmpty(relativeUrl))
        return relativeUrl;

    if (relativeUrl.StartsWith("/"))
        relativeUrl = relativeUrl.Insert(0, "~");
    if (!relativeUrl.StartsWith("~/"))
        relativeUrl = relativeUrl.Insert(0, "~/");

    return $"{page.Request.Url.Scheme}{Uri.SchemeDelimiter}{page.Request.Url.Authority}{VirtualPathUtility.ToAbsolute(relativeUrl)}";
}

This works as an extension of off Page, just like ResolveUrl and ResolveClientUrl for webforms. Feel free to convert it to a HttpResponse extension if you want or need to use it in a non-webforms environment. It correctly handles both http and https, on standard and non-standard ports, and if there is a username/password component. It also doesn't use any hard coded strings (namely ://).


Here's an approach. This doesn't care if the string is relative or absolute, but you must provide a baseUri for it to use.

    /// <summary>
    /// This function turns arbitrary strings containing a 
    /// URI into an appropriate absolute URI.  
    /// </summary>
    /// <param name="input">A relative or absolute URI (as a string)</param>
    /// <param name="baseUri">The base URI to use if the input parameter is relative.</param>
    /// <returns>An absolute URI</returns>
    public static Uri MakeFullUri(string input, Uri baseUri)
    {
        var tmp = new Uri(input, UriKind.RelativeOrAbsolute);
        //if it's absolute, return that
        if (tmp.IsAbsoluteUri)
        {
            return tmp;
        }
        // build relative on top of the base one instead
        return new Uri(baseUri, tmp);
    }

In an ASP.NET context, you could do this:

Uri baseUri = new Uri("http://yahoo.com/folder");
Uri newUri = MakeFullUri("/some/path?abcd=123", baseUri);
//
//newUri will contain http://yahoo.com/some/path?abcd=123
//
Uri newUri2 = MakeFullUri("some/path?abcd=123", baseUri);
//
//newUri2 will contain http://yahoo.com/folder/some/path?abcd=123
//
Uri newUri3 = MakeFullUri("http://google.com", baseUri);
//
//newUri3 will contain http://google.com, and baseUri is not used at all.
//

Modified from other answer for work with localhost and other ports... im using for ex. email links. You can call from any part of app, not only in a page or usercontrol, i put this in Global for not need to pass HttpContext.Current.Request as parameter

            /// <summary>
            ///  Return full URL from virtual relative path like ~/dir/subir/file.html
            ///  usefull in ex. external links
            /// </summary>
            /// <param name="rootVirtualPath"></param>
            /// <returns></returns>
            public static string GetAbsoluteFullURLFromRootVirtualPath(string rootVirtualPath)
            {

                return string.Format("http{0}://{1}{2}{3}",
                    (HttpContext.Current.Request.IsSecureConnection) ? "s" : ""
                    , HttpContext.Current.Request.Url.Host
                    , (HttpContext.Current.Request.Url.IsDefaultPort) ? "" : ":" + HttpContext.Current.Request.Url.Port
                    , VirtualPathUtility.ToAbsolute(rootVirtualPath)
                    );

            }

참고URL : https://stackoverflow.com/questions/126242/how-do-i-turn-a-relative-url-into-a-full-url

반응형