一个可同步调用异步执行的HttpWebRequest类

Unity3d C HttpWebRequest 异步下载文件 阅读详情

下面这个例子是对MSDN上异步HttpWebRequest例子修改,下载指定URL的页面,可同步调用,调用方法如下:

string str=MyHttp.GetPage("http://www.sohu.com")   ;

 public class MyHttp
    {
        public static ManualResetEvent allDone = new ManualResetEvent(false);
        const int BUFFER_SIZE = 1024;
        public static string GetPage(string url)
        {
            HttpWebRequest wreq = (HttpWebRequest)WebRequest.Create(url);
            wreq.UserAgent = "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; Alexa Toolbar)";
            wreq.Headers.Add("accept-language", "zh-cn");
            wreq.Headers.Add("accept-encoding", "gzip,   deflate");
            RequestState rs = new RequestState();
            rs.Request = wreq;
            IAsyncResult r = (IAsyncResult)wreq.BeginGetResponse(
                new AsyncCallback(RespCallback), rs);
            allDone.WaitOne();
            allDone.Reset();
            return rs.RequestData.ToString();
        }
        private static void RespCallback(IAsyncResult ar)
        {
            RequestState rs = (RequestState)ar.AsyncState;
            WebRequest req = rs.Request;
            WebResponse resp = null;
            try
            {
                resp = req.EndGetResponse(ar);
                resp.Headers.Add("accept-language", "zh-cn");
                resp.Headers.Add("accept-encoding", "gzip,   deflate");
            }
            catch (Exception ex)
            {
                allDone.Set();
                return;
            }
            Stream ResponseStream = resp.GetResponseStream();
            rs.ResponseStream = ResponseStream;
            IAsyncResult iarRead = ResponseStream.BeginRead(rs.BufferRead, 0,
                BUFFER_SIZE, new AsyncCallback(ReadCallBack), rs);
        }
        private static void ReadCallBack(IAsyncResult asyncResult)
        {
            // Get the RequestState object from AsyncResult.
            RequestState rs = (RequestState)asyncResult.AsyncState;
            // Retrieve the ResponseStream that was set in RespCallback.
            Stream responseStream = rs.ResponseStream;

            // Read rs.BufferRead to verify that it contains data.
            int read = responseStream.EndRead(asyncResult);
            if (read > 0)
            {
                // Prepare a Char array buffer for converting to Unicode.
                Char[] charBuffer = new Char[BUFFER_SIZE];

                // Convert byte stream to Char array and then to String.
                // len contains the number of characters converted to Unicode.
                int len =
                    rs.StreamDecode.GetChars(rs.BufferRead, 0, read, charBuffer, 0);

                String str = new String(charBuffer, 0, len);

                // Append the recently read data to the RequestData stringbuilder
                // object contained in RequestState.
                rs.RequestData.Append(
                    Encoding.Default.GetString(rs.BufferRead, 0, read));
                // Continue reading data until
                // responseStream.EndRead returns –1.
                IAsyncResult ar = responseStream.BeginRead(
                    rs.BufferRead, 0, BUFFER_SIZE,
                    new AsyncCallback(ReadCallBack), rs);
            }
            else
            {
                // Close down the response stream.
                responseStream.Close();
                // Set the ManualResetEvent so the main thread can exit.
                allDone.Set();
            }
            return;
        }
    }

    public class RequestState
    {
        const int BufferSize = 1024;
        public StringBuilder RequestData;
        public byte[] BufferRead;
        public WebRequest Request;
        public WebResponse resp;
        public Stream ResponseStream;

        // Create Decoder for appropriate enconding type.
        public Decoder StreamDecode = Encoding.Default.GetDecoder();
        public RequestState()
        {
            BufferRead = new byte[BufferSize];
            RequestData = new StringBuilder(String.Empty);
            Request = null;
            resp = null;
            ResponseStream = null;
        }
    } 

C#中的HttpContent、HttpClientHandle、HttpWebRequest 类的一个派生类,可以被用来创建一个处理程序链,其中每个处理程序可以处理传入的请求和传出的响应。它提供了一个现代、易于使用且支持异步操作的API,是 .NET Core 和 .NET 5/6 中推荐使用的HTTP客户端。支持各种HTTP功能,包括HTTP头、HTTP方法(如GET、POST、PUT、DELETE等)、身份验证、重定向处理等。负责处理与HTTP请求和响应相关的底层细节,例如网络连接、代理、Cookie、重定向等。是 .NET 中用于发送HTTP请求和接收HTTP响应的类,属于。 阅读详情

相关推荐

C#同步、异步远程下载文件实例

