Comment afficher l'URL actuelle dans asp.net core 1.0


Réponses:


122

Vous devez obtenir l'hôte et le chemin séparément.

 @Context.Request.Host@Context.Request.Path

14
Cela ne signalera pas l'URL correcte si votre application se trouve dans un répertoire virtuel. Vous devrez préfixer la valeur Request.Path avec la valeur Request.PathBase s'il y en a une. Cela s'applique également à presque toutes les autres réponses à cette question.
padigan

Qu'est-ce que c'est @entre les deux chaînes? pouvez-vous l'expliquer?
Mohammed Noureldin

3
@MohammedNoureldin: c'est la syntaxe de la vue rasoir.
jack.pop

2
Pour les pages de rasoir, je devais utiliser à la @HttpContextplace @Context. Pour les vues partielles @Contextfonctionne. Ai-je oublié une utilisation?
Andriod

2
Il existe un moyen simple dans MVC Url.Action("Action", null, null, Request.Url.Scheme); stackoverflow.com/questions/434604/…
Dan

110

Vous avez besoin d'un schéma, d'un hôte, d'un chemin et d'une chaîne de requête

@string.Format("{0}://{1}{2}{3}", Context.Request.Scheme, Context.Request.Host, Context.Request.Path, Context.Request.QueryString)

ou en utilisant la nouvelle fonctionnalité C # 6 "Interpolation de chaîne"

@($"{Context.Request.Scheme}://{Context.Request.Host}{Context.Request.Path}{Context.Request.QueryString}")

1
Comment obtenez-vous le fragment, disons test.com/abc#123 , comment obtenez-vous le fragment # 123 de la requête?
Ray

4
@fanray Vous ne pouvez pas. Les navigateurs n'envoient pas de fragments d'URI au serveur
tmg

Pensez à utiliser UriBuilder pour créer des URL.
Erik Philips

84

Vous pouvez utiliser la méthode d'extension de Request:

Request.GetDisplayUrl()

33
Cela fonctionne si vous ajoutez @using Microsoft.AspNetCore.Http.Extensionsensuite@Context.Request.GetDisplayUrl()
Serj Sagan

2
encore en cours - La demande n'existe pas dans le contexte actuel
SeanMC

1
Gardez à l'esprit que le résumé intellisense de cette fonction indique Suitable only for display. This format should not be used in HTTP headers or other HTTP operations.Sur cette base, je pense que la solution de @ tmg est la meilleure (peut-être enveloppée dans votre propre méthode d'extension).
Gordon Glas

16

C'était apparemment toujours possible dans .net core 1.0 avec Microsoft.AspNetCore.Http.Extensions, qui ajoute une extension HttpRequestpour obtenir l'URL complète; GetEncodedUrl .

par exemple de la vue rasoir:

@using Microsoft.AspNetCore.Http.Extensions
...
<a href="@Context.Request.GetEncodedUrl()">Link to myself</a>

Depuis 2.0, ont également un chemin relatif et une requête GetEncodedPathAndQuery .


15

Utilisez la propriété AbsoluteUri de l'URI, avec .Net core, vous devez créer l'URI à partir d'une requête comme celle-ci,

 var location = new Uri($"{Request.Scheme}://{Request.Host}{Request.Path}{Request.QueryString}");

 var url = location.AbsoluteUri;

Par exemple, si l'url de la requête est « http://www.contoso.com/catalog/shownew.htm?date=today », cela renverra la même URL.


8
Des choses comme celles-ci me font penser que .Net Core est un pas en arrière à certains égards. Est-ce mieux que Request.Url dans Asp.Net d'une manière que je ne peux pas imaginer?
Soenhay

8

Vous pouvez envisager d'utiliser cette méthode d'extension (depuis l' Microsoft.AspNetCore.Http.Extensionsespace de noms:

@Context.Request.GetDisplayUrl()

Pour certains de mes projets, je préfère une solution plus flexible. Il existe deux méthodes d'extensions.

1) La première méthode crée un Uriobjet à partir des données de demande entrantes (avec certaines variantes via des paramètres facultatifs). 2) La deuxième méthode reçoit l' Uriobjet et renvoie stringau format suivant (sans barre oblique à la fin): Scheme_Host_Port

