我有一个连接到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客户端连接到服务的变通办法吗?
答案 0 :(得分:3)
也许这个答案有点太明显了,但听起来就像WSDL宣传一个内部主机名作为WCF地址 - 当该地址不是真正的公共地址时。 因为IIS正在生成WSDL,所以它只是在端点地址中使用它的主机名 - 这不是你想要的,你想要代理的地址。
尝试创建WSDL文件的静态副本,并将其发布到Web服务器上。确保使用公共代理主机名将所有REFERENCES替换为内部主机名。 然后修改您的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
这可能是一个微妙的差异,以扰乱代理。