1、使用HttpWebRequest/HttpWebResonse和WebClient 代码如下:HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url); WebResponse response = request.GetResponse(); Stream stream = response.GetResponseStream(); if (!response.ContentType.ToLower().StartsWith(“text/”)) {     //Value = SaveBinaryFile(respon

使用HttpWebRequest的POST取得网页内容(异步操作)2篇集合

上次说了,如何通过post来取得网页内容。可是有一个问题出现了。当时用的方法是同步操作,如果我其中的一个IP或是在进行转化的过程中,出现了问题,哪么这个程序就会停下来,当然了,有的朋友可能会说,用try...catch也可以啊。因为我是循环取值,所以在catch里加一个continue就行了。可是以前没有搞过异步操作,所以想用这个机会搞一下。就看了一下。这一看不要紧,搞得我一头雾水。上网上

Zfrong繁荣的IT技术、IT项目、解决方案专栏Blog-上海 8762

如何在iPhone上本地运行SmolVLM?5亿参数模型实战指南(附Swift代码)

本文详细介绍了如何在iPhone上本地部署和运行轻量高效的SmolVLM多模态模型。通过实战指南,分享了使用Swift和MLX框架进行环境配置、模型加载、内存优化以及实现实时图像分析与文本生成的完整流程,帮助开发者在移动端高效运行AI视觉语言模型。

echo99的专栏 654

Unity C# 之 使用 HttpWebRequest 基础知识/HttpWebRequest 进行异步Post 网络访问/数据流形式获取数据(Task/async/await)的代码简单实现

可以使用 UnityWebRequest 访问,不过好似只能用协程的方式,并且访问只能在主线程中;所以这里使用 C# 中的 HttpWebRequest,进行网络访问,而且 HttpWebRequest,允许在子线程中访问,在一些情况下可以大大减少主线程的网络访问压力;这里使用 HttpWebRequest ,进行 Post 访问,并且Task 结合 async (await) 的进行异步访问,最后使用 Stream 流式的形式获取数据,在这里做一个简单的记录,以便后期使用的时候参考。

仙魁XAN 8426

MTGS与3D高斯泼溅:如何用多轨迹数据重建自动驾驶场景(附代码解析)

本文深入解析了MTGS(多轨迹高斯泼溅)技术在自动驾驶场景重建中的工程实践。该方法通过分层场景表示,巧妙融合多轨迹数据,利用3D高斯泼溅技术统一处理静态几何与动态物体,有效解决了复杂环境下的重建难题。文章结合代码,详细阐述了其实现框架、损失函数设计及优化策略,为构建高保真数字孪生场景提供了实用指南。

v5w6x的博客 446

esp32c6 开发实战:低功耗蓝牙(BLE)开发

蓝牙栈在此程序流程中已经启动并运行,但是应用程序的功能尚未定义。功能的定义是通过响应事件来实现的,当其他设备尝试读取或写入参数以及建立连接时就会触发事件回调函数处理。BT控制器在控制器端实现主机控制器接口(HCI),链路层(LL)和物理层(PHY)。BT控制器对用户应用程序不可见,并处理BLE堆栈的较低层。蓝牙堆栈(Bluedroid stack)定义了经典蓝牙(BT Classic)和低功耗蓝牙(BLE)的通用定义和API。的判断)等对于启动低功耗蓝牙来说不重要的代码,函数初始化和启用BT控制器。

月入鱼饵的博客 2742

C# 在异步中使用HttpWebRequest出现的“正在终止线程”错误的解决方案

C# 在异步中使用HttpWebRequest出现的“正在终止线程”错误的解决方案

asdfgh0077的博客 336

从零复刻平衡小车(基于STM32F1)

平衡小车(基于STM32F1)

Legendyyy的博客 5041

Http异步发送之HttpWebRequest的BeginGetResponse

关于http异步发送,一开始我的做法都是用thread或者task去完成的;后来发现HttpWebRequest本身就提供一个异步的方法。 总感觉.Net自己提供的异步方法可能要优于我们自己用线程去实现的好; 当然这只是我的猜想。个人感觉如果有大量异步发送还是用HttpWebRequest本身提供的异步方法好。 自己封装了下HttpWebRequest的异步请求。 1 ...

weixin_30699955的博客 1976

Python 爬虫实战:亚马逊 + eBay 商品信息跨平台抓取(价格 / 销量 / 评价对比)

亚马逊和 eBay 是全球知名的电商平台,拥有海量的商品信息。对于消费者来说,比较不同平台上的商品价格、销量和用户评价可以帮助他们找到性价比最高的商品。对于商家而言,了解竞争对手的商品信息有助于优化自身的产品策略和定价策略。然而,手动在两个平台上逐一比较商品信息是非常耗时且低效的。因此,开发一个能够自动抓取并对比这两个平台商品信息的爬虫工具具有重要的实际意义。

yansideyucsdn的博客 617

IDEA出现闪退或打不开的解决方法

