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