2009-02-25 9 views
3

Yol boyunca çeşitli sunuculara dağıtılacak bir WCF uygulaması üzerinde çalışıyorum ve her yaptığımda app.config dosyasını değiştirmeyi hatırlamak zorunda kalmak istemiyorum. bir dağıtım. İlk başta, benim app.config ServiceModel bölümde bu benziyordu:Asp.net Kendini Barındırılan WCF Hizmeti Göreli yollarla 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> 

benim yerel makinede çalışan hizmete erişme edildiğinde bu gelişmede çalışıyor. Yani

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

, ben şöyle app.config httpGetUrl değiştirebilirsiniz:

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

Ve şimdi wsdl eserlerini bunu dağıtıldığında, WSDL mutlak hala localhost işaret yolları içeriyordu Bu sunucuda doğru şekilde. Sorun, dağıtılan her bir app.config dosyasında adresi manuel olarak ayarlamam gerektiğidir.

Aşağıdakilerin bir yolu var mı:
1. wsdl zaten hiçbir şey içermeyecek şekilde hiçbir şey içermediğinden mi?
veya
2. Wsdl içe aktarma ifadelerindeki göreli yolları kullanın? Ya da başka herhangi bir öneriyi takdir etmek isteriz. Bu wsdl sorunu için olmasaydı, dağıtımın otomatikleştirildiği iki geliştirme sunucum var.

Bu yalnızca proxy üretmek için olduğundan, proxy'yi oluşturup kendim dağıtabildiğimi varsayalım, ancak kullanıcıların proxy'yi kendilerinin oluşturmasına izin vermeyi tercih ediyorum.

Teşekkürler! Daniel

cevap

2

Yukarıda Daniel Richardson tarafından bırakılan cevap iyi bir şey ve bence çoğu insan için bu tercih edilen çözüm olurdu. Ancak, ağ düzenimiz ve sunucumuza erişmesi gereken birkaç kişi nedeniyle, biraz farklı bir şey yapıyorum.

Uygulamamı değiştirdim.yapılandırma "myServiceServer" içeren bir httpGetUrl olması:

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

benim servisini kullanmak için, birisi ilk doğru IP adresine "myServiceServer" eşleştiren bir konak dosya girişindeki eklemek zorundadır. Bu, sorunumuz için iyi çalışır çünkü IP adresi herhangi bir genel makine adından veya IP adresinden çözülemez. Bunun nedeni, yalnızca bir çeşit NAT olan VPN'ler tarafından bağlanan ayrılmış ağlar olmasıdır.

3

httpGetUrl'un değerini programsal olarak ayarlayabilir ve servislerin barındırıldığı sunucunun makine adını içeren mutlak bir adrese ayarlayabilirsiniz. Üretilen WSDL'deki içe aktarma ifadeleri, daha sonra sunucunun makine adını da kullanır.

WCF ana makineniz sizin için oluşturuluyorsa (örneğin, IIS altında barınıyorsanız), ServiceHost'a erişmek için özel bir ServiceHostFactory oluşturmanız gerekir. Örneğin:

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

sonra kod aşağıdaki gibi görünecektir WCF kendinizi ev sahipliği oluşturuyorsanız:

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; 
     } 
    } 
} 

Ardından hizmetin .svc dosyasında bu fabrikayı belirtmek

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

bunu nasıl yaptığımı oldukça fazla. –

+1

Benim için daha büyük sorun, herkesin makine adını kullanarak sunucuya erişememesidir. Bazı insanlar için bile çözülmez. Çözümünüz benim soruma iyi bir cevaptır, ancak maalesef soruyu çok basitleştirdim ve sorunumu çözmedi. Çözüm için diğer yoruma bakın. – Daniel