C# 将异步HttpWebResponse与C中的HttpWebRequest匹配#
我正在用C#测试HTTP管道功能。一切正常,但我有个问题 在一个类中,我有以下代码,允许我异步获取HTTPWebRequest并处理响应:C# 将异步HttpWebResponse与C中的HttpWebRequest匹配#,c#,asynchronous,httpwebresponse,C#,Asynchronous,Httpwebresponse,我正在用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
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响应中没有“identificator”
那么C#如何将响应与请求相匹配呢?是否有确认号和序列号?C#不匹配。它由操作系统处理。记住,这些HTTP请求和响应是通过TCP传输和接收的。是TCP实现将低级响应与请求相匹配,操作系统中的异步I/O层将TCP内容与C#回调相匹配
这是一个简单的解释,但基本上是正确的。如果您想了解更多详细信息,您必须阅读操作系统内部的内容,特别是Windows I/O的一般实现,特别是TCP的实现。读取响应的应该是线程
HTTP
响应由async
线程接收,该线程在IAsyncResult ar=rs.Request.BeginGetResponse(新的AsyncCallback(this.ResponseCallback),rs)上调用
每个异步请求都有一个与之关联的线程。@abhinav:我同意捕获HTTP响应的是异步线程。但当HTTP响应到达时,C#如何确定相应的线程?因为HTTP响应中没有允许c#识别响应的内容。。如果您有10个异步请求和10个线程。当您以随机顺序获得10个异步响应时,c#如何将每个响应与好线程匹配?请求包中有数字吗?Thx.C#不匹配。它由操作系统处理。记住,这些HTTP请求和响应是通过TCP传输和接收的。是TCP实现将低级响应与请求相匹配,操作系统中的异步I/O层将TCP内容与C#回调相匹配。这是一个简单的解释,但基本上是正确的。如果您想了解更多详细信息,您必须阅读操作系统内部的内容,特别是Windows I/O的一般实现,特别是TCP。@JimMischel这听起来是个不错的答案。谢谢您的回答Jim,我也先考虑了TCP,但当我用wireshark嗅探我的应用程序时,序列号和确认号真的很奇怪。我很快会再次检查,我会发布我对这个话题的结论。谢谢