我需要使用HttpListener的实例来获取设备的 Useragent 字符串(以及一些其他自定义 HTTP 标头),但我遇到了几堵墙(字面意思)。
第一个问题,在第二个问题解决之前我不会关心,是 HttpListener 需要管理员权限,而我的应用程序的其余部分不需要。
第二个问题是 Windows 防火墙阻止了我的应用程序的所有流量。这显然是个大问题。我不能无耻地要求我的用户关闭他们的防火墙(他们甚至可能不知道如何),我不能使用代码添加异常。我了解授予对接受外部世界命令的代码的访问权限的安全隐患,但这是我唯一的选择。
我应该怎么办?
编辑 我应该提到我已经尝试在端口 80 上监听,但这也不起作用。我可以让设备连接到我想要的任何端口或地址,这样就不用担心了。
编辑2
我正在考虑使用一个单独的网络服务器,它以一个简单的 GUID 作为参数,将 HTTP 标头信息存储在数据库中,并在请求时将其返回给我的应用程序。这通过将所有托管和解析逻辑移动到我控制的实体来解决这两个问题,客户端只需要使用 HTTP 获取请求。这对任何人来说似乎都是矫枉过正吗?
编辑3
现在我已经通过调用 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
这样防火墙上就会有一个临时的洞让我做我的工作。不过,应该有人有更好的主意...