2008-11-04 91 views
4

我们有几台使用负载均衡器的Web服务器。机器正在端口81上运行IIS6。从外部看,站点可通过端口80访问。机器的外部名称和名称不同。负载均衡器后面的WCF - 如何设置

我们得到的web.config

System.ServiceModel.EndpointNotFoundException: The message with To '<url>' cannot be processed at the receiver, due to an AddressFilter mismatch at the EndpointDispatcher. Check that the sender and receiver's EndpointAddresses agree. 

相关部分:

<endpoint binding="ws2007HttpBinding" bindingConfiguration="MyServiceBinding" 
    contract="MyService.IMyService" listenUriMode="Explicit" /> 

我们尝试添加listenUri,但并没有解决我们的问题。

任何想法?

回答

6
[ServiceBehavior(AddressFilterMode=AddressFilterMode.Any)] 

将该属性置于服务上解决了该问题。

+0

关于这些问题的更详细的讨论位于这里http://stackoverflow.com/questions/274984/wcf-webservice-behind-public-reverse-proxy/947276#947276 – 2011-07-29 19:08:37

1

什么是具体的负载平衡器?使用F5 BIG-IP,我们可以很容易地工作,但我们在nlb上使用相同的端口和(相对)uri作为单独的机器(因此,如果我们选择,我们可以将单个机器视为农场)。很显然,每台机器都有不同的名称,但是这种设置还允许您通过欺骗主机来测试单个服务器 - 例如,编辑您的HOSTS文件以将[您的服务器场名称]指向[测试服务器IP]。

我们最大的痛苦是SSL;使用TransportWithMessageCredential安全性,WCF拒绝入站http连接 - 所以我们必须设置nlb以在nlb和服务器节点之间重新加密 - 但不是一个大问题。

我们唯一的其他问题是在IIS中托管WCF,而WCF无法通过http(但通过https处理)正确识别预期的站点(尽管IIS很好)。为了解决这个问题,我写了一个自定义工厂,它完全忽略了http(仅在https上监听) - 它无论如何都与TransportWithMessageCredential需求巧妙地结合在一起,所以我不会为此烦恼。

我想知道如果你不通过标准端口托管,而是作为一个不同的站点(IP /主机头/等)来获得更多的喜悦。