Я написал довольно большое приложение WMI, и это единственная функция, с которой я никогда не смог нормально работать с WMI.Извините, что не согласен с Тедом, но поддержка .NET WMI ужасна, особенно в том, что касается правильной работы с исключениями и при работе с операционными системами, предшествующими Vista.Во-первых, они работают, только если подписаны на основной поток.Тем не менее, поскольку ваш файл журнала создается, вы, кажется, убедились, что событие инициируется.Вторая проблема заключается в предположении, что ваш код определяет текущее состояние сети.
Судя по вашему коду, вы начинаете с Proxy = 0, так что прокси отсутствует.Затем, когда вы получаете событие изменения сети, вы переключаете прокси.Подумайте, что происходит, когда ваша служба запускается, а сеть уже «отключена», что вполне может произойти во время загрузки в зависимости от того, когда ваша служба запускается в связи с инициализацией сетевого стека.Вы будете устанавливать «без прокси», когда сетевой адаптер не работает, а затем устанавливать «Прокси», когда сетевой адаптер работает.Это похоже на то, что вы пытались выполнить.
Исправление простое, если вам нужно проверить состояние сети, чтобы узнать, почему произошло событие изменения.Итак, в вашем событии NetworkAvailabilityChanged вы захотите проверить NetworkInterface.GetIsNetworkAvailable (), который возвращает true, если существует один сетевой интерфейс, который не является loopback или ms-tunnel.
Для события NetworkAddressChanged, предположительновы захотите проверить адрес, чтобы увидеть, является ли он действительным или нет, чтобы определить, нужно ли вызывать ваш прокси.Вы можете сделать это, захватив
UnicastIPAddressInformationCollection следующим образом ... NetworkInterface [] niList = NetworkInterface.GetAllNetworkInterfaces ();
foreach (NetworkInterface ni in niList)
{
switch (ni.NetworkInterfaceType)
{
case NetworkInterfaceType.Ethernet: // 10baseT
case NetworkInterfaceType.FastEthernetT: // 100baseT
case NetworkInterfaceType.GigabitEthernet:
GatewayIPAddressInformationCollection gwIPColl = ni.GetIPProperties().GatewayAddresses;
UnicastIPAddressInformation uniIPInfo = null;
UnicastIPAddressInformationCollection IPcoll = ni.GetIPProperties().UnicastAddresses;
if (IPcoll.Count <= 0)
{
LogFile.LogMe("No valid unicast IP address");
broken = true;
break; // Cannot continue if we don't have an IP in the colletion
}
.,.
или что-то подобное в зависимости от того, насколько сложным вы хотите это сделать.Когда я проверяю действительность сетевого адреса, я проверяю адрес Unicast, сетевую маску (.IPv4Mask) и определенный шлюз из GatewayIPAddressInformationCollection (.GetIPProperties (). GatewayAddresses)
Надеюсь, это немного вам поможет.