Encontré una publicación de blog que muestra cómo "corregir" cosas familiares como HttpResponseMessage nuevamente en ASP.NET Core MVC, pero quiero saber cuál es la nueva forma nativa de hacer lo mismo que el siguiente código en un método REST Post en un Controlador:
// POST audit/values [HttpPost] public System.Net.Http.HttpResponseMessage Post([FromBody]string value) { var NewEntity = _repository.InsertFromString(value); var msg = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Created); msg.Headers.Location = new Uri(Request.RequestUri + NewEntity.ID.ToString()); return msg; }En un proyecto ASP.NET Core MVC, parece que no puedo obtener Request.RequestUri.
Intenté inspeccionar Solicitud y pude hacer una función como esta:
private string UriStr(HttpRequest Request) { return Request.Scheme + "://" + Request.Host + Request.Path; // Request.Path has leading / } Entonces podría escribir UriStr(Request) en su lugar. Pero no estoy seguro de que eso sea correcto. Siento que me estoy abriendo camino y no estoy usando esto correctamente.
Una pregunta relacionada con las versiones anteriores que no son de Core ASP.NET MVC pregunta cómo obtener la URL base del sitio.
Personalmente, uso:
new Uri(request.GetDisplayUrl())GetDisplayUrl completamente sin escape (excepto QueryString)GetEncodedUrl : formulario con escape completo adecuado para usar en encabezados HTTP Estos son métodos de extensión del siguiente espacio de nombres: Microsoft.AspNetCore.Http.Extensions
Una forma más limpia sería usar un UriBuilder :
private static Uri GetUri(HttpRequest request) { var builder = new UriBuilder(); builder.Scheme = request.Scheme; builder.Host = request.Host.Value; builder.Path = request.Path; builder.Query = request.QueryString.ToUriComponent(); return builder.Uri; }(no probado, el código puede requerir algunos ajustes)
Aquí hay un código de trabajo. Esto se basa en la respuesta de @Thomas Levesque, que no funcionó bien cuando la solicitud proviene de un puerto personalizado.
public static class HttpRequestExtensions { public static Uri ToUri(this HttpRequest request) { var hostComponents = request.Host.ToUriComponent().Split(':'); var builder = new UriBuilder { Scheme = request.Scheme, Host = hostComponents[0], Path = request.Path, Query = request.QueryString.ToUriComponent() }; if (hostComponents.Length == 2) { builder.Port = Convert.ToInt32(hostComponents[1]); } return builder.Uri; } }