我有一个VB.NET项目,它使用ASP.NET Web API,自托管。
我一直在尝试按照此链接(Get the IP address of the remote host)来了解如何获取客户端向我的应用程序发送消息的IP地址,但每次我尝试翻译项目时从上面引用的页面到VB.NET,我遇到了错误。
我喜欢使用他们引用的单行,如下:
var host = ((dynamic)request.Properties["MS_HttpContext"]).Request.UserHostAddress;
但是,这会将(使用Telerik的.NET转换器)转换为以下内容,从而产生错误“动态”#39;不是一种类型:
Dim host = DirectCast(request.Properties("MS_HttpContext"), dynamic).Request.UserHostAddress
当使用上面文章中的任何其他解决方案时,我在收到httpcontextwrapper未定义的错误后最终停止,即使在添加了我能想到/在页面上提到的任何引用之后。
我正在处理的项目的要求是,只有来自特定IP地址的请求才会被处理,并且该请求由应用程序处理。因此,我尝试从此传入请求中获取IP地址,以便可以将其与变量进行比较。
答案 0 :(得分:2)
dynamic
中不存在 vb.net
但如果将其转换为HttpContextWrapper
而不是动态,则会得到相同的行为。
Dim host As String = DirectCast(request.Properties("MS_HttpContext"), HttpContextWrapper).
Request.
UserHostAddress
或者更具可读性:
Dim wrapper As HttpContextWrapper =
DirectCast(request.Properties("MS_HttpContext"), HttpContextWrapper)
Dim host As String = wrapper.request.UserHostAddress
如果你想获得与dynamic
相同的行为 - 请参阅@Reza Aghaei的答案
答案 1 :(得分:2)
您可以通过这种方式获取客户端的IP:
Dim IP = ""
If (Request.Properties.ContainsKey("MS_HttpContext")) Then
IP = DirectCast(Request.Properties("MS_HttpContext"), HttpContextWrapper) _
.Request.UserHostAddress
ElseIf (Request.Properties.ContainsKey(RemoteEndpointMessageProperty.Name)) Then
Dim p = DirectCast(Request.Properties(RemoteEndpointMessageProperty.Name), _
RemoteEndpointMessageProperty)
IP = p.Address
End If
您应该添加对System.Web
和System.ServiceModel
以及Imports Imports System.ServiceModel.Channels
的引用。
注意强>
要使用dynamic
方式,您应首先添加Option Strict Off
作为代码文件的第一行,然后:
Dim ip = Request.Properties("MS_HttpContext").Request.UserHostAddress()