2016-09-30 2 views
1

내 응용 프로그램 (ASP.NET/VB.NET) 중 하나에서 클라이언트 컴퓨터 이름을 읽어야합니다. 고객 기계를 기반으로 지불을 승인하기 위해 POS 판매 장치를 트리거합니다. 이러한 각 시스템에는 HTTP 요청을 사용하여 은행과 통신하는 독립 실행 형 소프트웨어가 설치되어 있습니다. 다음 .NET 코드를 사용하여 클라이언트 컴퓨터 이름을 읽습니다.호스트 이름이 때때로 비어 있습니다.

Dim name As String = String.Empty 
Dim hostEntry = Dns.GetHostEntry(HttpContext.Current.Request.UserHostAddress) 
If hostEntry.HostName.Contains(".") Then 
    name = hostEntry.HostName.Substring(0, hostEntry.HostName.IndexOf(".")) 
Else 
    name = hostEntry.HostName.Trim 
End If 

개발 환경에서 모든 시스템은 도메인 ("xyz.com")에 있으므로 아무런 문제가 없습니다. 고객 위치에는 도메인 이름 설정이 없습니다. 위의 논리는 클라이언트 환경의 일부 시스템에서 잘 작동하고 결제를 할 수 있지만 대부분의 시스템에서 로직이 실패하고 호스트 이름을 읽을 수 없습니다. 어떤 도움을 주시면 감사하겠습니다.

답변

0

클라이언트 컴퓨터에서 방화벽 설정에 문제가있어서 .NET 코드가 제대로 작동하지 않습니다. xyz.com에서 들어오는 모든 요청에 ​​예외를 추가 한 후 내 코드는 문제없이 작동합니다.

감사합니다. @ Alexander Higgins, 도움을 청합니다.

0

당신은 X-Forwarded-For 헤더

는 X-전달-의 경우 (XFF) HTTP 헤더 필드에서 가져가 시도 할 수는 웹 에 연결하는 클라이언트의 원래 IP 주소를 식별 위한 일반적인 방법입니다 서버를 HTTP 프록시 또는로드 밸런서를 통해로드합니다.

는 X-전달-의 경우는 반환해야합니다 것입니다 :

X는-전달-의 경우 : 클라이언트, proxy1, 여기 PROXY2

몇 가지 예제 코드 :

string ip = Request.ServerVariables["HTTP_X_FORWARDED_FOR"] ; 
if (!string.IsNullOrEmpty(ip)) 
{ 
    string[] ipRange = ip.Split(','); 
    ip = ipRange[0]; 
} 
else 
{ 
    ip = Request.ServerVariables["REMOTE_ADDR"]; 
} 
2

귀하의 질문에 귀하의 질문에 답변하는 데 필요한 구체적인 내용이 없습니다. 정답을 내기 위해 두 환경 모두에 대해 대답해야 할 많은 질문이 있습니다. 나는 질문을 할 수 없으므로, 나는이 게시물의 미래 독자들에게 적용될 수있는 몇 가지 가정을하고 그들을 도울 수있을 것이다.

나는 질문을하지만 내 프로필은 몇 가지 알려지지 않은 이유로 포크가되어서 질문을하는 데 필요한 평판이 없습니다. 그것은 내가 박쥐를 식별하고 문제에 대한 해결책을 제안 할 수있는 문제 목록을 살펴보고 해결 방법을 찾게 될 것이라고 말했다.

이렇게 ...

1) 클라이언트 시스템 이름을 읽어야한다고 나와 있습니다. 그러나 응용 프로그램이 내부 LAN (일명 인트라넷)에서 실행되고 있지 않으면 클라이언트 컴퓨터 이름을 읽을 수 없습니다. 그래서 이것이 첫 번째 문제 일 수 있습니다.

2) 포인트 1을 결합하여 클라이언트의 UserHostAddress에서 IP 주소를 읽고 DNS 호스트 이름을 조회하고 호스트 조회가 성공하면 첫 번째 부분이 첫 번째 "." 개발 환경과 클라이언트 환경 모두에서 LAN에서 실행되는 인트라넷 응용 프로그램이라고 가정하는 것이 안전해야합니다. 이 가정과 모든 컴퓨터에 xyz.com이라는 도메인이 있다고 가정하면 개발 환경의 DNS가 아마도 Active Directory (AD)를 통해 동적으로 업데이트된다고 가정 할 수 있습니다. 이 경우 개발 네트워크의 클라이언트 컴퓨터가 AD를 통해 IP를 요청할 때마다 AD와 통합 된 DHCP 서버가 새 IP 주소를 발급합니다. DHCP 제공이 인정되고 클라이언트 AD에 의해 승인되면 AD는 클라이언트 컴퓨터의 컴퓨터 이름이 IP 주소를 가리키는 호스트 항목을 추가하여 DNS (Windows 네트워크의 경우 AD 통합)를 업데이트합니다.또한 구성에 따라 DNS 포인터를 AD의 DNS에 추가하여 IP 주소 조회가 레코드 (이 경우 클라이언트의 시스템 이름)로 해석되도록 할 수 있습니다. 따라서 개발 환경 (Windows Active Directory 도메인에서 실행 중일 수 있음)을 사용하면 모든 작업이 가능합니다. 기본적으로 최상위 도메인 이름 (XYZ.COM)은 클라이언트의 초기 DNS 요청에서 클라이언트 컴퓨터 이름에 추가됩니다.

