.NET - Obtenir le protocole, l'hôte et le port

229

Existe-t-il un moyen simple dans .NET d'obtenir rapidement le protocole, l'hôte et le port actuels? Par exemple, si je suis sur l'URL suivante:

http://www.mywebsite.com:80/pages/page1.aspx

Je dois retourner:

http://www.mywebsite.com:80

Je sais que je peux utiliser Request.Url.AbsoluteUripour obtenir l'URL complète, et je sais que je peux utiliser Request.Url.Authoritypour obtenir l'hôte et le port, mais je ne suis pas sûr de la meilleure façon d'obtenir le protocole sans analyser la chaîne d'URL.

Aucune suggestion?

Jeremy
la source
1
Voir ma réponse à une question similaire ici - stackoverflow.com/a/1534478/98740
WDuffy

Réponses:

172

Le code (C #) suivant devrait faire l'affaire

Uri uri = new Uri("http://www.mywebsite.com:80/pages/page1.aspx");
string requested = uri.Scheme + Uri.SchemeDelimiter + uri.Host + ":" + uri.Port;
Meule
la source
26
Ou chaîne demandée = uri.Scheme + Uri.SchemeDelimiter + uri.Authority;
tranmq
17
C'est sans doute la mauvaise réponse car elle insérera un ":" même lorsqu'il n'y a pas de port. Utiliser Uri.GetLeftPartcomme le souligne @dthrasher
gman
Notez que dans certains cas, vous souhaitez toujours concaténer avec uri.Headers ["Host"] au lieu de GetLeftPart (), par exemple derrière un proxy, votre service peut écouter sur un port différent / non standard et si vous utilisez cette URL dans un rappel (avec le port privé) l'hôte sera inaccessible.
doveryai
408

Même si @Rick a la réponse acceptée pour cette question, il existe en fait un moyen plus court de le faire, en utilisant la Uri.GetLeftPart()méthode mal nommée .

Uri url = new Uri("http://www.mywebsite.com:80/pages/page1.aspx");
string output = url.GetLeftPart(UriPartial.Authority);

Il y a une prise à GetLeftPart() . Si le port est le port par défaut du schéma, il le supprimera. Puisque le port 80 est le port par défaut pour http, la sortie de GetLeftPart()dans mon exemple ci-dessus sera http://www.mywebsite.com.

Si le numéro de port avait été autre que 80, il serait inclus dans le résultat.

dthrasher
la source
12
C'est le meilleur exemple à mon avis. Cela fonctionne pour localhost: port et instances en direct.
The Muffin Man,
13
GetLeftPart - vraiment, un joli nom OMG.
Valentin Kuzub
Est-ce que quelqu'un sait si cette partie de l'URL a un nom utilisé commun? En JavaScript, il s'appelle Origin, mais je ne suis pas sûr que ce soit universellement accepté: serverfault.com/questions/757494/…
Dirk Boer
1
Microsoft utilise le terme «Autorité» pour cela, mais je ne sais pas si c'est un terme standard. Voir stackoverflow.com/questions/2142910/…
dthrasher
1
Personnellement, je n'aime pas utiliser la Uriclasse de cette façon. Il existe une multitude de cas où ce constructeur lèvera une exception. Dans la plupart des cas, je préfère que mon code soit un peu plus indulgent avant d'interrompre la tâche en cours.
Jonathan Wood
60

Eh bien, si vous faites cela dans Asp.Net ou avez accès à HttpContext.Current.Request, je dirais que ce sont des moyens plus simples et plus généraux de les obtenir:

var scheme = Request.Url.Scheme; // will get http, https, etc.
var host = Request.Url.Host; // will get www.mywebsite.com
var port = Request.Url.Port; // will get the port
var path = Request.Url.AbsolutePath; // should get the /pages/page1.aspx part, can't remember if it only get pages/page1.aspx

J'espère que ça aide. :)

Holger
la source
1
Je préfère cette méthode, je peux obtenir juste le morceau que je veux et je n'ai pas à me soucier de savoir si la chaîne est suffisamment bien formée pour obtenir le port. +1
Jrud
Quelques détails sur ces propriétés: blog.jonschneider.com/2014/10/…
Jon Schneider
33

Une manière plus structurée d'obtenir ceci est d'utiliser UriBuilder. Cela évite la manipulation directe des chaînes.

var builder = new UriBuilder(Request.Url.Scheme, Request.Url.Host, Request.Url.Port);
Haonan Tan
la source
23

Request.Url vous renverra l' URI de la demande. Une fois que vous avez cela, vous pouvez récupérer à peu près tout ce que vous voulez. Pour obtenir le protocole, appelez le Scheme propriété .

Échantillon:

Uri url = Request.Url;
string protocol = url.Scheme;

J'espère que cela t'aides.

Dale Ragan
la source
20

Encore plus court, peut nécessiter ASP.Net plus récent:

string authority = Request.Url.GetComponents(UriComponents.SchemeAndServer,UriFormat.Unescaped)

L'énumération UriComponents vous permet de spécifier le ou les composants de l'URI que vous souhaitez inclure.

Mark Shapiro
la source
1
Génial, car cela fonctionne en PCL (.GetLeftPart () n'est pas disponible là-bas)
Sascha
10

Très similaire à la réponse de Holger. Si vous avez besoin de saisir l'URL, vous pouvez faire quelque chose comme:

Uri uri = Context.Request.Url;         
var scheme = uri.Scheme // returns http, https
var scheme2 = uri.Scheme + Uri.SchemeDelimiter; // returns http://, https://
var host = uri.Host; // return www.mywebsite.com
var port = uri.Port; // returns port number

La classe Uri fournit toute une gamme de méthodes, beaucoup que je n'ai pas répertoriées.

Dans mon cas, je devais saisir LocalHostle Port Number, alors voici ce que j'ai fait:

var Uri uri = Context.Request.Url;
var host = uri.Scheme + Uri.SchemeDelimiter + uri.Host + ":" + uri.Port; 

Qui a réussi à saisir: http://localhost:12345

benscabbia
la source