HttpListener: брандмауэр говорит нет

Мне нужно использовать экземпляр HttpListener для получения строки Useragent устройства (вместе с несколькими другими настраиваемыми заголовками HTTP), но я наталкиваюсь на несколько стен (в буквальном смысле).

Первая проблема, о которой я не буду беспокоиться, пока вторая проблема не будет решена, состоит в том, что HttpListener требует прав администратора, а остальная часть моего приложения - нет.

Вторая проблема заключается в том, что брандмауэр Windows блокирует весь трафик к моему приложению. Это, очевидно, большая проблема. Я не могу бесстыдно попросить своих пользователей отключить брандмауэр (они могут даже не знать, как), и я не могу добавить исключение, используя код. Я понимаю значение безопасности для предоставления доступа к коду, который принимает команды из внешнего мира, но это мой единственный вариант.

Что я должен делать?

РЕДАКТИРОВАТЬ Я должен упомянуть, что я пытался прослушивать порт 80, но это тоже не сработало. Я могу подключить устройство к любому порту или адресу, который мне нужен, так что не о чем беспокоиться.

EDIT2

Я играю с идеей использования отдельного веб-сервера, который принимает простой GUID в качестве аргумента, сохраняет информацию заголовка HTTP в базе данных и передает ее обратно в мое приложение по запросу. Это решает обе проблемы, переводя всю логику хостинга и синтаксического анализа в полномочия, которые я контролирую, и клиент должен будет использовать только HTTP-запросы на получение. Это кому-то кажется излишним?

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

Таким образом, в брандмауэре будет временная дыра, чтобы я мог выполнять свою работу. Тем не менее, кто-то должен иметь лучшую идею...

0 ответов

Другие вопросы по тегам