我已经阅读了许多有关此的文章,博客,问题和答案,因此我相信这不是一个简单的标准解决方案。
我正在网络角色中运行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*
如何实现?
答案 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堆栈并重新开始,但是不能完全证明几个月的开发时间!再次感谢您的帮助