我需要在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-我收到服务器响应,但收到后仍必须打开连接。
我错过了什么?
谢谢。 : - )
答案 0 :(得分:1)
这里缺少整个HTTP协议。
HTTP是无状态请求 - 响应协议。 HTTP 1.1提供了可选指南,用于保持连接纯粹为了性能而打开 - 尽管对于请求响应范例,没有任何变化。 [但我见过许多客户端或服务器决定不尊重它并关闭连接的情况。] 它还提供了分块编码以方便流式传输,但就HTTP而言,就是这样。关注。
所以基本上在HTTP中,客户端将等待回复(并保持连接打开),直到收到响应或超时。没有办法改变/改善这种行为。
现在,回到你的问题。 我认为连接到服务器会出现问题,因此您需要使用Fiddler来查看正在发生的事情。我的预感是它没有连接到服务器(防火墙,服务器关闭等),因为甚至没有调用证书检查。
答案 1 :(得分:0)
Http服务器推送机制可以做到这一点。 看到这个: http://en.wikipedia.org/wiki/Comet_(programming))
c#client:
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)