C# Http网络访问类

C# 利用代理 (proxy) 爬网  情况描述:对某些内部网络,要访问外面,需要走代理 投票刷票的时候,限制IP地址 干其他坏事 其实从.NET 2.0 开始,.NET开发的程序,利用代理访问网络就已经很容易了,微软 为我们封装好了 WebProxy,我们所要做的,只是指定一下代理服务器的具体信息就OK了 ,不罗嗦了,上代码//需要使用的NameSpace: System.Net//代码片段/ 阅读详情


using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;

namespace HttpClient
{

    /// <summary>
    /// 通过Http协议访问Web
    /// </summary>
    public class HttpClient
    {
        #region Cookie集合
        /// <summary>
        /// Cookie集合
        /// </summary>
        private CookieContainer cookies;
        #endregion

        #region Http user-agent标头值
        /// <summary>
        /// Http user-agent标头值
        /// </summary>
        public string UserAgent { get; set; }
        #endregion

        #region HttpClient构造函数
        public HttpClient()
        {
            this.cookies = new CookieContainer();
        }
        #endregion 

        #region 获取HttpClient的Cookie集合
        /// <summary>
        /// 获取HttpClient的Cookie集合
        /// </summary>
        /// <returns></returns>
        public CookieContainer GetCookieContainer()
        {
            return this.cookies;
        }
        #endregion

        #region 设置HttpClient的Cookie集合
        /// <summary>
        /// 设置HttpClient的Cookie集合
        /// </summary>
        /// <param name="_cookie">Cookie集合对象</param>
        /// <returns>True设置成功 False设置失败</returns>
        public bool SetCookieContainer(CookieContainer _cookie)
        {
            if (_cookie != null)
            {
                this.cookies = _cookie;
                return true;
            }
            return false;
        }
        #endregion

        #region 以GET方式打开一个Http连接
        /// <summary>
        /// 以GET方式打开一个Http连接
        /// </summary>
        /// <param name="url">地址</param>
        /// <param name="headers">请求头</param>
        /// <returns></returns>
        public ResultResponse OpenGetUrl(string url, Dictionary<string, string> headers)
        {
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
            request.CookieContainer = this.cookies;
            request.Method = HttpClient.ConnectionType.GET;
            request.KeepAlive = true;
            if (this.UserAgent != null && this.UserAgent != "")
            {
                request.UserAgent = this.UserAgent;
            }
            this.FillHeaders(request, headers);
            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
            return new ResultResponse(response);
        }
        #endregion

        #region 以GET方式打开一个Http连接,302自定义处理行为
        /// <summary>
        /// 以GET方式打开一个Http连接,302自定义处理行为
        /// </summary>
        /// <param name="url">地址</param>
        /// <param name="headers">请求头</param>
        /// <param name="action">302跳转处理</param>
        /// <returns></returns>
        public ResultResponse OpenGetUrlRedirect(string url, Dictionary<string, string> headers,HttpClient.RedirectAction action)
        {
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
            request.CookieContainer = this.cookies;
            request.Method = HttpClient.ConnectionType.GET;
            request.KeepAlive = true;
            request.AllowAutoRedirect = false; //302不采用默认行为处理
            if (this.UserAgent != null && this.UserAgent != "")
            {
                request.UserAgent = this.UserAgent;
            }
            this.FillHeaders(request, headers);
            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
            ResultResponse result=new ResultResponse(response);
            if (response.StatusCode == HttpStatusCode.Found)
            {
                bool ret = true;
                if (action != null)
                {
                    ret = action(result);
                }
                string locationurl = response.Headers["Location"];
                if (ret == true)
                {
                    return this.OpenGetUrlRedirect(locationurl, null, action);
                }
                return result;
            }
            return result;
        }
        #endregion

        #region Http 302跳转处理
        /// <summary>
        /// Http 302跳转处理
        /// </summary>
        /// <param name="result">响应对象</param>
        /// <returns>False 不继续跳转 True继续跳转</returns>
        public delegate bool RedirectAction(ResultResponse result);
        #endregion

        #region 将Http标头值添加到Request对象中
        /// <summary>
        /// 将Http标头值添加到Request对象中
        /// </summary>
        /// <param name="headers"></param>
        private void FillHeaders(HttpWebRequest request,Dictionary<string, string> headers)
        {
            if (headers != null && headers.Count > 0)
            {
                Dictionary<string, string>.Enumerator em = headers.GetEnumerator();
                while (em.MoveNext())
                {
                    request.Headers.Add(em.Current.Key, em.Current.Value);
                }
            }
        }
        #endregion

