我需要用 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- 我收到了服务器响应,但是当我收到它时连接必须仍然打开。
我错过了什么?
谢谢。 :-)
最佳答案
您在这里遗漏了整个 HTTP 协议(protocol)。
HTTP 是一种无状态请求-响应 协议(protocol)。 HTTP 1.1 提供了可选准则来纯粹为了性能而保持连接打开——尽管对于请求响应范例,没有变化。 [然而我已经看到许多客户端或服务器决定不遵守它并关闭连接的情况。]它还提供分块编码以促进流式传输,但就 HTTP 而言仅此而已关注。
所以基本上在 HTTP 中,客户端将等待回复(并保持连接打开),直到它收到响应或超时。没有办法改变/改善这种行为。
现在,回到你的问题。 我认为连接到服务器时出现问题,因此您需要使用 Fiddler 来查看发生了什么。我的直觉是它没有连接到服务器(防火墙、服务器关闭等),因为甚至没有调用证书检查。
关于C# 异步持久 WebClient 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7918238/