客户端IP地址的Azure云服务(经典)检索

时间:2019-05-20 09:27:22

标签: c# azure

我已经阅读了许多有关此的文章,博客,问题和答案,因此我相信这不是一个简单的标准解决方案。

我正在网络角色中运行asmx样式的网络服务,并尝试检索客户端IP地址。我有多个实例正在运行,这意味着平台会在这些实例之间提供一个外部IP地址和“负载平衡”。

这一切都很好,但是通过诸如request.UserHostAddress之类的简单方式检索客户端IP地址将返回部署的外部端口。

ServerVariables["HTTP_X_FORWARDED_FOR"]ServerVariables["X_FORWARDED_FOR"]之类的其他解决方案都返回null,并且Request.ServerVariables中没有任何携带信息的信息。

请求中可用的服务器变量的完整列表是

HTTP_CONTENT_LENGTH:1584
HTTP_CONTENT_TYPE:text/xml; charset=utf-8
HTTP_ACCEPT_ENCODING:gzip, deflate
HTTP_EXPECT:100-continue
HTTP_HOST:myhost
HTTP_SOAPACTION:myaction
HTTP_REQUEST_CONTEXT:appId=cid-###################################
HTTP_REQUEST_ID:|################################
LOCAL_ADDR: *This is the private instance ip address as expected*
REMOTE_ADDR: *This is the external port of the service*
REMOTE_HOST: *This is the external port of the service*

如何实现?

2 个答案:

答案 0 :(得分:0)

您可以检查吗?

     var Request = HttpContext.Current.Request; 
     string IP = Request.Params["HTTP_CLIENT_IP"] ??
     Request.Headers["CF-CONNECTING-IP"].ToString() ??
     Request.Headers["Forwarded"] ??
     Request.UserHostAddress; 

OWIN自托管的其他方法:

 if (Request.Properties.ContainsKey("MS_OwinContext"))
    {
    dynamic owinContext = Request.Properties["MS_OwinContext"];
    return owinContext.Request.RemoteIpAddress;
    }

还可以在Azure服务器选项https://totaluptime.com/kb/getting-the-original-client-ip-with-x-forwarded-for-in-your-code/

中启用它

答案 1 :(得分:0)

感谢任何关注此问题的人以及Oleg的尝试。在运行到Azure部署中的远程调试器时花了很多时间,但最终我发现了问题。

我们有一个老式的.asmx Web服务,它前面带有WCF服务,并带有各种“检查器”和“路由器”。一切都很丑陋,但是已经工作了很长时间了(我相信很多系统都可以!)。远程客户端地址的日志记录已经中断了一段时间,但是最近再次需要使其工作变得更加重要。

问题与WCF堆栈行为以及它们如何处理HTTP标头(而不是SOAP标头)有关。我们在Soap规范中进行了版本更改,该版本更改了一段时间后导致系统崩溃,但是通过将对路由行为的SoapProcessingEnabled设置为true可以解决此问题,这实际上会剥离所有http标头并允许不兼容的Soap服务进行通信。

由于订单执行问题,我尝试专门在其他行为中设置标题的尝试失败。

期待删除整个asmx / wcf堆栈并重新开始,但是不能完全证明几个月的开发时间!再次感谢您的帮助