C#异步持久WebClient示例

时间:2011-10-27 15:20:48

标签: c# http asynchronous webclient persistent

我需要在C#中创建一个必须是异步的简单http客户端,并且必须支持与服务器的持久连接。所以我正在尝试使用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-我收到服务器响应,但收到后仍必须打开连接。

我错过了什么?

谢谢。 : - )

2 个答案:

答案 0 :(得分:1)

这里缺少整个HTTP协议。

HTTP是无状态请求 - 响应协议。 HTTP 1.1提供了可选指南,用于保持连接纯粹为了性能而打开 - 尽管对于请求响应范例,没有任何变化。 [但我见过许多客户端或服务器决定不尊重它并关闭连接的情况。] 它还提供了分块编码以方便流式传输,但就HTTP而言,就是这样。关注。

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

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

答案 1 :(得分:0)

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

c#c​​lient:

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èquelloche vi dicevo questo pomeriggio)