Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将异步HttpWebResponse与C中的HttpWebRequest匹配#_C#_Asynchronous_Httpwebresponse - Fatal编程技术网

C# 将异步HttpWebResponse与C中的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

我正在用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响应中没有“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嗅探我的应用程序时,序列号和确认号真的很奇怪。我很快会再次检查,我会发布我对这个话题的结论。谢谢