【发布时间】:2011-04-25 15:57:30
【问题描述】:
我有一个提供对某些数据的访问的 WCF 服务。我们的客户要求限制此服务,以使给定用户只能在特定时间段内拨打这么多电话。我的想法是建立一个请求速率限制,并在该 IP 地址超过该限制时发出临时禁令。
但是,似乎只有一种方法可以使用 WCF 获取调用者的 IP:
var context = OperationContext.Current;
var props = context.IncomingMessageProperties;
var endpoint = props[RemoteEndpointMessageProperty.Name];
return ((RemoteEndpointMessageProperty)endpoint).Address;
这对我一点用处都没有,因为 RemoteEndpointMessageProperty 是使用为其提供服务的 HttpContext 的 Request.UserHostAddress 属性设置的。通常,这很好,除了我们的 Web 服务位于负载均衡器后面,这会导致 Request.UserHostAddress 始终显示负载均衡器的 IP,而不是原始调用者。
我知道使用 X-Forwarded-For 等,实际上已经在我们的负载均衡器上配置了这些,但我似乎没有任何方法可以连接到 http 请求以访问缺少的标头将 WCF 服务设置为在 ASP.NET 兼容模式下运行。这真的是我唯一的选择吗?
【问题讨论】:
标签: wcf