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?

Loups rouges
la source
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.

Travis
la source
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!

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

DévelopperChris
la source
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

Serj Sagan
la source
1
Merci. Cela a aidé!
FlyingV
9

Request.RawUrl

FlySwat
la source
7
cela ne renvoie pas l'URL complète. Si l'URL complète est blah.com/1.1/home/main?a=1 Request.RawUrl renverra 1.1 / hom / main? A = 1
jnoreiga
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")
Christian Hagelid
la source
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 )

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

Loups rouges
la source
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;
}
IonB
la source
1

Essayez ce qui suit -

var FullUrl = Request.Url.AbsolutePath.ToString();
var ID = FullUrl.Split('/').Last();
Abhishek Kanrar
la source