¿Cómo puedo obtener la URL base de mi webapp en ASP.NET MVC?



9 Answers

Entonces, ninguno de los enumerados aquí funcionó para mí, pero usando algunas de las respuestas, obtuve algo que funciona:

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;
}

Actualización para ASP.NET Core / MVC 6:

ASP.NET Core hace que este proceso sea un poco más doloroso, especialmente si está metido en su código. Tienes 2 opciones para llegar al HttpContext

1) Pásalo desde tu controller :

var model = new MyClass(HttpContext);

luego en el model :

private HttpContext currentContext;

public MyClass(HttpContext currentContext)
{
    this.currentContext = currentContext;
}

2) Quizás la forma más limpia es inyectarlo en su clase, que comienza registrando los tipos en su Startup:

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddMvc();

    services.AddTransient<MyClass, MyClass>();
    services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}

luego haz que se te inyecte así:

private HttpContext currentContext;

public MyClass(IHttpContextAccessor httpContextAccessor)
{
    currentContext = httpContextAccessor.HttpContext;
}

en cualquier caso, aquí está la actualización para .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}";
}
Question

¿Cómo puedo determinar rápidamente cuál es la URL raíz para mi aplicación ASP.NET MVC? Es decir, si IIS está configurado para servir mi aplicación en http://example.com/foo/bar , entonces me gustaría poder obtener esa URL de manera confiable que no implique obtener la URL actual del pedir y cortarlo de una manera frágil que se rompe si redirijo mi acción.

La razón por la que necesito la URL base es que esta aplicación web llama a otra que necesita la raíz de la aplicación web de la persona que llama para fines de devolución de llamada.




Tal vez sea la extensión o modificación de las respuestas publicadas aquí, pero utilizo simplemente la siguiente línea y funciona:

Request.Url.GetLeftPart(UriPartial.Authority) + Url.Content("~")

Cuando mi ruta es: http://host/iis_foldername/controller/action
luego recibo: http://host/iis_foldername/




El siguiente fragmento funciona muy bien para mí en MVC4, y no necesita un HttpContext disponible:

System.Web.HttpRuntime.AppDomainAppVirtualPath



En la página web en sí:

<input type="hidden" id="basePath" value="@string.Format("{0}://{1}{2}",
  HttpContext.Current.Request.Url.Scheme,
  HttpContext.Current.Request.Url.Authority,
  Url.Content("~"))" />

En el javascript:

function getReportFormGeneratorPath() {
  var formPath = $('#reportForm').attr('action');
  var newPath = $("#basePath").val() + formPath;
  return newPath;
}

Esto funciona para mi proyecto MVC, espero que ayude




Esta es una conversión de una propiedad asp.net a MVC . Es casi todo el canto de todos los bailar obtener el método de la raíz de la URL.

Declara una clase de ayudante:

namespace MyTestProject.Helpers
{
    using System.Web;

    public static class PathHelper
    {
        public static string FullyQualifiedApplicationPath(HttpRequestBase httpRequestBase)
        {
            string appPath = string.Empty;

            if (httpRequestBase != null)
            {
                //Formatting the fully qualified website url/name
                appPath = string.Format("{0}://{1}{2}{3}",
                            httpRequestBase.Url.Scheme,
                            httpRequestBase.Url.Host,
                            httpRequestBase.Url.Port == 80 ? string.Empty : ":" + httpRequestBase.Url.Port,
                            httpRequestBase.ApplicationPath);
            }

            if (!appPath.EndsWith("/"))
            {
                appPath += "/";
            }

            return appPath;
        }
    }
}

Uso:

Para usar desde un controlador:

PathHelper.FullyQualifiedApplicationPath(ControllerContext.RequestContext.HttpContext.Request)

Para usar en una vista:

@using MyTestProject.Helpers

PathHelper.FullyQualifiedApplicationPath(Request)



Tal vez es una mejor solución.

@{
   var baseUrl = @Request.Host("/");
}

utilizando

<a href="@baseUrl" class="link"Base URL</a>



Para la URL con alias de aplicación como http://example.com/appAlias/ ... Puede probar esto:

var req = HttpContext.Current.Request;
string baseUrl = string.Format("{0}://{1}/{2}", req.Url.Scheme, req.Url.Authority, req.ApplicationPath);



Esto funciona bien para mí (también con un equilibrador de carga):

@{
    var urlHelper = new UrlHelper(Html.ViewContext.RequestContext);
    var baseurl = urlHelper.Content(“~”);
}

<script>
    var base_url = "@baseurl";
</script>

Especialmente si está usando números de puerto no estándar, el uso de Request.Url.Authority parece ser una buena ventaja al principio, pero falla en un entorno LB.




Puede usar la siguiente secuencia de comandos a la vista:

<script type="text/javascript">
    var BASE_URL = '<%= ResolveUrl("~/") %>';
</script>



Esto funciona en ASP .NET MVC 4 En cualquier acción del controlador puede escribir: 1stline obtiene la URL completa + Query String. 2.ª línea elimine la ruta local y la consulta, último símbolo '/'. 3ra línea agregue el símbolo '/' en la última posición.

Uri url = System.Web.HttpContext.Current.Request.Url;
string UrlLink = url.OriginalString.Replace(url.PathAndQuery,"");
UrlLink = String.Concat(UrlLink,"/" );



Related