3) 클라이언트가 추가 질문이있는 도메인을 실행하고 있지 않습니다. 그들은 창문을 운영하고 있습니까? 실행중인 창인 경우 비 광고 환경 (예 : 작업 그룹)입니다. 첫 번째 가정은 AD 통합이 아니거나 다른 경우가있을 수있는 몇 가지 드문 시나리오를 생각할 수 있지만이 문제가 발생하지 않을 가능성이 가장 높습니다. 그러나 DNS 서버가 실행 중인지, DHCP 서버가 실행 중인지와 관련된 질문이있을 수 있습니다. 응용 프로그램이 네트워크에서 클라이언트 IP 주소를 사용하려고 시도하고 IP를 기반으로하는 호스트 이름 조회에 실패했습니다. 이유는 자신의 환경에서 IP 주소에서 호스트 이름을 가져올 수 없기 때문입니다. 고객. 그들이 AD에있을 수 있고 DNS 서버가 완전히 압도되어 2 초 내에 응답하지 않으면 이름 조회가 실패하지만 속도가 달라질 수 있습니다. 더 많은 정보를 얻었다면 더 많은 것을 도울 수있었습니다.

3) AD에 있지 않다고 가정하면 응용 프로그램이 실행중인 컴퓨터에서 수동으로 호스트 이름을 코딩 할 수 있습니까? 예를 들어 yourapp.exe가 client-server-01을 실행하고 클라이언트가이 클라이언트에 연결한다고 가정 해 보겠습니다. 그런 다음 client-server-01에서 연결할 클라이언트 네트워크의 각 PC에 대한 호스트 파일에 정적 DNS 항목을 추가 할 수 있습니다. 반면 응용 프로그램이 클라이언트 PC에서 로컬로 실행되는 경우 웹 요청의 헤더로 시스템 이름을 전달한 다음 서버의 Request.Headers 변수에서 시스템 이름을 읽을 수 있습니다.

4) 다시 클라이언트가 웹 기반이고 클라이언트 환경의 응용 프로그램이 서버에서 호스팅되고 있음 ... 클라이언트 환경 외부의 DMZ에있는 서버가 있습니까? 그렇다면 최상의 환경에 따라 클라이언트 환경을 구성하는 서버가 웹 응용 프로그램을 호스트하는 DMZ에 있고 DNS에 대한 요청이 클라이언트의 ISP로 전달되고 DNS 서버가 가능한 네트워크로 되돌아 가지 않습니다 내부 IP를 클라이언트 시스템 이름으로 해석합니다. 이 경우 클라이언트에서 클라이언트 컴퓨터 이름을 변수로 보내거나 로컬 IP를 서버 호스트 파일의 호스트 이름으로 코딩해야합니다 (내부 네트워크가 NAT 뒤에 있지 않고 실제 클라이언트 컴퓨터의 IP를 노출한다고 가정). DMZ 서버가 내부 DNS에 액세스하여 이에 따라 액세스를 구성 할 수 있도록 요청하십시오.

....

목록은 정말로 및 계속하지만 난 상황의 99 %에 대한 문제를 강조하고 자신의 다양한 솔루션에 대한 답변을 제공 생각합니다.

+0

알렉산더 : 내 질문에 답변 해 준 데 대해 감사드립니다. 예, 광고 설정이 없습니다. 그러나 이들은 각 POS 시스템에 공통 작업 그룹을 할당합니다. 내 질문은 당신이 클라이언트 시스템의 일부에서 어떻게 작동하는지 보는 것입니다. –

+0

응용 프로그램은 내부 LAN에서 실행됩니다. Windows OS에서 사용되는 응용 프로그램 –

+0

다음은 시나리오입니다. My xyz.com 웹 사이트는 client-server-01, client-02 ... 등에서 열람됩니다. 응용 프로그램은 client-01을 읽고 해당 이름을 IIS 서버로 보내야합니다. IIS 서버는 일부 작업을 수행 한 다음 HTTP POST 호출을 만들어 POS 시스템에 설치된 소프트웨어로 데이터를 보냅니다. 이는 클라이언트 시스템에 연결된 지불 장치를 내부적으로 트리거합니다 (클라이언트 -01). –

관련 문제