        #region 以POST方式打开一个Http连接
        /// <summary>
        /// 以POST方式打开一个Http连接
        /// </summary>
        /// <param name="url">地址</param>
        /// <param name="headers">请求头</param>
        /// <param name="data">发送的数据</param>
        /// <returns></returns>
        public ResultResponse OpenPostUrl(string url,Dictionary<string,string> headers,Dictionary<string,string> data)
        {
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
            request.CookieContainer = this.cookies;
            request.Method = HttpClient.ConnectionType.POST;
            request.KeepAlive = true;
            if (this.UserAgent != null && this.UserAgent != "")
            {
                request.UserAgent = this.UserAgent;
            }
            this.FillHeaders(request, headers);
            byte[] buff = DictToBytes(data);
            request.GetRequestStream().Write(buff, 0, buff.Length);
            request.GetRequestStream().Close();
            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
            return new ResultResponse(response);
        }
        #endregion

        #region 以POST方式打开一个Http连接,302自定义处理行为
        /// <summary>
        /// 以POST方式打开一个Http连接,302自定义处理行为
        /// </summary>
        /// <param name="url">地址</param>
        /// <param name="headers">请求头</param>
        /// <param name="data">发送的数据</param>
        /// <param name="action">302自定义处理</param>
        /// <returns></returns>
        public ResultResponse OpenPostUrlRedirect(string url, Dictionary<string, string> headers, Dictionary<string, string> data,HttpClient.RedirectAction action)
        {
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
            request.CookieContainer = this.cookies;
            request.Method = HttpClient.ConnectionType.POST;
            request.KeepAlive = true;
            request.AllowAutoRedirect = false;
            if (this.UserAgent != null && this.UserAgent != "")
            {
                request.UserAgent = this.UserAgent;
            }
            this.FillHeaders(request, headers);
            byte[] buff = DictToBytes(data);
            request.GetRequestStream().Write(buff, 0, buff.Length);
            request.GetRequestStream().Close();
            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
            ResultResponse result = new ResultResponse(response);

            if (response.StatusCode == HttpStatusCode.Found)
            {
                bool ret = true;
                if (action != null)
                {
                    ret = action(result);
                }
                string locationurl = response.Headers["Location"];
                return result;
            }
            return result;
        }
        #endregion

        #region 将字典的key和value拼接成http参数
        /// <summary>
        /// 将字典的key和value拼接成http参数
        /// </summary>
        /// <param name="dic">参数</param>
        /// <returns></returns>
        private byte[] DictToBytes(Dictionary<string, string> dic)
        {
            StringBuilder sb = null;
            if (dic != null)
            {
                Dictionary<string,string>.Enumerator em= dic.GetEnumerator();
                sb = new StringBuilder();
                while (em.MoveNext())
                {
                    sb.Append(String.Format("{0}={1}&", em.Current.Key, em.Current.Value));
                }
                return System.Text.Encoding.UTF8.GetBytes(sb.ToString());
            }
            return null;
        }
        #endregion

        #region HttpClient打开连接的方式
        /// <summary>
        /// HttpClient打开连接的方式
        /// </summary>
        public static class ConnectionType
        {
            public static string GET { get { return "GET"; } }
            public static string POST { get { return "POST"; } }
        }
        #endregion




    }
}

<pre name="code" class="csharp">using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;

namespace HttpClient
{

    /// <summary>
    ///包含服务器响应数据的对象
    /// </summary>
    public class ResultResponse
    {
        #region HttpWebResponse对象
        /// <summary>
        /// HttpWebResponse对象
        /// </summary>
        private HttpWebResponse m_response;
        #endregion

        #region 创建一个HttpWebResponse对象
        /// <summary>
        /// 创建一个HttpWebResponse对象
        /// </summary>
        /// <param name="_response">HttpWebResponse</param>
        public ResultResponse(HttpWebResponse _response)
        {
            this.m_response = _response;
        }
        #endregion

        #region 获取响应内容的二进制流
        /// <summary>
        /// 获取响应内容的二进制流 
        /// </summary>
        /// <returns></returns>
        public Stream GetResponseStream()
        {
            if (this.m_response != null)
            {
                return this.m_response.GetResponseStream();
            }
            return null;
        }
        #endregion

