在C#中如何将异步的HttpWebResponse与HttpWebRequest匹配

3
我正在使用C#测试HTTP pipelining功能。一切都运行正常,但我有一个问题。
在一个类中,我有以下代码可以异步获取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#是如何将响应和请求匹配的?是通过确认和序列号吗?


应该是读取响应的线程。HTTP响应由在IAsyncResult ar = rs.Request.BeginGetResponse(new AsyncCallback(this.ResponseCallback), rs);上调用的async线程接收。每个异步请求都将有一个与之关联的线程。 - abhinav
@abhinav:我同意异步线程捕获HTTP响应。但是当HTTP响应到达时,C#如何确定相应的线程呢?因为在HTTP响应中没有任何东西可以让C#识别响应。如果您有10个异步请求和10个线程。当您以随机顺序收到10个异步响应时,C#如何将每个响应与正确的线程匹配?请求数据包中是否有编号?谢谢。 - dbaq
1
C# 不进行匹配,这是由操作系统处理的。请记住,这些 HTTP 请求和响应是通过 TCP 传输和接收的。TCP 实现将低级别的响应与请求进行匹配,操作系统中的异步 I/O 层将 TCP 相关内容与您的 C# 回调进行匹配。这是一个简化的解释,但基本上是正确的。如果您想了解更多细节,您需要阅读操作系统内部的相关资料,特别是 Windows I/O 的实现和 TCP 协议的实现。 - Jim Mischel
@JimMischel,这听起来像是一个好答案。 - jrummell
1个回答

1

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

那是一个简化的解释,但基本上是正确的。如果您想要更多细节,就需要了解操作系统内部,特别是Windows I/O 的实现以及TCP。


谢谢你的回答Jim,我也最初考虑了TCP,但是当我用wireshark嗅探我的应用程序时,序列号和确认号非常奇怪。我很快会再次确认,并在这个话题上发布我的结论。谢谢。 - dbaq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接