2009-02-25 2 views
3

길을 따라 여러 서버에 배포되는 WCF 응용 프로그램을 작성 중이며 언제든지 app.config를 변경할 필요가 없다는 것을 기억하고 싶습니다. 배치. 처음에는 내의 app.config의 ServiceModel은 서비스 부분이 닮은 :Asp.net 자체 호스팅 WCF 서비스 상대 경로가있는 WSDL

<system.serviceModel> 
<serviceHostingEnvironment aspNetCompatibilityEnabled="false" /> 
<behaviors> 
    <serviceBehaviors> 
     <behavior name="MyDefaultServiceBehavior"> 
      <serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:8888/MyService" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
    </serviceBehaviors> 
</behaviors> 
<services> 
    <service behaviorConfiguration="MyDefaultServiceBehavior" name="MyService"> 
     <endpoint address="net.tcp://localhost:9001/MyService" binding="netTcpBinding" contract="IMyService" name="NetTcpBinding_IMyService" /> 
    </service> 
</services> 

내 로컬 컴퓨터에서 실행중인 서비스에 액세스 할 때이 개발에서 잘 작동합니다. 그래서

<xsd:import schemaLocation=http://localhost:8888/MyService?xsd=xsd0 namespace="http://tempuri.org/" /> 

, 나는 그렇게처럼의 app.config에 httpGetUrl을 변경할 수 있습니다 :

<serviceMetadata httpGetEnabled="true" httpGetUrl=http://devserver1:8888/MyService /> 

를 그리고 이제 WSDL 작동 내가 그것을 배치 할 때, WSDL은 절대 여전히 localhost를 가리키는 경로를 포함 해당 서버에서 올바르게 문제는 배포 할 각 app.config에서 수동으로 주소를 설정해야한다는 것입니다.

다음 중 하나의 방법이 있습니까 :
1. 가져 오기가 없도록 wsdl에 이미 모든 항목이 포함되어 있습니까?
또는
2. wsdl import 문에서 상대 경로를 사용 하시겠습니까?

또는 다른 의견을 보내 주시면 감사하겠습니다. 나는이 wsdl 문제가 아니라면 배치가 자동화 된 두 개의 개발 서버를 가지고 있습니다.

프록시를 생성하기위한 것일 뿐이므로 프록시를 생성하여 직접 배포 할 수는 있지만 사용자가 직접 프록시를 생성 할 수 있다고 가정합니다.

감사합니다. Daniel

답변

2

Daniel Richardson이 남긴 대답은 좋은 생각이며, 대부분의 사람들에게 이것이 바람직한 해결책이라고 생각합니다. 그러나 우리의 네트워크 레이아웃과 우리 서버에 액세스해야하는 소수의 사람들 덕분에 나는 조금 다른 것을하고 있습니다.

내 앱이 변경되었습니다.설정은 "myServiceServer"를 포함하는 httpGetUrl 가지고 :

<serviceMetadata httpGetEnabled="true" httpGetUrl=http://myServiceServer:8888/MyService /> 

내 서비스를 이용하기를, 누군가가 먼저 올바른 IP 주소로 "myServiceServer"를 매핑하는 호스트 파일 항목에 추가 할 수 있습니다. IP 주소가 일반적인 컴퓨터 이름이나 IP 주소에서 해결 될 수 없기 때문에이 문제는 잘 해결됩니다. 이는 일종의 NAT가 진행되는 VPN에서만 연결되는 분리 된 네트워크 때문입니다.

3

프로그래밍 방식으로 httpGetUrl의 값을 설정하고 서비스가 호스트되는 서버의 컴퓨터 이름이 포함 된 절대 주소로 설정할 수 있습니다. 생성 된 WSDL의 import 문은 서버의 시스템 이름도 사용합니다.

WCF 호스트를 만들 때 (예 : IIS에서 호스팅하는 경우) ServiceHost에 액세스하려면 사용자 지정 ServiceHostFactory을 만들어야합니다. 예를 들어 :

<%@ ServiceHost Language="C#" 
       Service="WebApplication.TestService" 
       CodeBehind="TestService.svc.cs" 
       Factory="WebApplication.TestServiceHostFactory" %> 

당신이 다음의 코드는 다음과 같이 보일 것 WCF는 자신을 호스트 만드는 경우 :

using System; 
using System.ServiceModel; 
using System.ServiceModel.Activation; 
using System.ServiceModel.Description; 

namespace WebApplication 
{ 
    public class TestServiceHostFactory : ServiceHostFactory 
    { 
    protected override ServiceHost CreateServiceHost(Type serviceType, 
                 Uri[] baseAddresses) 
     { 
     ServiceHost host = base.CreateServiceHost(serviceType, 
                baseAddresses); 
     ServiceMetadataBehavior metadataBehavior = 
           new ServiceMetadataBehavior(); 
     metadataBehavior.HttpGetEnabled = true; 
     metadataBehavior.HttpGetUrl = new Uri(string.Format(
           "http://{0}/WebApplication/TestService.svc", 
           Environment.MachineName)); 
     host.Description.Behaviors.Add(metadataBehavior); 
     return host; 
     } 
    } 
} 

당신은 다음 서비스의 SVC는 파일에서,이 팩토리를 지정

ServiceHost host = new ServiceHost(typeof(WebApplication.TestService)); 
ServiceMetadataBehavior metadataBehavior = new ServiceMetadataBehavior(); 
metadataBehavior.HttpGetEnabled = true; 
metadataBehavior.HttpGetUrl = new Uri(string.Format(
           "http://{0}/WebApplication/TestService.svc", 
           Environment.MachineName)); 
host.Description.Behaviors.Add(metadataBehavior); 
+0

꽤 많이하는 방법입니다. –

+1

나를 위해 더 큰 문제는 모든 사람이 컴퓨터 이름을 사용하여 서버에 액세스 할 수 없다는 것입니다. 어떤 사람들에게는 심지어 해결되지도 않습니다. 귀하의 솔루션은 내 질문에 대한 좋은 답변이지만, 불행히도, 나는 너무 많은 질문을 단순화하고 내 문제를 해결하지 않습니다. 솔루션에 대한 다른 의견을보십시오. – Daniel

관련 문제