2011-10-27 53 views
2

我需要在C#中创建一个简单的http客户端,它必须是异步的,并且必须支持持久连接到服务器。所以我想使用WebClient类,但我有一些问题,我的代码是这样的:C#异步持久性WebClient示例

void sendMessage() 
{ 
    ServicePointManager.ServerCertificateValidationCallback += new System.Net.Security.RemoteCertificateValidationCallback(bypassAllCertificateStuff); 

    string loginRequest = @"{'IDENTIFIER':'patient1','PASSWORD':'asdasd','DEVICE_ID':'knt-01'}"; 

    client = new WebClient();   

    // add event handlers for completed and progress changed 
    client.UploadProgressChanged += new UploadProgressChangedEventHandler(client_UploadProgressChanged); 
    client.UploadStringCompleted += new UploadStringCompletedEventHandler(client_UploadStringCompleted); 
    client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged); 

    // carry out the operation as normal 

    client.UploadStringAsync(new Uri("Https://192.168.1.100/PaLogin"), "POST", loginRequest); 
} 

void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) 
{ 
    Console.WriteLine("downloadProgressChanged"); 
} 

void client_UploadProgressChanged(object sender, UploadProgressChangedEventArgs e) 
{ 
    // Console.WriteLine(e.ProgressPercentage); 
    if (e.ProgressPercentage != 50) 
    { 
     Console.WriteLine("uploadProgressChanged"); 
    } 
} 

void client_UploadStringCompleted(object sender, UploadStringCompletedEventArgs e) 
{ 
    if (e.Result != null) 
    { 
     Console.WriteLine("Done"); 
    } 
} 

的问题是,我应该接收来自服务器的响应,但无论是client_UploadStringCompleted也不client_DownloadProgressChanged回调被称为。 我在控制台上看到的唯一的事情就是:client_DownloadProgressChanged

所以基本上我想要做的是:

1 - 我发送一些数据到服务器,而无需关闭 2 - 我收到的连接服务器响应,但是当我收到它时,连接仍然必须打开。

我错过了什么?

谢谢。 :-)

回答

1

您在此处缺少整个HTTP协议。

HTTP是无状态请求响应协议。 HTTP 1.1提供了可选的准则,以保持纯粹为了性能而打开连接 - 尽管对于请求响应范例而言,没有改变。 [然而,我看到很多情况下,客户端或服务器已决定不尊重它并关闭连接。]它还提供分块编码以促进流式传输,但就HTTP而言,这一切都是如此。

所以基本上在HTTP中,客户端将等待回复(并保持连接打开),直到它收到响应或超时。没有办法改变/改善这种行为。

现在,回到你的问题。 我认为连接到服务器时出现问题,所以您需要使用Fiddler来查看正在发生的事情。我的直觉是它没有连接到服务器(防火墙,服务器关闭等),因为证书检查甚至没有被调用。

+0

要在此展开,'连接:保持Alive'会导致TCP连接在HTTP事务完成后保持打开状态,客户端可以使用此现有连接发送另一个HTTP请求,而不是建立新的连接。 – Polynomial

+0

确实如此。然而,我看到很多情况下,客户端或服务器决定不尊重它并关闭连接。 – Aliostad

+0

'连接:Keep-Alive'旨在**请求**保持活着。你不能依靠支持。如果服务器不支持它,或者不想提供它,它将简单地关闭连接。如果客户稍后决定它不需要连接,它将关闭它。这同样适用于服务器端。 – Polynomial

0

Http服务器推送机制可以做到这一点。 看到这个: http://en.wikipedia.org/wiki/Comet_(programming)

C#客户端:

using (var client = new WebClient()) 
using (var reader = new StreamReader(client.OpenRead(uri), Encoding.UTF8, true)) 
{ 
    string line; 
    while ((line = reader.ReadLine()) != null) 
    { 
     Console.WriteLine(line); 
    } 
} 

(CHEè克约车VI dicevo questo pomeriggio)