Comment obtenir l'URL complète de la page sur laquelle je suis en C #


163

Je dois pouvoir accéder à l'URL complète de la page sur laquelle je me trouve à partir d'un contrôle utilisateur. S'agit-il simplement de concaténer un ensemble de variables Request? Si oui, lesquels? Ou y a-t-il un moyen plus simple?


6
À quiconque dans une ferme Web à charge équilibrée .. méfiez-vous du numéro de port qui apparaît lors de l'utilisation de System.Url: stackoverflow.com/questions/7674850/…
felickz

Réponses:


155

J'utilise généralement Request.Url.ToString()pour obtenir l'url complète (y compris la chaîne de requête), aucune concaténation n'est requise.


2
Si l'URL contient '#' alors tous les caractères après # ne seront pas inclus.
Krunal Sisodiya

5
@KrunalSisodiya Je ne pense pas que le hachage d'une URL soit jamais envoyé au serveur, mais je peux me tromper.
travis

1
Request.Url.ToString()n'inclut pas queryString.
Yogesh Patel

321

Voici une liste à laquelle je me réfère normalement pour ce type d'informations:

Request.ApplicationPath :   /virtual_dir
Request.CurrentExecutionFilePath :  /virtual_dir/webapp/page.aspx
Request.FilePath :  /virtual_dir/webapp/page.aspx
Request.Path :  /virtual_dir/webapp/page.aspx
Request.PhysicalApplicationPath :   d:\Inetpub\wwwroot\virtual_dir\
Request.QueryString :   /virtual_dir/webapp/page.aspx?q=qvalue
Request.Url.AbsolutePath :  /virtual_dir/webapp/page.aspx
Request.Url.AbsoluteUri :   http://localhost:2000/virtual_dir/webapp/page.aspx?q=qvalue
Request.Url.Host :  localhost
Request.Url.Authority : localhost:80
Request.Url.LocalPath : /virtual_dir/webapp/page.aspx
Request.Url.PathAndQuery :  /virtual_dir/webapp/page.aspx?q=qvalue
Request.Url.Port :  80
Request.Url.Query : ?q=qvalue
Request.Url.Scheme :    http
Request.Url.Segments :  /
    virtual_dir/
    webapp/
    page.aspx

J'espère que vous trouverez cela utile!


1
1) Il existe également Request.RawUrl; 2) Request.Url peut lever une exception sur les «chemins demandés très mauvais».
user2864740

Réponse très utile, mais les numéros de port ne devraient-ils pas être cohérents pour éviter toute confusion (en supposant que tous les exemples correspondent à la même demande? Par exemple, Authority et Port impliquent le port 80 mais AbsoluteUri contient le port 2000)
Young Bob

Request.QueryStringretours q=qvalueseulement
Marcel

74
Request.Url.AbsoluteUri

Cette propriété fait tout ce dont vous avez besoin, le tout en un seul appel.


6
+1. C'est la meilleure réponse. Doit être préféré à Request.Url.ToString ().
Todd Menier

10

Car ASP.NET Corevous devrez le préciser:

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

Ou vous pouvez ajouter une instruction using à votre vue:

@using Microsoft.AspNetCore.Http.Extensions

puis

@Context.Request.GetDisplayUrl()

Le _ViewImports.cshtmlpourrait être un meilleur endroit pour ça@using


1
Merci. Cela a aidé!
FlyingV


9

si vous avez besoin de l'URL complète comme tout, du http à la chaîne de requête, vous devrez concaténer les variables suivantes

Request.ServerVariables("HTTPS") // to check if it's HTTP or HTTPS
Request.ServerVariables("SERVER_NAME") 
Request.ServerVariables("SCRIPT_NAME") 
Request.ServerVariables("QUERY_STRING")

2
Cela ne prend pas en compte les ports non standard (c'est-à-dire n'utilisant pas le port 80 pour http)
Spongeboy

1
vous pouvez utiliser Request.ServerVariables ("SERVER_PORT") pour la détection de port!
armen

1
Notez que cette réponse utilise la syntaxe VB.Net. En C #, utilisez Request.ServerVariables ["HTTPS"] par exemple.
jaycer

7

Mieux vaut utiliser Request.Url.OriginalStringque Request.Url.ToString()(selon MSDN )


C'est seulement mieux si vous avez vraiment besoin de la chaîne d'origine.
Dirk

@DirkThe from link to MSDN above: "La chaîne renvoyée par la méthode ToString peut contenir des caractères de contrôle, ce qui peut corrompre l'état d'une application console. Vous pouvez utiliser la méthode GetComponents avec le format UriFormat.SafeUnescaped pour supprimer les caractères de contrôle de la chaîne renvoyée . "
Eni

Exactement, et cela n'a rien à voir avec OriginalString.
Dirk

5

Merci les gars, j'ai utilisé une combinaison de vos réponses @Christian et @Jonathan pour mon besoin spécifique.

"http://" + Request.ServerVariables["SERVER_NAME"] +  Request.RawUrl.ToString()

Je n'ai pas besoin de m'inquiéter du HTTP sécurisé, j'avais besoin de la variable servername et le RawUrl gère le chemin du nom de domaine et inclut la chaîne de requête si elle est présente.


2
Vous devez également savoir que RawUrl, contrairement à Request.Url, représente l'URL de la requête d'origine non mappée si le mappage d'URL est utilisé.
harpo

SERVER_NAME ne renvoie souvent pas la "vraie" URL utilisée par le client. HTTP_HOST est probablement la meilleure forme si vous allez creuser directement .. manque également le simple HTTP-vers-un-autre-port.
user2864740

1

Si vous avez également besoin du numéro de port, vous pouvez utiliser

Request.Url.Authority

Exemple:

string url = Request.Url.Authority + HttpContext.Current.Request.RawUrl.ToString();

if (Request.ServerVariables["HTTPS"] == "on")
{
    url = "https://" + url;
}
else 
{
    url = "http://" + url;
}

1

Essayez ce qui suit -

var FullUrl = Request.Url.AbsolutePath.ToString();
var ID = FullUrl.Split('/').Last();
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.