        #region Http版本
        /// <summary>
        /// Http版本
        /// </summary>
        public string ProtocolVersion { get { return this.m_response != null ? this.m_response.ProtocolVersion.ToString() : ""; } }
        #endregion
        /// <summary>
        /// 响应方法
        /// </summary>
        public string Method { get { return this.m_response != null ? this.m_response.Method : ""; } }
        /// <summary>
        /// Http状态码
        /// </summary>
        public string StatusCode { get { return this.m_response != null ? this.m_response.StatusCode.ToString() : ""; } }
        /// <summary>
        /// Http响应头
        /// </summary>
        public WebHeaderCollection Headers { get { return this.m_response != null ? this.m_response.Headers : null;} }

        /// <summary>
        /// 响应流的字符编码
        /// </summary>
        /// <returns></returns>
        public Encoding getResponseEncoding()
        {
            if (this.m_response != null)
            {
                return Encoding.GetEncoding(this.m_response.ContentEncoding);
            }
            return null;
        }

        /// <summary>
        /// 获取响应内容的字符串
        /// </summary>
        /// <param name="encoding">字符串编码(默认utf8)</param>
        /// <returns></returns>
        public string GetContent(string encoding="utf-8")
        {
            return System.Text.Encoding.GetEncoding(encoding).GetString(this.StreamtoBytes(this.GetResponseStream()));
        }

        /// <summary>
        /// 获取原始的HttpWebResponse
        /// </summary>
        /// <returns></returns>
        public HttpWebResponse GetRawResponse()
        {
            return this.m_response;
        }

        /// <summary>
        /// 二进制流转换成字节数组
        /// </summary>
        /// <param name="_stream"></param>
        /// <returns></returns>
        private byte[] StreamtoBytes(Stream _stream)
        {
            byte[] buff;
            int rlen;
            MemoryStream _ms;
            if (_stream != null)
            {
                buff = new byte[1024];
                rlen = 0;
                _ms = new MemoryStream();
                while ((rlen = _stream.Read(buff, 0, 1024)) > 0)
                {
                    _ms.Write(buff, 0, rlen);
                }
                buff = _ms.ToArray();
                _ms.Close();
                _ms.Dispose();
                return buff;
            }
            return null;
        }
    }
}






C#访问Http及https操作 public class ApiResult { public int statusCode; public string result; public string errcode; public string memo; } private ApiR... 阅读详情

相关推荐

C#——如何使用HttpClient类实现Http通信

HttpClient类实例充当发送HTTP请求的会话。HttpClient实例是应用于该实例执行的所有请求的设置集合。此外,每个HttpClient实例都使用自己的连接池,将自己的请求与其他HttpClient实例执行的请求隔离开来。

weixin_59555766的博客 2938

C# HttpClient 的同步使用方法