public static Uri GetUri(this HttpRequest request, bool addPath = true, bool addQuery = true)
    {
        var uriBuilder = new UriBuilder
        {
            Scheme = request.Scheme,
            Host = request.Host.Host,
            Port = request.Host.Port.GetValueOrDefault(80),
            Path = addPath ? request.Path.ToString() : default(string),
            Query = addQuery ? request.QueryString.ToString() : default(string)
        };
        return uriBuilder.Uri;
    }

    public static string HostWithNoSlash(this Uri uri)
    {
        return uri.GetComponents(UriComponents.SchemeAndServer, UriFormat.UriEscaped);
    }

Usage:

//before >> https://localhost:44304/information/about?param1=a&param2=b
        Request.GetUri(addQuery: false);
        //after >> https://localhost:44304/information/about

        //before >> https://localhost:44304/information/about?param1=a&param2=b
        new Uri("https://localhost:44304/information/about?param1=a&param2=b").GetHostWithNoSlash();
        //after >> https://localhost:44304

7
public string BuildAbsolute(PathString path, QueryString query = default(QueryString), FragmentString fragment = default(FragmentString))
{
    var rq = httpContext.Request;
    return Microsoft.AspNetCore.Http.Extensions.UriHelper.BuildAbsolute(rq.Scheme, rq.Host, rq.PathBase, path, query, fragment);
}

mais où allez-vous httpContext? Cela ne fonctionnera pas avec Microsoft.AspNetCore.Http.HttpContext.Request
Tom Stickel

7

Si vous souhaitez également obtenir le numéro de port de la demande, vous devrez y accéder via leRequest.Host propriété pour AspNet Core.

La Request.Hostpropriété n'est pas simplement une chaîne, mais plutôt un objet qui contient à la fois le domaine hôte et le numéro de port. Si le numéro de port est spécifiquement écrit sur l'URL ( par exemple "https://example.com:8080/path/to/resource"), puis en appelant Request.Hostvous donnera le domaine hôte et le numéro de port comme ceci: "example.com:8080".

Si vous souhaitez uniquement la valeur du domaine hôte ou uniquement la valeur du numéro de port, vous pouvez accéder à ces propriétés individuellement (c'est Request.Host.Host-à- dire ou Request.Host.Port).


6

La réponse acceptée m'a aidé, tout comme le commentaire de @padigan, mais si vous souhaitez inclure les paramètres de chaîne de requête comme c'était le cas pour moi, essayez ceci:

@Context.Request.PathBase@Context.Request.GetEncodedPathAndQuery()

Et vous devrez ajouter @using Microsoft.AspNetCore.Http.Extensionsla vue pour que la méthode GetEncodedPathAndQuery () soit disponible.


1

Il existe un moyen simple d'obtenir l'URL actuelle à partir d'une page Razor ou d'une classe PageModel. C'est:

Url.PageLink()

Veuillez noter que je voulais dire, les « Pages Razor ASP.NET Core ", pas le MVC.

J'utilise cette méthode lorsque je souhaite imprimer la balise meta d'URL canonique dans les pages de rasoir ASP.NET Core. Mais il ya un hic. Il vous donnera l'URL qui est censée être la bonne URL pour cette page. Laisse-moi expliquer.

Supposons que vous ayez défini un itinéraire nommé "id" pour votre page et que, par conséquent, votre URL devrait ressembler à

http://example.com/product?id=34

Le Url.PageLink () vous donnera exactement cette URL comme indiqué ci-dessus.

Maintenant, si l'utilisateur ajoute quelque chose de plus sur cette URL, disons,

http://example.com/product?id=34&somethingElse

Ensuite, vous n'obtiendrez pas ce "somethingElse" de cette méthode. Et c'est pourquoi il est parfait pour imprimer la balise meta d'URL canonique dans la page HTML.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.