在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#中匹配一个异步HttpWebResponse和一个HttpWebRequest

c#不进行匹配。它是由操作系统处理的。请记住,这些HTTP请求和响应是通过TCP传输和接收的。TCP实现将低级响应与请求相匹配,而操作系统中的异步I/O层将TCP与c#回调相匹配。

这是一个简化的解释,但本质上是正确的。如果你想了解更多的细节,你必须阅读操作系统的内部,特别是Windows I/O的实现,特别是TCP。

相关文章: