C#2008 SP1
我使用此代码连接到我们的客户端网站.这适用于软电话应用程序.在用户拨打电话之前,软电话必须测试是否存在活动的Internet连接.
所以,希望我所做的是使用httpWebRequest类连接到我们的客户网站.如果响应正常,则可以继续进行Internet连接.
但是,我注意到响应的响应时间太长.我不确定这不是一种非常有效的测试方法.
但是,当我浏览他们的网站时,加载页面只需不到一秒钟.但是当我使用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;
}
Run Code Online (Sandbox Code Playgroud)
========使用p\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);
Run Code Online (Sandbox Code Playgroud)
Ree*_*sey 16
尝试使用P/Invoke调用InternetGetConnectedState.这应该告诉您是否配置了连接.然后,您可以尝试使用InternetCheckConnection检查与服务的特定连接.这有时(有时)比直接连接连接更快,但我会测试它是否比预先完成连接更好.
Jon*_*eet 11
什么是软电话用于真正的通信?这是通过HTTP/HTTPS到同一个网站吗?如果是这样,那绝对是正确的方法 - 下一步就是找出为什么这么长时间.
在您提出请求之前,网络连接是否已确定?你是不是事先没有提出任何要求?我问,因为我注意到你没有处理响应 - 如果在其他地方也发生这种情况,你可能会发现你正在运行连接池,只能给你一些特定服务器的连接.道德是要始终把声明放在HttpWebResponse
一个using
声明中.当然,这可能不是你的问题,但值得一试.
如果您的实际应用程序要连接到其他地方,那么您的测试也应该检查.基本上,尽可能接近真实的东西.
出于兴趣,你说这是一个"软电话"应用程序 - 这实际上是在一些描述的手机上运行,使用紧凑的框架,还是桌面应用程序?
我有类似的情况,我们打算对客户端进行WCF调用,如果客户端无法访问(无论出于何种原因),则需要很长时间.我所做的是打开一个原始TCP套接字到客户端地址...如果客户端没有在端口(在你的情况下是端口80)监听,如果它们在那里很快就会成功,这会很快失败.
这给了我最快,最准确的答案,以确定我是否能够与我试图达到的端点进行通信.唯一的缺点是你必须自己在套接字上管理超时,因为只有发送和接收超时选项没有连接.
它是这样的......
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
IAsyncResult result = socket.BeginConnect("www.xxxxxxxxx.com", 80, null, null );
//I set it for 3 sec timeout, but if you are on an internal LAN you can probably
//drop that down a little because this should be instant if it is going to work
bool success = result.AsyncWaitHandle.WaitOne( 3000, true );
if ( !success )
{
throw new ApplicationException("Failed to connect server.");
}
// Success
//...
}
finally
{
//You should always close the socket!
socket.Close();
}
Run Code Online (Sandbox Code Playgroud)
我没有在我面前使用的实际代码,但这应该让你走上一般道路.
归档时间: |
|
查看次数: |
41613 次 |
最近记录: |