无返回值 函数 private async void getservertime() { string servertime = "0";//实际应用时用全局变量 ,传入参数不可用ref out关键字 HttpClientHandler handler1 = new HttpClientHandler(...

cnwjl的博客 8944

C# 中的 HTTP 请求模拟与 POST 请求实战

HTTP(HyperText Transfer Protocol)请求方法用于告诉服务器需要执行的动作。最常见的一些HTTP方法包括:GET:请求指定的资源。POST:向指定资源提交数据进行处理请求(例如,表单数据)。PUT:从客户端向服务器传送的数据取代指定的文档的内容。DELETE:请求服务器删除指定的资源。HEAD:类似于GET请求,但只返回HTTP头,不返回具体的内容。不同的HTTP方法具有不同的语义,它们被用来表达对资源的不同操作意图。

weixin_34945060的博客 1945

一个c#的与web服务器交互的HttpClient类

using System;using System.Collections.Generic;using System.IO;using System.Text;using System.Net;using System.Web;namespace Deerchao.Utility{ public class HttpClient { #region fields...

weixin_30439031的博客 286

大白映射 宝马Esys编程设码映射、USB设备映射

大白映射,宝马Esys设码编程、USB设备映射

denson0394的博客 4799

国家医保移动支付国密算法SM2签名验签、SM4加解密DLL

DLL,非.net开发,所以无需安装配置,直接程序引用开发即可,支持各类开发语言。已知省份有广西、贵州、安徽、河北、黑龙江、湖南、吉林、江苏、四川、新疆等各地方。国家医保移动支付国密算法SM2签名验签、SM4加解密DLL。//SM4加密与解密。支持医保移动支付(国家统一版),//SM2签名与验签。

4263

HTTP请求头中的User-Agent字段

当我们使用python爬虫爬取数据时,经常会遇到爬取请求拒绝的问题,通过查看请求信息,我们会发现,一般写的爬虫会默认告诉服务器自己发送了一个Python爬取请求,而一般网站是不允许被爬虫访问的,可能是因为会涉及到商业问题。最后,通过更改User-Agent字段就可以轻易骗过该网站。

wynn的博客 2912

Quartus (Quartus Prime 18.1)的安装及仿真步骤

前两天做计组的课设需要用到Quartus 这个软件,但安装有点麻烦,在网上搜了很多教程,发现都是旧版本的,最后弄了好半天才把环境搭建好。所以,分享一下它的搭建过程。 因为我不经常用它,所以安装的版本是精简版的其他版本的也应该差不多以下是需要下载的安装包: 准备: Quartus Prime 精简版,最新发布: v18.1 1. QuartusLiteSetup-18.1.0.625-wi...

weixin_41082948的博客 8万+

C# .net 集合-并发处理http请求之HttpClient

通常我们进行http请求使用WebRequest,这个建立的 http 连接数就只有2个或10个。对于一些诸如浏览器或网络蜘蛛的应用,2个或10个并发数量实在太少,大大影响应用的性能。 在net4.0以后新加了一个HttpClient,在.net 4.5 新加了 async/await 配合httpclient来进行多线程使用。我们看一下原始 WebRequest进行get\post请求的方法

Harry_一棵树的博客 1万+

Tesseract OCR识别不准?手把手教你用PyAutoGUI提升自动点击脚本的准确率

本文针对Tesseract OCR在屏幕自动化中识别不准的问题,提供了一套完整的优化方案。通过PyAutoGUI精准截图、结合PIL和OpenCV进行图像预处理(如灰度化、对比度增强、自适应二值化),并调优Tesseract参数(如PSM模式、白名单),显著提升文本识别准确率。文章还介绍了结合模板匹配、构建容错循环等进阶技巧,帮助开发者打造高可靠性的自动点击脚本。

weixin_29093017的博客 544

UE5Could not be compiled. Try rebuilding from source manually.

UE5Could not be compiled. Try rebuilding from source manually.

weixin_45417260的博客 2770

HttpClient 教程 (一)

前言 超文本传输协议(HTTP)也许是当今互联网上使用的最重要的协议了。Web服务,有网络功能的设备和网络计算的发展,都持续扩展了HTTP协议的角色,超越了用户使用的Web浏览器范畴,同时,也增加了需要HTTP协议支持的应用程序的数量。 尽管java.net包提供了基本通过HTTP访问资源的功能,但它没有提供全面的灵活性和其它很多应用程序需要的功能。HttpClient就是寻求弥补这项空白...

weixin_34250709的博客 611

通过电源模块降低电源噪声的3种方法

电源噪声是一种常见且不受欢迎的电气现象。如果不降低噪声,其会对敏感的医疗、测试测量、航空航天和国防系统的应用性能产生不利影响。当今的高精度模拟信号链系统需要直流/直流开关稳压器产生稳压电源轨,为低噪声应用中的模数转换器(ADC)、数模转换器(DAC)、现场可编程门阵列(FPGA)及其子系统供电。尽管直流/直流开关稳压器具有高工作效率,它们的开关操作会导致较大的不连续电流,从而产生较高的输入和输出电压纹波、频率尖峰和宽带噪声。

qq_43416206的博客 1424

8-网络请求之http

本篇博客对应视频讲解回顾 上一篇讲了Linq的使用,大家自己上手实践之后,相信一定会感到非常快捷方便。更多详细的内容还是需要自己去阅读官方文档。 今天要讲网络请求中的http请求,这也是在编程当中经常使用到的内容之一。 Http请求 关于Http是什么,请求类型这些内容我在此都不说了,需要大家自己阅读相关资料。通常来讲,我们在进行数据采集,API调用,模拟登录等功能开发的时候,免不了使用h...

weixin_30460489的博客 132

AI学习指南RAG篇(19)-API调用与集成

通过上述API调用示例,您可以方便地将RAGFlow与其他系统集成,实现数据集管理、文档处理、会话管理等功能。希望本文的介绍能帮助您更好地理解和使用RAGFlow的API。

俞兆鹏的博客 2545

华为OD机试真题-国际移动用户识别码(IMSI)匹配

华为OD机试双机位C卷 国际移动用户识别码(IMSI)匹配 , 提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 - 国际移动用户识别码(IMSI)匹配

qq_45776114的博客 4925

【Unity网络编程知识】C#的 Http相关类学习

重要方法1)Create 创建新的WebRequest,用于进行HTTP相关操作2)Abort 如果正在进行文件传输,用此方法可以终止传输3)GetRequestStream 获取用于上传的流4)GetResponse 返回HTTP服务器响应5)Begin/EndGetRequestStream 异步获取用于上传的流6)Begin/EndGetResponse 异步获取返回的HTTP服务器响应重要成员1)Credentials通信凭证,设置为NetworkCredential对象。

