如何将WSDL URL从内部机器名更改为public?

我有一个简单的服务,我部署到Azure。 可通过以下方式访问:

http://xxxxxxxxxxxxxxxxxxxxxxx.cloudapp.net/MyTestService.svc 

WSDL的URL使用内部机器名称而不是公用DNS:

 svcutil.exe http://rd001520d328923a/MyTestService.svc?wsdl 

显然,这个WSDL不能从机器外部访问。

我知道有几件事情可以改变,如果你在IIS中运行它,或者如果你知道服务的URL。 例如,更改<serviceMetadata>configuration来指定httpGetUrl属性,但是这不起作用,因为我必须包含绝对URL。 使用相对URL,它仍然使用内部机器名称。 真正的问题是WSDL包含了与机器名称相关的URL引用,因此使其无效。

有两个不合标准的解决方法:

  • 有人build议,我可以抓住WSDL,编辑它来修复这些URL,然后上传它,以便从不同的URL访问。

  • 我发现从2010年初开始有一个修复程序可用,但是有一个更好的方法。

如何才能解决这个公众面临的DNS而不是机器名?

好。 我已经看了近一个星期了。 我终于find了答案,因为它不容易获得,我希望这被索引,节省时间为他人。

基本上这个整体行为作为WCF 3.0 / 3.5的一个已知问题,为此他们发布了一个修补程序。 您可以在这里find更多: FIX:WCF WSDL文档中的URI引用不可访问的内部实例,而不是负载均衡器…

在我的研究中,我曾经遇到过几次这样的问题,但从来没有给出过第二个想法,主要是因为我不知道如何将修补程序部署到Azure中。

幸运的是,MSDN论坛上的微软版主指出,这已经在.net 4.0中修复了。 这意味着上述知识库文章中推荐的“修复”仍然适用,除了不需要应用修补程序。 那么解决scheme是什么? 简单来说,将以下内容添加到configuration文件中:

 <serviceBehaviors> <behavior name="<name>"> <!-- Other options would go here --> <useRequestHeadersForMetadataAddress> <defaultPorts> <!-- Use your own port numbers --> <add scheme="http" port="81" /> <add scheme="https" port="444" /> </defaultPorts> </useRequestHeadersForMetadataAddress> </behavior> </serviceBehaviors> 

就是这样。 如果现在这个问题已经得到解决,情况就会变得更加清楚,那么这将是一个更简单的搜查。 也许我看起来不够坚硬。

使用请求标题的元数据地址的博客文章类似于
维克多的答案 ,但解释说,默认端口是可选的,可以省略:

 <system.serviceModel> <behaviors> <serviceBehaviors> <behavior> <useRequestHeadersForMetadataAddress/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> 

它还展示了如何在代码中启用行为。

 sh.Description.Behaviors.Add(new UseRequestHeadersForMetadataAddressBehavior()); 

您是为了发布WSDL而生成WSDL吗?还是只是在另一个项目中添加引用?

如果是后者,我的build议是使用WCF ChannelFactory方法而不是“添加服务引用”。 我发现它给了我更一致的可控结果。

http://msdn.microsoft.com/en-us/library/ms734681.aspx

我必须补充一点,我没有在Azure上试过这个。