Asp.net自托管的WCF服务WSDL与相对路径

问题描述:

我正在研究将部署到各种服务器的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

Daniel Richardson上面留下的答案是一个很好的答案,我认为对于大多数人来说,这将是首选解决方案。但是,由于我们的网络布局和少数人需要访问我们的服务器,我正在做一些有点不同的事情。

我改变了我的应用程序。配置有包含“myServiceServer”的httpGetUrl:

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

要使用我的服务,有人先在“myServiceServer”映射到正确的IP地址的主机文件条目添加。这适用于我们的问题,因为无法从任何常用计算机名称或IP地址解析IP地址。这是因为分离的网络只能通过VPN与某种NAT进行连接。

您可以以编程方式设置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