C# 2008 SP1Самый быстрый способ протестировать подключение к Интернету
Я использую этот код для подключения к нашему клиентскому веб-сайту. Это для приложения софтфона. Перед тем, как пользователь делает вызов, софтфон должен проверить, есть ли активное интернет-соединение.
Итак, хочу, чтобы я использовал класс httpWebRequest для подключения к нашему сайту клиентов. Если ответ в порядке, то подключение к Интернету может продолжаться.
Однако, я заметил, что ответ слишком долго реагирует. Я не уверен, что это не очень эффективный способ тестирования.
Однако, когда я просматриваю их веб-сайт, загрузка страницы занимает меньше секунды. Но занимает слишком много времени, когда я использую класс HttpWebRequest
Так требования для этого являются:
Когда-нибудь прокси будет использоваться в офисе клиента. Я не могу использовать класс TCPClient (не имеет свойства прокси).
Прокси не поддерживает SOCKS, поэтому не может использовать класс Sockets.
Мне нужно использовать свойство таймаута. Поэтому нельзя использовать класс WebClient. Это связано с тем, что программный телефон замерзнет, пока не будет получен ответ. Итак, тайм-аут через несколько секунд.
Таким образом, единственное, что я могу представить, это класс HttpWebRequest.
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.xxxxxxxxx.com");
request.Timeout = 5000;
request.Credentials = CredentialCache.DefaultNetworkCredentials;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode == HttpStatusCode.OK)
{
Console.WriteLine("IsSIPServerAvailable: " + response.StatusCode);
isAvailable = true;
}
======== Редактирование с помощью р \ Invoke ====
[DllImport("wininet.dll", CharSet = CharSet.Auto)]
private extern static bool InternetGetConnectedState(ref InternetConnectionState_e lpdwFlags, int dwReserved);
[Flags]
enum InternetConnectionState_e : int
{
INTERNET_CONNECTION_MODEM = 0x1,
INTERNET_CONNECTION_LAN = 0x2,
INTERNET_CONNECTION_PROXY = 0x4,
INTERNET_RAS_INSTALLED = 0x10,
INTERNET_CONNECTION_OFFLINE = 0x20,
INTERNET_CONNECTION_CONFIGURED = 0x40
}
// In function for checking internet
InternetConnectionState_e flags = 0;
bool isConnected = InternetGetConnectedState(ref flags, 0);
Недостатком этого (ИМО) является то, что он сообщает только, подключен ли компьютер к «интернету в целом». Это лишь несколько свидетельствует о том, сможете ли вы получить конкретную услугу, которой вы пользуетесь. Лучший способ сделать это, IMO, - это подключиться к этой самой услуге. Конечно, это не будет гарантировать, что он по-прежнему будет действовать через секунду, но я думаю, что это лучший показатель, если это возможно. (В некоторых случаях это не так, например, если просто подключение накладывает какую-то плату.) –
Я отредактировал мой код для p/Invoke. Однако, это говорит мне, подключена ли ЛВС к моему компьютеру (подключен или выключен). Однако он не может сказать мне, есть ли у меня активное интернет-соединение (просматривайте Интернет). – ant2009
@robUK: Я отредактировал свой ответ, чтобы включить вызов в InternetCheckConnection. Это еще один P/Invoke, который вы можете попробовать - он должен сказать вам, доступен ли этот конкретный URL-адрес, но я считаю, что он немного быстрее, чем пытаться подключить соединение самостоятельно. –