.NET-프로토콜, 호스트 및 포트 가져 오기


228

.NET에서 현재 프로토콜, 호스트 및 포트를 신속하게 얻는 간단한 방법이 있습니까? 예를 들어 다음 URL에있는 경우 :

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

나는 돌아와야한다 :

http://www.mywebsite.com:80

나는 내가 사용할 수 있다는 것을 안다 Request.Url.AbsoluteUri 전체 URL을 얻을, 나는 내가 사용할 수 있습니다 알고 Request.Url.Authority호스트와 포트를 얻기 위해,하지만 난 URL 문자열을 구문 분석하지 않고 프로토콜을 얻을 수있는 가장 좋은 방법을 모르겠어요.

어떤 제안?


1
여기에 simlar 질문에 대한 내 대답을 참조하십시오 - stackoverflow.com/a/1534478/98740
WDuffy

답변:


172

다음 (C #) 코드는 트릭을 수행해야합니다.

Uri uri = new Uri("http://www.mywebsite.com:80/pages/page1.aspx");
string requested = uri.Scheme + Uri.SchemeDelimiter + uri.Host + ":" + uri.Port;

26
또는 요청 된 문자열 = uri.Scheme + Uri.SchemeDelimiter + uri.Authority;
tranmq

17
포트가없는 경우에도 ":"을 삽입하므로 이것은 정답이 아닙니다. Uri.GetLeftPart@dthrasher가 지적한대로 사용
gman

경우에 따라 GetLeftPart () 대신 uri.Headers [ "Host"]와 연결하려고합니다. 예를 들어 프록시 뒤에서 서비스가 다른 / 비표준 포트에서 수신 대기 중일 수 있습니다. 호스트에 콜백 (개인 포트 사용)에 연결할 수 없습니다.
doveryai

408

@Rick 이이 질문에 대한 대답을 받아 들였지만 실제로 이름이 잘못된 방법을 사용하여이를 수행하는 더 짧은 방법이 Uri.GetLeftPart()있습니다.

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

GetLeftPart()그러나 하나의 캐치가 있습니다. 포트가 구성표의 기본 포트이면 제거됩니다. 포트 80은 http의 기본 포트이므로 GetLeftPart()위의 예에서 출력 은 다음과 같습니다.http://www.mywebsite.com .

포트 번호가 80이 아닌 다른 포트 번호 인 경우 결과에 포함됩니다.


12
이것은 내 의견으로는 가장 좋은 예입니다. localhost : port 및 live 인스턴스에서 작동합니다.
머핀 맨

13
GetLeftPart-OMG 멋진 이름 지정.
Valentin Kuzub

URL 의이 부분에 공통적으로 사용되는 이름이 있는지 아는 사람이 있습니까? JavaScript에서는 Origin이라고 불리지 만 이것이 보편적으로 합의되었는지 확실하지 않습니다 : serverfault.com/questions/757494/…
Dirk Boer

1
Microsoft는이를 위해 "권한"이라는 용어를 사용하지만 이것이 표준 용어인지는 잘 모르겠습니다. 참조 stackoverflow.com/questions/2142910/...
dthrasher

1
나는 개인적으로 Uri이런 식으로 수업을 사용하는 것을 좋아하지 않습니다 . 이 생성자가 예외를 발생시키는 경우가 많이 있습니다. 대부분의 경우, 작업을 중단하기 전에 코드를 조금 더 용서하는 것이 좋습니다.
Jonathan Wood

60

Asp.Net 에서이 작업을 수행하거나 HttpContext.Current.Request에 액세스 할 수 있다면 더 쉽고 일반적인 방법입니다.

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

이게 도움이 되길 바란다. :)


1
나는이 방법을 선호한다. 나는 내가 원하는 피스를 얻을 수 있고 문자열이 포트를 얻기에 충분히 형성되어 있는지에 대해 걱정할 필요가 없다. +1
Jrud

이러한 속성에 대한 좀 더 자세한 사항 : blog.jonschneider.com/2014/10/...
존 슈나이더

33

이것을 얻는 더 체계적인 방법은 UriBuilder를 사용하는 것입니다. 이것은 직접적인 문자열 조작을 피합니다.

var builder = new UriBuilder(Request.Url.Scheme, Request.Url.Host, Request.Url.Port);

23

Request.Url은 요청 의 Uri 를 반환합니다 . 일단 가지고 있으면 원하는 것을 거의 얻을 수 있습니다. 프로토콜을 얻으려면 Scheme을 호출하십시오. 속성을 .

견본:

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

도움이 되었기를 바랍니다.


20

더 짧은 방법 일지라도 최신 ASP.Net이 필요할 수 있습니다.

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

UriComponents 열거 형을 사용하면 포함 할 URI의 구성 요소를 지정할 수 있습니다.


1
이 PCL에서 작동하기 때문에 우수함, (.GetLeftPart ()을 사용할 수있다 istn't)
샤샤

10

Holger의 답변과 매우 유사합니다. URL을 가져와야 할 경우 다음과 같은 작업을 수행 할 수 있습니다.

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

열린 우리당 클래스 내가 나열되지 않은 방법의 전체 범위, 많은을 제공합니다.

내 경우에는와 LocalHost함께 가져 가야했기 Port Number때문에 이것이 내가 한 일입니다.

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

성공적으로 잡은 것 : http://localhost:12345

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.