本身项目比较大,为了打开这个软件,可调节IDEA中安装的bin目录下有个。打开IDEA的时候过一会便闪退,可以再IDEA的右下角看到如下提示。(如果没有该提示,软件右下角也会有个红色感叹号,点开查看原因即可)闪退的多数原因大致是out of memory,内存溢出。查看任务管理器中的进程:(发现内存随时有溢出的情况)但也需要注意,该参数并不是越大越好,适中即可。只有个别原因是需要管理员权限就可执行!可以尽量减少软件的启动。

码农研究僧的博客 5944

C# HttpWebRequest 异步请求

异步请求://定义委托 public delegate void Asyncdelegate(WebProxy objName); //异步调用完成时,执行回调方法 private void CallbackMethod(IAsyncResult ar) { Asyncdelegate dlgt = (Asyncdelegate)ar.AsyncState; dlgt.EndInvoke(a

JH_Wiki的专栏 1万+

DW3000芯片驱动API介绍

详细介绍DW3000驱动程序API的调用流程说明和中断处理程序流程说明

DT程序员的博客 1522

httpwebrequest java_HttpWebRequest 的一个 异步封装

相信大家对HttpWebRequest这个类应该非常熟悉了吧。主要用它来模拟http请求,在有些时候我们需要用到它的异步处理,每次用的时候都要写很多代码,于是今天把它简单的封装了一下。虽然在C#4和C#5中它提供了很新方法是的异步更加简单,但是在一些老项目(还在用vs2005)上我们只能用C#2.0的语法来实现它的异步功能。如图1,这里的RequestInfo类是请求信息的一个封装,Respons...

weixin_35650074的博客 609

华为OD新系统机试真题-勇攀数字高峰(Java/Py/C/C++/Js/Go)

新系统 华为OD机试新系统【勇登数字高峰】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD新系统机试真题【勇登数字高峰】

qq_45776114的博客 1546

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C# HttpWebRequest人异步访问

----------------------------Un Test-------------------------using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Net;using System.Threading;using System.IO;na

雪后残阳 2158

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

HttpWebRequest 的一个 异步封装

相信大家对HttpWebRequest这个类应该非常熟悉了吧。主要用它来模拟http请求,在有些时候我们需要用到它的异步处理,每次用的时候都要写很多代码,于是今天把它简单的封装了一下。虽然在C#4和C#5中它提供了很新方法是的异步更加简单,但是在一些老项目(还在用vs2005)上我们只能用C#2.0的语法来实现它的异步功能。 如图1,这里的RequestInfo类是请求信息的一个封装,Respo

dz45693的专栏 3794

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

WP7 异步操作 HttpWebRequest

简单的写一下吧,虽然不算多,但是要是不写估计这点知识也要忘记了。 windows phone7的开发中关于异步连接网络的操作   String url = "http://www.lalala.com";   HttpWebRequest request = WebRequest.Create(url);//不用构造方法,而是后者的一个静态方法   此处跟上一篇博文很相似,开始一个一步的操

点滴做起,方能成就大业 1596

C# .NET Core HttpClient 和 HttpWebRequest 使用

HttpWebRequest是老版本.net下常用的,较为底层且复杂,访问速度及并发也不甚理想,但是使用HttpWebRequest可以让开发者控制请求/响应流程的各个方面,如 timeouts, cookies, headers, protocols。一、可以参考微软官方提供的方法:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/http-requests?///得到返回的stream,如果请求的是一个文件或图片,可以直接使用或保存。

csdn_aspnet的专栏,请点击博客主页右上角三个点中的私信联系 1万+

c# HttpWebRequest 异步请求

【代码】c# HttpWebRequest 异步请求。

Major_S的博客 960

unity-多线程异步下载HttpWebRequest

使用的是 .net 里面的网络库 HttpWebRequest, 应用场景是需要同时下载多个小文件时, 效果很明显, 例如: 散文件热更.效果如下, 最终下载完大小是 31,715KBcsharp 代码, 里面包含 unity 和 tolua 相关, 自行去掉即可 lua 测试代码...

. 2171

HttpWebRequest 的异步封装

在HttpWebRequest 的一个 异步封装 里面提到了对HttpWebRequest的异步封装,但是如果用户不断的创建实例,那么就会有很对实例在内存中,这样是不可取,于是乎我们创建一个对象池来来管理对象的使用。因此我们需要给对象添加一属性IsBusy来标记该对象向现在是否有任务。然后我们创建一个RequestFactory来管理对象。修改后的带代码: using Sy

萌萌的It人 www.itmmd.com 3157

FCL小应用系列-----------如何利用APM实现HttpWebRequest异步发送接收

APM(异步编程模型)在.net编程中随处可见,HttpWebRequest类也实现了APM,可供用户使用。今天做了一个小实验,总结一下。还是先看代码吧。using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Web;using System

smstong的成长轨迹 1934
上一篇: 单击ListView列标题实现项排序功能
下一篇: Data Access Application Block(Enterprise Library 3.1)的下载以及使用方法介绍
「已注销」
博客等级 码龄25年 93粉丝 101原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值