2009-02-25 52 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> 

這正常發展,當我訪問我的本地機器上運行的服務。當我部署它的WSDL包含絕對路徑仍然指向爲localhost:

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

所以,我可以改變httpGetUrl在App.config像這樣:

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

而且現在的WSDL作品正確地在該服務器上。問題是我必須在每個部署的app.config中手動設置地址。

有沒有辦法可以:
1.有沒有wsdl已經包含了一切,以便沒有進口?

2.在wsdl import語句中使用相對路徑?

或其他任何建議,將不勝感激。我有兩個部署自動化的開發服務器,如果只是它不適合這個wsdl問題。

由於這只是爲了生成代理,我想我可以生成代理並自行分發,但我寧願讓用戶自己生成代理。

謝謝! Daniel

回答

2

Daniel Richardson上面留下的答案是一個很好的答案,我認爲對於大多數人來說,這將是首選解決方案。但是,由於我們的網絡佈局和少數人需要訪問我們的服務器,我正在做一些有點不同的事情。

我改變了我的應用程序。配置有包含「myServiceServer」的httpGetUrl:

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

要使用我的服務,有人先在「myServiceServer」映射到正確的IP地址的主機文件條目添加。這適用於我們的問題,因爲無法從任何常用計算機名稱或IP地址解析IP地址。這是因爲分離的網絡只能通過VPN與某種NAT進行連接。

3

您可以以編程方式設置httpGetUrl的值,並將其設置爲絕對地址,其中包括服務所在的服務器的機器名稱。生成的WSDL中的導入語句也將使用服務器的機器名稱。

如果您正在爲您創建WCF主機(例如,您在IIS下託管),那麼您將需要創建自定義ServiceHostFactory以訪問ServiceHost。例如:

<%@ 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

這幾乎是我如何做到這一點。 – 2009-03-03 17:14:22