デバイスの Useragent 文字列を取得するためにHttpListenerのインスタンスを使用する必要がありますが(他のいくつかのカスタム HTTP ヘッダーと共に)、いくつかの壁にぶつかっています (文字通り)。
最初の問題は、2 番目の問題が解決されるまで気にするつもりはありませんが、HttpListener には管理者権限が必要ですが、アプリの残りの部分には必要ないということです。
2 つ目の問題は、Windows ファイアウォールがアプリへのすべてのトラフィックをブロックすることです。これは明らかに大きな問題です。ユーザーにファイアウォールをオフにするよう恥知らずに要求することはできません (ユーザーはその方法さえ知らない可能性があります)。また、コードを使用して例外を追加することもできません。外部からのコマンドを受け入れるコードへのアクセスを許可することのセキュリティへの影響は理解していますが、それが私の唯一の選択肢です。
私は何をすべきか?
編集 ポート80でリッスンしようとしたことを言及する必要がありますが、それも機能しませんでした。デバイスを任意のポートまたはアドレスに接続できるので、心配する必要はありません。
EDIT2
単純な GUID を引数として取り、HTTP ヘッダー情報をデータベースに保存し、要求されたときにそれをアプリに返す別の Web サーバーを使用するという考えで遊んでいます。これは、すべてのホスティングおよび解析ロジックを私が制御するエンティティに移動することで両方の問題を解決します。クライアントは 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
このようにすると、ファイアウォールに一時的な穴ができて、仕事ができるようになります。それでも、誰かがもっと良い考えを持っているはずです...