【问题标题】:WCF behind a public reverse proxy which is used for traffic encryption用于流量加密的公共反向代理后面的 WCF
【发布时间】:2012-08-23 09:26:42
【问题描述】:

我有一个连接到 WCF 服务的 Silverlight 应用程序。在我习惯的基本配置下,将此应用程序连接到其对应的 WCF 服务是没有问题的。

但是,最近,我的一个客户开始使用 Apache 反向代理。此代理是公共服务器,它仅用于通过客户端和它之间的 SSL (HTTPS) 加密 HTTP 流量。此代理将所有流量从它传递到托管我的应用程序的实际 Web 服务器。公共代理和 IIS 服务器之间的流量只是普通的 HTTP。

所以流量是这样的: 最终用户浏览器 ---HTTPS----> 公共反向代理 ----HTTP----> 托管 WCF 服务的 IIS 服务器。

反向代理和 IIS 位于两个不同的服务器上。

我无法让 Silverlight 应用程序正常运行。我不确定如何配置端点?每当我使用公共代理的地址作为我的端点地址时,我都会遇到问题。

Silverlight 应用程序通常有这样的配置:

<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IPOTemplateEditorSrv" maxBufferSize="2147483647"
                    maxReceivedMessageSize="2147483647">
                    <security mode="TransportWithMessageCredential" />
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="https://public-reverse-proxy-url/POTemplateEditorSrv.svc"
                binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IPOTemplateEditorSrv"
                contract="POEditorSrvRef.IPOTemplateEditorSrv" name="BasicHttpBinding_IPOTemplateEditorSrv" />
        </client>
    </system.serviceModel>
</configuration>

请注意,我正在使用并且我的端点地址指向反向代理的公共 HTTPS 地址。

我错过了什么吗?是否有任何其他信息可以配置代理?任何可以让我的 Silverlight 客户端连接到服务的解决方法?

【问题讨论】:

  • 在浏览器中输入网址(public-reverse-proxy-url/POTemplateEditorSrv.svc)可以直接访问服务吗?
  • 是的,我可以。我实际上尝试过,当您访问该页面时看到 WCF 生成的页面没有问题。当我这样做时,我得到的页面告诉我“您已经创建了一个服务。要测试此服务,您需要创建一个客户端并使用它来调用该服务。您可以使用 svcutil.exe 执行此操作。 ..(我正在截断收到的其余消息)”
  • 您在尝试从 Silverlight 连接时遇到了哪些问题?我的下一步是在 IE9 (F12) 或 Fiddler 中启动开发人员工具,并查看 Silverlight 客户端生成的请求(如果有)和它得到的响应(如果有的话)。
  • 问题是,当浏览器从服务器下载 Silverlight 应用程序,然后加载并运行时,它不会像它应该的那样继续请求 svc 资源,也不会像它对任何我有一个没有公共代理的应用程序。
  • 您说应用程序根本不请求 svc 资源的事实以及您收到“远程服务器返回错误...”异常的事实不要添加向上。请求要么发出并从远程服务器获得响应,要么没有。远程诊断这些事情很困难,但我可以告诉你,我们使用的是非常相似的配置(使用负载平衡器/SSL 加速器),它工作得很好。我看到的唯一区别是我们只使用“传输”安全模式。

标签: asp.net wcf silverlight wcf-binding wcf-security


【解决方案1】:

也许这个答案有点太明显了,但听起来 WSDL 只是在将一个内部主机名作为 WCF 地址进行广告 - 而该地址不是实际的公共地址。 因为 IIS 正在生成 WSDL,它只会在端点地址中使用它的主机名 - 这不是您想要的,您需要代理的地址。

尝试创建 WSDL 文件的静态副本,并将其发布到您的 Web 服务器上。确保将 ALL REFERENCES 替换为内部主机名,并使用公共代理主机名。 然后修改您的 WCF 客户端配置以指向静态 WSDL。 你可以在这里找到一个简短的解释:Supply a different endpoint address in the WSDL of a WCF web service

如果这不起作用 - 尝试使用嗅探器 (wireshark) 来捕获来回发送的内容 - 禁用 HTTPS 可能是您需要从等式中删除的部分。 您的网络服务请求似乎已发送到代理,但代理无法正确处理请求 - 尝试我们的嗅探工具的完美场景。

当您使用网络浏览器向 SVC 发出直接请求时,请求将如下所示

GET /POTemplateEditorSrv.svc HTTP/1.1
Host: public-reverse-proxy-url

但是当通过 Silverlight 发送时,它可能看起来像这样

GET /POTemplateEditorSrv.svc HTTP/1.1
Host: private-server-address

这可能是一个足以扰乱代理的微妙差异。

【讨论】:

  • +1 很好的答案。具体来说(根据包含的链接),更改&lt;wsdl:service&gt;&lt;wsdl:port&gt; 中的&lt;soap:address&gt; 值。您不需要在网络服务器上托管文件;您可以简单地从您的桌面“发现”它。
  • 好的,谢谢亚当。我会试试这个并在一两天内回复你!
  • 我还没有在客户端的服务器上尝试过这个,但是这个解决方案对我来说很有意义,我会接受它。
猜你喜欢
  • 2010-09-21
  • 1970-01-01
  • 2019-03-24
  • 2010-11-09
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
  • 2015-03-12
  • 2014-06-19
相关资源
最近更新 更多