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
获取请求流不会触发帖子,但关闭流会发生.发布数据按以下方式发送到服务器:
刷新和关闭流的行为是最后一步,一旦输入流关闭(即客户端已将所需内容发送到服务器),服务器就可以返回响应.
您使用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是过早优化,除非您需要显着的性能提升.