HttpWebRequest.GetRequestStream:它做什么?

Joh*_*ny5 35 c# httpwebrequest

代码示例:

HttpWebRequest request =
   (HttpWebRequest)HttpWebRequest.Create("http://some.existing.url");

request.Method = "POST";
request.ContentType = "text/xml";

Byte[] documentBytes = GetDocumentBytes ();


using (Stream requestStream = request.GetRequestStream())
{
   requestStream.Write(documentBytes, 0, documentBytes.Length);
   requestStream.Flush();
   requestStream.Close();
}
Run Code Online (Sandbox Code Playgroud)

当我这样做时request.GetRequestStream (),请求中没有任何内容可以发送.从方法的名称和它显示的intellisense("Get System.IO.Stream用于写入请求数据"),没有任何东西表明这行代码将连接到远程服务器.
但它似乎确实......

任何人都可以向我解释究竟HttpWebRequest.GetRequestStream ()是做什么的?

谢谢你的启发.

mdm*_*mdm 23

获取请求流不会触发帖子,但关闭流会发生.发布数据按以下方式发送到服务器:

  1. 将与主机建立连接
  2. 发送请求和标头
  3. 写邮政数据
  4. 等待回复.

刷新和关闭流的行为是最后一步,一旦输入流关闭(即客户端已将所需内容发送到服务器),服务器就可以返回响应.

  • 嘿,我知道这是一个迟到的评论,但最初的问题是,获取请求尝试连接到远程服务器,而不是触发帖子,所以,即使这个问题被标记为已回答,我仍然有原作者的问题: request.GetRequestStream()不表示将连接到远程服务器,为什么需要? (3认同)
  • 好的,对不起先前的评论,这是漫长而混乱的方式.我这样理解:1:在GetResponseStream,连接打开.2:当我关闭流时,请求被发送.3:当我收到GetResponse时,如果尚未收到响应,则等待它.对? (2认同)

Gen*_*eev 9

您使用GetRequestStream()来同步获取对上载流的引用.只有在完成对流的写入之后才会发送实际请求.

但是,我建议您使用BeginGetRequestStream方法而不是GetRequestStream.BeginGetRequestStream以异步方式执行,并且在获取流时不会锁定当前线程.您将回调和上下文传递给BeginGetRequestStream.在回调中,您可以调用EndGetRequestStream()来最终获取引用并重复上面列出的写入步骤(用于同步行为).例:

context.Request.BeginGetRequestStream(new AsyncCallback(Foo), context);

public void Foo(IAsyncResult asyncResult)
    {
        Context context = (Context)asyncResult.AsyncState;
        try
        {
            HttpWebRequest request = context.Request;

            using (var requestStream = request.EndGetRequestStream(asyncResult))
            using (var writer = new StreamWriter(requestStream))
            {
                // write to the request stream
            }

            request.BeginGetResponse(new AsyncCallback(ProcessResponse), context);
        }
Run Code Online (Sandbox Code Playgroud)

对BeginGetRequestStream要非常小心.它永远不会超时,因此您必须向程序添加其他逻辑,以便从GetRequestStream将引发超时异常的情况中恢复.

通常,线程很便宜.如果您有10,000个或更多并发请求,则HttpWebRequest的异步Begin/End方法仅值得使用; 因为实现超时非常棘手且容易出错.通常,使用BeginGetRequestStream是过早优化,除非您需要显着的性能提升.

  • 如果`HttpWebRequest.GetRequestStream()`是一个纯客户端操作,它怎么能抛出超时异常?它也可以返回null吗? (5认同)