2010-12-27 6 views
0

Windows 서비스에서 호스팅되는 WCF 서비스가 있습니다. 이 서비스는 사용자 컴퓨터 중 하나에서 실행해야하며 다른 컴퓨터에있는 클라이언트 응용 프로그램에서 액세스합니다. 이 서비스는 BasicHttpBinding을 통해 노출됩니다. 서버는 .NET 4.0을 사용하여 C#으로 구현됩니다. 클라이언트는 .NET 3.5 (외부 요구 사항)를 사용하여 구현됩니다.WCF : 자체 호스팅 서비스에서 서비스 끝점 이름 제어

전체 WSDL을 하나의 파일 (여러 개의 XSD가 아닌)로 압축하기 위해 서비스를 약간 수정했습니다. 이를 수행하는 절차는 다음과 같습니다. here. 위의 기본 주소를 기준으로

나는 "localhost"를 엔드 포인트를 통해 서비스를 노출, 즉 : 그 엔드 포인트의 URI로 노출되어

ServiceHost serviceHost = new ServiceHost(serviceInstance, "http://localhost:8080/..."); 

.

내 문제는 VS2010의 서비스 참조 추가를 사용하여 프록시를 생성 할 때 기본 ctor가 "http : // localhost : 8080/..."끝점에 연결된 프록시를 얻게된다는 것입니다. 이것은 서비스가 클라이언트와 동일한 컴퓨터에서 호스팅되는 경우 (예 : 테스트 중)에는 제대로 작동하지만 서버와 클라이언트 컴퓨터가 분리되어있는 경우 분명히 실패합니다. 클라이언트 컴퓨터에 "http : // localhost : 8080/... ".

WSDL 파일이 포함되어

<wsdl:service name="MyService"> 
    <wsdl:port name="BasicHttpBinding_IMyService" binding="tns:BasicHttpBinding_IMyService"> 
     <soap:address location="http://localhost:8080/MyService/IMyService" /> 

, 나는에 연결하는 실제 호스트 이름을받는 다른 ctor에 사용할 수 부여,하지만 호스트의 실제 주소를 사용하여 클라이언트를 생성 주어진, 나는 가지 예상 클라이언트는이 엔드 포인트에 자동으로 연결합니다.

나는 여러 포럼에서 서버에서 localhost를 사용하는 대신 호스트 이름이나 IP를 사용할 수 있음을 확인했습니다. 그러나 호스트는 여러 호스트 이름 및/또는 IP를 가질 수 있으며 서비스는 선택할 대상을 알지 못합니다.

"실제"서버 주소 (프록시 생성에 사용 된 WSDL의 URL에 표시된대로)를 사용하도록 자동 생성 프록시를 가져 오는 방법이 있습니까?

답변

0

App.config에서 <system.serviceModel> 섹션을 지정할 수 없습니까? 어쩌면 엔드 포인트 주소를 대체 할 수 있지만 메타 주소를 확실히 대체 할 수 있습니다.

+0

app.config에서 지정할 수는 있지만 사전에 노출 될 IP/호스트 이름을 알고 있어야하며 그 사실을 알 수있는 방법이 없습니다. 예 : 호스트 이름이 외부에 공개되지 않을 수 있으며 NAT를 사용하여 IP를 변환 할 수 있습니다. – telewin

+0

일반적으로 WCF를 사용하는 제품을 제공 할 때 app.config 파일에서 편집 할 내용을 클라이언트에 알립니다. 이 방법은 아무 것도 하드 코딩되지 않으며 클라이언트는 공개 할 주소를 결정할 수 있습니다. 또한 동적 인 방법이 있습니다. 다음을보십시오. http://support.microsoft.com/kb/971842 – fejesjoco

+0

사용자가 수동으로 구성하는 것이 좋은 경험입니까? IP 주소가 변경되면 어떻게됩니까? 서비스가 중단되고 이유를 추측하기가 어려울 수 있습니다. 클라이언트 코드를 수정하여 서버 주소를 자동으로 추출하고 적절한 클라이언트 ctor를 사용하지만 자동 방법이 있기를 바랬습니다. – telewin

관련 문제