【问题标题】:How to change WSDL URL from internal machine name to public?如何将 WSDL URL 从内部机器名称更改为公共名称?
【发布时间】:2011-02-15 17:40:11
【问题描述】:

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

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

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

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

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

我知道如果您在 IIS 中运行它,或者如果您知道服务的 url,则可以更改一些内容。例如,更改 <serviceMetadata> 配置以指定 httpGetUrl 属性,但这不起作用,因为我必须包含绝对 URL。使用相对 URL,它仍然使用内部机器名称。真正的问题是 WSDL 包含带有机器名称的 URL 引用,因此使其无用。

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

  • 有人建议我可以获取 WSDL,对其进行编辑以修复 URL,然后将其上传,以便可以从不同的 URL 访问它。

  • 我发现 2010 年初的修补程序可用,但必须有更好的方法。

如何使用面向公众的 DNS 而不是机器名称来解决这个问题?

【问题讨论】:

    标签: wcf azure wsdl


    【解决方案1】:

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

    基本上,这种整体行为是 WCF 3.0/3.5 的一个已知问题,他们为此发布了一个修补程序。你可以在这里找到更多信息:FIX: URIs in a WCF WSDL document refer to inaccessible internal instances instead of to the load balancer...

    我在研究过程中遇到过几次这个问题,但从来没有考虑过,主要是因为我不知道如何将修补程序部署到 Azure。

    幸运的是,MSDN 论坛的一位 Microsoft 版主指出,该问题已在 .net 4.0 中得到修复。这意味着上面的知识库文章中推荐的“修复”仍然适用,但不必应用任何修补程序。那么解决方案是什么? 很简单,将以下内容添加到配置文件中:

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

    就是这样。 如果这个问题现在已经得到解决,这将是一个更简单的搜索。可能是我看的不够仔细。

    【讨论】:

    • 这对我们来说非常有效,我们在 wsdl 中获得了 localhost 引用,现在我们获得了正确的外部地址(.NET 4.0,自托管 wcf)
    • 非常感谢,这节省了我很多时间。
    • 感谢您拯救了我的……和工作!给 url 不再起作用。
    【解决方案2】:

    博文Using Request Headers for Metadata Address类似于
    Victoranswer,但说明默认端口是可选的 并且可以省略:

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

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

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

    【讨论】:

    • 太棒了!谢谢!
    • 我不得不提到@Victor 回答中的默认端口。不知道为什么?可能是因为我的 wcf 应用程序是作为子应用程序托管的。
    【解决方案3】:

    您是生成 WSDL 以便发布它,还是只是想在另一个项目中添加引用?

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

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

    我必须补充一下,我还没有在 Azure 上尝试过。

    【讨论】:

    • 两者。我们需要我们的合作伙伴来消费它。
    • WSDL 是否在正确的 URL 上工作?我知道元数据页面显示不正确,但是为了让合作伙伴使用,您不会直接将 WSDL 路径交给他们吗? vs 将它们发送到页面以获取
    • 生成的 wsdl 也包含错误的 URL。所以'解决方案'是手动抓取wsdl,修改它上传到一个目录并给他们新的路径。
    猜你喜欢
    • 2019-05-04
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 2012-11-30
    • 2021-04-25
    • 1970-01-01
    相关资源
    最近更新 更多