如何检查PPC与WebService之间的连接?

时间:2011-02-28 11:37:36

标签: c# web-services windows-mobile pocketpc compact-framework

如何检查PPC与服务器上的Web服务之间的连接?我在FW3.5 C#上工作

1 个答案:

答案 0 :(得分:1)

我不记得是否可以在.Net CF中使用它:

System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged

另一个选择是尝试使用Web服务,并处理异常。我通常遵循这种模式,是否有理由不适用于您的情况?

修改

连接监视器类:

    public static class ConnectionMonitor
    {
        public static event EventHandler IsConnectedChanged;

        private static SystemState _connectionState = null,
            //_cellState = null,
            _gprsState = null;
        private static int _connectionCount = 0;
            //_cellCount = 0;
        private static bool _gprs = false;
        private static bool _isConnected = true;
        private static string _phoneCarrier = SystemState.PhoneOperatorName;
        private const int POWER_FLAGS = 0x00000001; // default
        private const string AXIM_WIFI_ADAPTER = "{98C5250D-C29A-4985-AE5F-AFE5367E5006}\\TIACXWLN1";

        public static bool IsPhone
        {
            get { return !string.IsNullOrEmpty(_phoneCarrier); }
        }

        public static bool IsGPRSConnected
        {
            get { return _gprs; }
        }

        public static bool IsConnected
        {
            get { return _isConnected; }
            set
            {
                if (_isConnected != value)
                {
                    _isConnected = value;
                    if (IsConnectedChanged != null)
                    {
                        IsConnectedChanged(null, EventArgs.Empty);
                    }

                    if (!_isConnected && !IsPhone)
                    {
                        WifiOn();  
                    }
                }
            }
        }

        private static void WifiOn()
        {
            Win32.CEDEVICE_POWER_STATE state = new Win32.CEDEVICE_POWER_STATE();
            if (Win32.GetDevicePower(AXIM_WIFI_ADAPTER, POWER_FLAGS, ref state) == 0)
            {
                if (state != Win32.CEDEVICE_POWER_STATE.D0)
                {
                    Win32.DevicePowerNotify(AXIM_WIFI_ADAPTER, Win32.CEDEVICE_POWER_STATE.D4, POWER_FLAGS);
                    Win32.SetDevicePower(AXIM_WIFI_ADAPTER, POWER_FLAGS, Win32.CEDEVICE_POWER_STATE.D0);
                }
            }
        }

        public static void Init()
        {
            if (_connectionState == null)
            {
                _connectionState = new SystemState(SystemProperty.ConnectionsCount);
                _connectionCount = SystemState.ConnectionsCount;
                _connectionState.Changed += new ChangeEventHandler(_state_Changed);
            }
            //if (_cellState == null)
            //{
            //    _cellState = new SystemState(SystemProperty.ConnectionsCellularCount);
            //    _cellCount = SystemState.ConnectionsCellularCount;
            //    _cellState.Changed += new ChangeEventHandler(_state_Changed);
            //}
            if (_gprsState == null)
            {
                _gprsState = new SystemState(SystemProperty.PhoneGprsCoverage);
                _gprs = SystemState.PhoneGprsCoverage;
                _gprsState.Changed += new ChangeEventHandler(_state_Changed);
            }
            IsConnected =  _connectionCount > 0 || _gprs;
        }

        private static void _state_Changed(object sender, ChangeEventArgs args)
        {
            //_cellCount = SystemState.ConnectionsCellularCount;
            _connectionCount = SystemState.ConnectionsCount;
            _gprs = SystemState.PhoneGprsCoverage;
            IsConnected = _connectionCount > 0 || _gprs;
        }

        public static void Dispose()
        {
            if (_connectionState != null)
            {
                _connectionState.Changed -= new ChangeEventHandler(_state_Changed);
                _connectionState.Dispose();
                _connectionState = null;
            }
            //if (_cellState != null)
            //{
            //    _cellState.Changed -= new ChangeEventHandler(_state_Changed);
            //    _cellState.Dispose();
            //    _cellState = null;
            //}
            if (_gprsState != null)
            {
                _gprsState.Changed -= new ChangeEventHandler(_state_Changed);
                _gprsState.Dispose();
                _gprsState = null;
            }
        }
}

我的Win32静态类中有很多调用(与您的需求无关)。以下是我认为你需要的所有内容:

        public enum CEDEVICE_POWER_STATE : int
        {
            PwrDeviceUnspecified = -1,
            D0 = 0, // Full On: full power, full functionality
            D1 = 1, // Low Power On: fully functional at low power/performance
            D2 = 2, // Standby: partially powered with automatic wake
            D3 = 3, // Sleep: partially powered with device initiated wake
            D4 = 4, // Off: unpowered
            PwrDeviceMaximum = 5
        }

        [DllImport("coredll.dll", SetLastError = true)]
        public static extern int DevicePowerNotify(string name, CEDEVICE_POWER_STATE state, int flags);

        [DllImport("coredll.dll", SetLastError = true)]
        public static extern int SetDevicePower(string name, int flags, CEDEVICE_POWER_STATE state);

        [DllImport("coredll.dll", SetLastError = true)]
        public static extern int GetDevicePower(string name, int flags, ref CEDEVICE_POWER_STATE state);

如果我遗漏了任何内容,请查看pinvoke.net