1

如标题中所述,我遇到了问题。一些背景信息。

有一个这样的 URLhttps://external_server.something.xy/SomeService/Something通过反向代理暴露给外界。

  • 反向代理剥离 HTTPS 并将流量作为纯 HTTP 转发到 WCF 服务,并将 HTTPS 应用于响应。
  • 绑定是 basicHttpBinding (with <transport clientCredentialType="Basic" proxyCredentialType="None" realm="" />)。

由于这个和一些合同原因,静态 WSDL 文件 (Something.wsdl) 被分发给客户端。唉,仍然有很多代码可以在没有分布式静态 WSDL 文件的情况下检索 WSDL,然后动态生成调用(无论出于何种原因)。

如果我在配置文件中设置,<serviceMetadata httpGetEnabled="true" externalMetadataLocation="../Something.wsdl"/>客户将受到HTTP 307 临时重定向的欢迎。

无论如何,通过一些研究,我发现设置 IIS 主机标头也会影响同一 IIS 上的许多其他应用程序。这是一个不可行的解决方案。我可以在 web.config 中配置什么,还是应该在服务器或反向代理上调查 URL 重写方案?

额外的好处是,如果我可以设置帮助页面上显示的 URL,使其不显示内部服务器(这样链接也可以工作!)。

4

2 回答 2

2

我们遇到了类似的问题并通过简单地将静态 WSDL 放在路由器上(我认为这就是您所说的反向代理)并关闭服务本身的 serviceMetadata 来处理它。

于 2012-07-03T22:27:53.580 回答
2

为了回答我自己的问题,我(或我们)在反向代理上重新编写了请求,因此它对客户端和内部服务器是透明的。现在它截获对该服务的元数据查询,并将它们指向静态 WCF 文件(通过帮助页面中显示的 URI),然后返回该文件。

问题是当我使用externalMetadaLocation标记时,IIS 返回 HTTP 307,然后反向代理将其中继到客户端。当然,内部服务器不知道外部地址,因此重定向使用内部名称,因此存在问题。

我在想的另一个选择是编写一个与Something匹配的 REST 函数?wsdl是 Web 服务的一部分,因此它不会到达 WCF 元数据设施。在考虑了一段时间之后,我开始考虑使用IWsdlExceportExtension来完成接收请求的工作,然后抓取文件并返回它(即,没有重定向)。

于 2012-07-06T05:57:23.647 回答