web-dev-qa-db-fra.com

Quel est le MVC ASP.NET Core équivalent à Request.RequestURI?

J'ai trouvé un article de blog qui montre comment "caler" des choses familières comme HttpResponseMessage dans ASP.NET Core MVC, mais je veux savoir quelle est la nouvelle façon native de faire la même chose que le code suivant dans une méthode REST Post dans un contrôleur:

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

}

Dans un projet ASP.NET Core MVC, je n'arrive pas à obtenir Request.RequestUri.

J'ai essayé d'inspecter Request et j'ai pu créer une fonction comme celle-ci:

private string UriStr(HttpRequest Request)
{
    return Request.Scheme + "://" + Request.Host + Request.Path; // Request.Path has leading /
}

Je pouvais donc écrire UriStr(Request) à la place. Mais je ne suis pas sûr que ce soit vrai. J'ai l'impression de pirater mon chemin et de ne pas l'utiliser correctement.

A question connexe pour les versions antérieures non-Core ASP.NET MVC demande comment obtenir l'URL de base du site.

32
Warren P

Une façon plus propre serait d'utiliser 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;
}

(non testé, le code peut nécessiter quelques ajustements)

15
Thomas Levesque

Personnellement, j'utilise:

new Uri(request.GetDisplayUrl())

GetDisplayUrl est une méthode d'extension de l'espace de noms suivant: Microsoft.AspNetCore.Http.Extensions

55
t.ouvre

Voici un code de travail. Ceci est basé sur la réponse de @Thomas Levesque qui n'a pas bien fonctionné lorsque la demande provient d'un port personnalisé.

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