zhoutao2333的博客 1591

ssm框架搭建

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

C#底层库–网络通信帮助类HTTP

文将新增一个专栏–底层库,分享编程过程中常用的方法函数。我们将这些常用的方法函数,进行封装,反复测试,形成通用化类库。方便研发人员,只需要几行代码就可以使用它,解决一些难点问题。底层库的封装涉及到:数据库操作、加解密算法、日志记录、网络通信、邮件发送、文件操作、参数保存、Excel导入导出等等,持续关注本专栏吧。大家有任何问题,也可以评论区反馈,私信我。网络访问帮助类,采用HTTP方式访问服务端,包含get、post、put、delete。

花北城的博客 1812

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C# HTTP系列 HttpWebRequest 与 HttpWebResponse

HTTP协议,即超文本传输协议(Hypertext transfer protocol)。是一种详细规定了浏览器和万维网(WWW = World Wide Web)服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。   HTTP是一个简单的请求-响应协议,它通常运行在TCP之上,是一个无状态的协议。它指定了...

u013407012的专栏 3372

C# 访问Http请求

访问Get请求 /// <summary> /// Get请求 /// </summary> /// <param name="serviceUrl"></param> /// <returns></returns> public static string Get(string serviceUrl) { ...

weixin_45414738的博客 1896

c# 网络编程之http

一、概述 本文目的是通过C#代码提供一个HTTP服务,正常情况下如果我们需要向外界提供HTTP服务,常规做法就是通过ASP.NET来实现,有时我们的应用程序或Windows服务需要向外提供一些简单的HTTP服务就可以自己实现,从而避免部署IIS增加系统复杂性。这里必须强调是一些简单的应用,如果应用比较复杂,涉及到路径解析HTML解析等,还是用WEB方式实现比较靠谱。 将HTTP和UDP、TCP放在同一个系列实际上有一点不合适,因为UDP、TCP属于传输层协议,HTTP属于应用层协议,希望读者首先有一个明确的

chinaherolts2008的博客 3672

c# 调用jtts_Http下的各种操作类.WebApi系列~通过HttpClient来调用Web Api接口

http://www.cnblogs.com/lori/p/4045413.htmlhttp://blog.youkuaiyun.com/wangpeng047/article/details/196245292.C#通过WebClient,HttpWebRequest实现http的post和get方法来自baidu 文档:http://wenku.baidu.com/link?url=nr7p0kmFbQ_...

weixin_39870413的博客 238

C#网络编程之HTTP工具类

/// ///  /// desc:HTTP工具类(上传数据和下载数据) /// auth:LYK /// date:2017/9/20 11:24:05 /// /// namespace UploadAndDownloadDatas {     public static class HttpTools     {         #region   上传文件

adliy_happy的博客 2890

C# 中经常用到的HTTP请求类,已封装get,post,delete,put

C# 中经常用到的HTTP请求类,已封装get,post,delete,put using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.IO; using System.Web; namespace WebAPIC...

cxu123321的博客 1609

c#实现http断点下载

用C#实现HTTP协议下的多线程文件传输 2009-03-18 19:08 很多人都有过使用网络蚂蚁或网络快车互联网文件的经历,这些软件的使用可以大大加速互联网上文件的传输速度,减少文件传输的时间。这些软件为什么有如此大的魔力呢?其主要原因是这些软件都采用了多线程下载和断点续传技术。如果我们自己来编写一个类似这样的程序,也能够快速的在互联网上下载文件,那一定是非常愉快的事情

清风六月C# C/C++ 1552

在c#中get同步访问http

参照文章:http://blog.youkuaiyun.com/qianmenfei/article/details/37974767 public static string SendMessage(string url, Encoding encode = null) { string result; ...

aex34027的博客 133
上一篇: Python库应用之Json
下一篇: AndroidStudio NDK开发
IT回忆录
博客等级 码龄16年 42粉丝 100原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值