asp.net - WCF 位于公共(public)反向代理后面,用于流量加密

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

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

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

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

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

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

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>

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

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

最佳答案

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

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

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

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

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

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

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

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

关于asp.net - WCF 位于公共(public)反向代理后面,用于流量加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12166587/

相关文章:

c# - 来自代码隐藏的 Api POST

WCF - 如何为 NTLM 身份验证配置 netTcpBinding?

wcf - 如何在没有 WCF 客户端的情况下对 WCF 服务执行 GET Web 请求?

wpf - TemplateBinding 在某些情况下不起作用(使用 TranslateTransform 时)

silverlight - 您如何处理 Silverlight 中的验证?

c# - 从Silverlight连接到Google Analytics(分析)

asp.net - ASP 等同于 Ajax?

.net - 您可以将 .net 3.5 DLL 与 .net 2.0 网站一起使用吗?

asp.net - 将自动增量插入数据库 ASP.net

multithreading - .NET 4.5 增加 WCF 客户端调用异步?