C# 2008 SP1La forma más rápida de probar la conexión a Internet
Estoy utilizando este código para conectarse al sitio web de nuestro cliente. Esto es para una aplicación de teléfono softphone. Antes de que el usuario haga una llamada, el softphone debe probar si hay una conexión a Internet activa.
Por lo tanto, quiero que he hecho se utiliza la clase httpWebRequest para conectarse al sitio web de nuestros clientes. Si la respuesta es correcta, entonces la conexión a Internet puede continuar.
Sin embargo, he notado que la respuesta tarda demasiado en responder. No estoy seguro de si esta no es una forma muy eficiente de probar.
Sin embargo, cuando navego a su sitio web, se tarda menos de un segundo en cargar la página. Pero lleva demasiado tiempo cuando se utiliza la clase HttpWebRequest
Así requisitos para esto son:
En algún momento de un proxy se utilizarán en la oficina del cliente. A No puedo usar la clase TCPClient (no tiene una propiedad de proxy).
El proxy no es compatible con SOCKS, por lo que no puede usar la clase Sockets.
Necesito usar una propiedad de tiempo de espera. Entonces no puedo usar la clase de WebClient. Esto se debe a que el softphone se congelará hasta que se devuelva una respuesta. Así que agote el tiempo después de unos segundos.
Así que el único en el que puedo pensar es en la clase 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;
}
======== Editar usando p \ ==== Invocar
[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);
La desventaja de eso (IMO) es que solo le dice si la computadora está conectada a "internet en general". Es solo un poco indicativo de si podrá acceder al servicio particular que busca. La mejor manera de hacerlo, IMO, es conectarse a ese mismo servicio. Por supuesto, eso no garantiza que seguirá siendo válido un segundo después, pero creo que es un mejor indicador si es posible. (En algunos casos no lo es, por ejemplo, si solo se conecta incurre en algún tipo de carga). –
He editado mi código para la p/Invoke. Sin embargo, sí me dice si la LAN está conectada a mi computadora (enchufado o apagado). Sin embargo, no puede decirme si tengo una conexión a Internet activa (navegue por Internet). – ant2009
@robUK: edité mi respuesta para incluir la llamada a InternetCheckConnection. Esa es otra P/Invoke que puede probar: debe decirle si esa URL específica está disponible, pero creo que es un poco más rápido que tratar de conectar una conexión usted mismo. –