我需要使用一个HttpListener的实例来获取一个设备's Useragent string (along with a few other custom HTTP headers), but I' m撞到几个墙(非常字面) .

在第二个问题解决之前,我不会关心的第一个问题是HttpListener需要管理员权限,而我的应用程序的其余部分则不需要 .

第二个问题是Windows防火墙会阻止我的应用程序的所有流量 . 这显然是一个大问题 . 我不能无耻地要求我的用户关闭他们的防火墙(他们可能甚至不知道如何),我不能使用代码添加异常 . 我理解授予访问接受来自外部世界的命令的代码的安全性含义,但这是我唯一的选择 .

我该怎么办?

EDIT 我应该提到我've tried to listen on port 80 but that didn'工作要么 . 我可以让设备连接到我想要的任何端口或地址,这样就不用担心了 .

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

这样防火墙上就会有一个临时漏洞让我开展工作 . 不过,有人应该有更好的主意......