我需要使用HttpListener的实例来获取设备的Useragent字符串(以及一些其他自定义HTTP标头),但我碰到了几个墙(非常字面)。
在第二个问题解决之前,我不会关心的第一个问题是HttpListener需要管理员权限,而我的应用程序的其余部分则不需要。
第二个问题是Windows防火墙会阻止我的应用程序的所有流量。这显然是一个大问题。我不能无耻地要求我的用户关闭他们的防火墙(他们可能甚至不知道如何),我不能使用代码添加异常。我理解授予访问接受来自外部世界的命令的代码的安全性含义,但这是我唯一的选择。
我该怎么办?
修改 我应该提一下,我试图在端口80上听,但这也不起作用。我可以让设备连接到我想要的任何端口或地址,这样就不必担心了。
EDIT2
我正在尝试使用一个单独的Web服务器,它将一个简单的GUID作为参数,将HTTP头信息存储在数据库中,并在请求时将其提供给我的应用程序。这通过将所有托管和解析逻辑移动到我控制的权限来解决这两个问题,客户端将只需要使用HTTP get请求。 这对任何人来说都有点矫枉过正吗?
EDIT3
现在我已经 - 通过调用netsh
临时添加防火墙例外来解决它 Private Const Port As Integer = 55748
Private Shared Sub AddException()
DeleteException() ' to prevent duplicates
Dim netsh As New Process()
Dim arguments As String = "advfirewall firewall add rule name=""MyApp"" dir=in action=allow protocol=TCP localport=" + Port.ToString
netsh.StartInfo.FileName = "netsh"
netsh.StartInfo.Arguments = arguments
netsh.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
netsh.Start()
End Sub
Private Shared Sub DeleteException()
Dim netsh As New Process()
Dim arguments As String = "advfirewall firewall delete rule name=""MyApp"" dir=in protocol=TCP localport=" + Port.ToString
netsh.StartInfo.FileName = "netsh"
netsh.StartInfo.Arguments = arguments
netsh.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
netsh.Start()
End Sub
我的实际通话看起来像这样
Public Shared Function GetDeviceInfo(ByRef device As Dune) As DeviceInfo
Dim info As DeviceInfo
AddException()
' HttpListener magic happens here
DeleteException()
Return info
End Function
这样防火墙上就会有一个临时漏洞让我开展工作。 不过,有人应该有更好的主意......