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

102

Dans les versions précédentes d'asp.net, nous pourrions utiliser

@Request.Url.AbsoluteUri

Mais il semble que cela ait changé. Comment pouvons-nous faire cela dans asp.net core 1.0?

oneNiceFriend
la source
6
@DavidG Il semble que vous puissiez maintenant utiliser UriHelper.GetDisplayUrl (Re‌ quest)
Mark G

Réponses:

122

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

 @[email protected]
Clint B
la source
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}")
tmg
la source
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()
AlexBar
la source
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 .

mcNux
la source
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.

Dhanuka777
la source
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
user3172616
la source
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);
}
Sergey
la source
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).

Hallmanac
la source
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:

@[email protected]()

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

Christopher King
la source
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.

Emran Hussain
la source