在c#中匹配一个异步HttpWebResponse和一个HttpWebRequest
本文关键字:一个 HttpWebResponse HttpWebRequest 异步 | 更新日期: 2023-09-27 18:13:56
我正在用c#对HTTP管道特性做一些测试。一切都很好,但我有一个问题。
在一个类中,我有以下代码,允许我异步获取HTTPWebRequest并处理响应:
public void getResponseAsync()
{
RequestState rs = new RequestState();
rs.Request = this.webRequest; //On ajoute la requete dans l'objet état pour pouvoir le récupérer dans la callback
IAsyncResult ar = rs.Request.BeginGetResponse(new AsyncCallback(this.ResponseCallback), rs); // Appel asynchrone
}
public void ResponseCallback(IAsyncResult ar)
{
RequestState rs = (RequestState)ar.AsyncState; //Récupération de l'objet etat
HttpWebRequest req = rs.Request; //Récupération de la requete web (object HttpWebRequest)
try //Récupération de la réponse Web
{
HttpWebResponse resp = (HttpWebResponse)req.EndGetResponse(ar);
this.incomingBuffer = Helpers.getBufferFromStream(resp.GetResponseStream());
resp.Close();
this.state = true;
}
catch (Exception)
{
this.state = false;
}
}
}
// La classe RequestState est utilise pour transmettre l'objet HttpWebRequest
// a travers l'appel asynchrone
public class RequestState
{
public HttpWebRequest Request;
public RequestState()
{
Request = null;
}
}
这个片段工作得很好,但是我不理解c#的功能。我不明白c#如何识别响应包并将其与我的请求相关联?因为在HTTP规范中,HTTP响应中没有"标识符"。
那么c#如何匹配响应和请求呢?它有ack和seq号码吗?
c#不进行匹配。它是由操作系统处理的。请记住,这些HTTP请求和响应是通过TCP传输和接收的。TCP实现将低级响应与请求相匹配,而操作系统中的异步I/O层将TCP与c#回调相匹配。
这是一个简化的解释,但本质上是正确的。如果你想了解更多的细节,你必须阅读操作系统的内部,特别是Windows I/O的实现,特别是TCP。