C# HTTP系列1 HttpWebRequest类
.NET Framework 中 System.Net 命名空间下提供了 HttpWebRequest 和 HttpWebResponse 2个类,他们是用于发送和接收HTTP数据的最好选择。它们支持一系列有用的属性。默认情况下这2个类对于控制台程序、WinForm、ASP.NET来说都是可访问的。HttpWebRequest 对象不是利用 new 关键字通过构造函数来创建的,而是利用工厂机制(factory mechanism),通过抽象类WebRequest.Create()方法来创建的。
HttpWebRequest webRequest = WebRequest.Create(url) as HttpWebRequest;
设置相关属性与请求参数后,接下来调用 HttpWebRequest. GetResponse 方法中通过 RequestUri 属性发出同步请求,并返回 HttpWebResponse 包含响应的对象。
HttpWebResponse webResponse = webRequest.GetResponse() as HttpWebResponse;
可以使用 GetResponseStream 方法返回的流来接收响应的数据。 如果关闭响应对象或响应流时,剩余数据将作废。 将耗尽剩余的数据并关闭流的响应对象,如果以下条件成立时,将为后续请求重新使用套接字: 它是保持活动状态或通过管线传输请求,只有少量的数据需要接收,或在较短时间间隔内收到剩余数据。 如果没有提到条件保存或超出消耗时间,将关闭套接字。 为保持活动状态或通过管道传递的连接,我们强烈建议在应用程序直到 EOF 读取流。 这可确保将生成更好的性能和更低的使用的资源的后续请求重复使用套接字。可以把HTTP响应的数据流(Stream)绑定到一个StreamReader对象,然后就可以通过ReadToEnd()方法把整个HTTP响应作为一个字符串取回。也可以通过 StreamReader.ReadLine()方法逐行取回HTTP响应的内容。
using (StreamReader sr = new StreamReader(webResponse.GetResponseStream()))
{
string content = sr.ReadToEnd();
}
当您想要将数据发送到资源时,GetRequestStream方法返回一个Stream对象以用于发送数据。该BeginGetRequestStream和EndGetRequestStream方法提供了发送数据流的异步访问。
对于使用HttpWebRequest的客户端身份验证,客户端证书必须安装在当前用户的My certificate store中。
该HttpWebRequest的类会引发引发WebException同时访问资源时发生错误。该WebException.Status属性包含一个WebExceptionStatus值,指示错误的来源。当WebException.Status是WebExceptionStatus.ProtocolError时,Response属性包含从资源接收的HttpWebResponse。
/// <summary>
/// HTTP请求(包含文本的body数据)
/// </summary>
/// <param name="url">请求目标URL</param>
/// <param name="data">主体数据(普通文本或者JSON文本)</param>
/// <param name="method">请求的方法。请使用 WebRequestMethods.Http 的枚举值</param>
/// <param name="contentType"><see langword="Content-type" /> HTTP 标头的值。请使用 ContentType 类的常量来获取</param>
/// <returns></returns>
private HttpResult Request(string url, string data, string method, string contentType)
{
HttpResult httpResult = new HttpResult();
HttpWebRequest webRequest = null; try
{
webRequest = WebRequest.Create(url) as HttpWebRequest;
webRequest.Method = method;
webRequest.Headers = HeaderCollection;
webRequest.CookieContainer = CookieContainer;
webRequest.ContentType = contentType;
webRequest.UserAgent = _userAgent;
webRequest.AllowAutoRedirect = _allowAutoRedirect;
webRequest.ServicePoint.Expect100Continue = false; if (data != null)
{
webRequest.AllowWriteStreamBuffering = true;
using (Stream requestStream = webRequest.GetRequestStream())
{
requestStream.Write(EncodingType.GetBytes(data), , data.Length);
requestStream.Flush();
}
} HttpWebResponse webResponse = webRequest.GetResponse() as HttpWebResponse;
if (webResponse != null)
{
GetResponse(ref httpResult, webResponse);
webResponse.Close();
}
}
catch (WebException webException)
{
GetWebExceptionResponse(ref httpResult, webException);
}
catch (Exception ex)
{
GetExceptionResponse(ref httpResult, ex, method, contentType);
}
finally
{
if (webRequest != null)
{
webRequest.Abort();
}
} return httpResult;
}
/// <summary>
/// 获取HTTP访问网络期间发生错误时引发的异常响应信息
/// </summary>
/// <param name="httpResult">即将被HTTP请求封装函数返回的HttpResult变量</param>
/// <param name="webException">访问网络期间发生错误时引发的异常对象</param>
private void GetWebExceptionResponse(ref HttpResult httpResult, WebException webException)
{
HttpWebResponse exResponse = webException.Response as HttpWebResponse;
if (exResponse != null)
{
httpResult.HttpWebResponse = exResponse;
httpResult.Status = HttpResult.STATUS_FAIL;
httpResult.StatusDescription = exResponse.StatusDescription;
httpResult.StatusCode = (int)exResponse.StatusCode; httpResult.RefCode = httpResult.StatusCode;
using (StreamReader sr = new StreamReader(exResponse.GetResponseStream(), EncodingType))
{
httpResult.Text = sr.ReadToEnd();
httpResult.RefText = httpResult.Text;
} exResponse.Close();
}
}
HttpWebRequest公开发送到Internet资源的公共HTTP标头值作为属性,由方法设置或由系统设置; 下表包含完整列表。您可以在Headers属性中将其他标头设置为名称/值对。请注意,服务器和缓存可能会在请求期间更改或添加标头。
下表列出了由属性或方法或系统设置的HTTP标头。下表列出了由属性或方法或系统设置的HTTP标头。
| Header | 通过设置 |
|---|---|
| 接受 | 通过设置Accept属性。 |
| 连接 | 通过设置Connection属性,KeepAlive属性。 |
| 内容长度 | 通过设置ContentLength属性。 |
| Content-Type | 通过设置ContentType属性。 |
| 期望 | 通过设置Expect属性。 |
| 日期 | 设置当前日期到系统。 |
| Host | 设置为当前主机信息系统。 |
| If-Modified-Since | 通过设置IfModifiedSince属性。 |
| 范围 | 通过设置AddRange方法。 |
| 引用站点 | 通过设置Referer属性。 |
| Transfer-Encoding | 通过设置TransferEncoding属性 (SendChunked属性必须为true)。 |
| 用户代理 | 通过设置UserAgent属性。 |
本地计算机或应用程序配置文件可以指定使用默认代理。如果Proxy指定的属性,然后从代理设置Proxy属性来覆盖本地计算机或应用程序配置文件和HttpWebRequest的实例将使用指定的代理服务器设置。如果在配置文件中未指定代理且未指定Proxy属性,则HttpWebRequest类将使用从本地计算机上的Internet Explorer继承的代理设置。如果Internet Explorer中没有代理设置,则请求将直接发送到服务器。
HttpWebRequest类继承自 Internet 资源管理器以不同的方式不是直接通过 Internet Explorer 分析跳过列表的通配符字符与分析代理跳过列表。 例如,HttpWebRequest类分析的正则表达式的"nt *"从 Internet 资源管理器的跳过列表"nt。 $"。 这不同于 Internet Explorer 的本机行为。 因此的 URL"http://intxxxxx"将绕过代理帐户使用HttpWebRequest类,但将不使用 Internet Explorer 使用代理。
如果可能,框架会在创建SSL会话时对其进行缓存,并尝试将缓存会话重新用于新请求。尝试重用SSL会话时,Framework使用ClientCertificates的第一个元素(如果有),或者如果ClientCertificates为空,则尝试重用匿名会话。
出于安全原因,默认情况下禁用cookie。如果要使用cookie,请使用CookieContainer属性启用cookie。
.NET Framework 4.6 包括一个新的安全功能,将阻止不安全的密码和哈希算法的连接。 默认情况下,使用 TLS/SSL 通过 HttpClient、 HttpWebRequest、 FTPClient,SmtpClient、 SslStream 等 Api 和面向.NET Framework 4.6 的应用程序获得更安全的行为。
开发人员可能想要选择退出此行为以便保持与带 RC4 服务及其现有 SSL3 服务或 TLS 互操作性。 这篇文章介绍了如何修改你的代码,以便禁用新行为。
| Accept |
获取或设置 |
| Address |
获取实际响应请求的 Internet 资源的统一资源标识符 (URI)。 |
| AllowAutoRedirect |
获取或设置一个值,该值指示请求是否应跟随重定向响应。 |
| AllowReadStreamBuffering |
获取或设置一个值,该值指示是否对从 Internet 资源接收的数据进行缓冲处理。 |
| AllowWriteStreamBuffering |
获取或设置一个值,该值指示是否对发送到 Internet 资源的数据进行缓冲处理。 |
| AuthenticationLevel |
获取或设置用于此请求的身份验证和模拟的级别。 (Inherited from WebRequest) |
| AutomaticDecompression |
获取或设置所使用的解压缩类型。 |
| CachePolicy |
获取或设置此请求的缓存策略。 (Inherited from WebRequest) |
| ClientCertificates |
获取或设置与此请求关联的安全证书集合。 |
| Connection |
获取或设置 |
| ConnectionGroupName |
获取或设置请求的连接组的名称。 |
| ContentLength |
获取或设置 |
| ContentType |
获取或设置 |
| ContinueDelegate |
获取或设置当从 Internet 资源接收到 HTTP 100-continue 响应时调用的委托方法。 |
| ContinueTimeout |
获取或设置在接收到来自服务器的 100-Continue 之前要等待的超时(以毫秒为单位)。 |
| CookieContainer |
获取或设置与此请求关联的 Cookie。 |
| CreatorInstance |
当在子类中重写时,获取从 IWebRequestCreate 类派生的工厂对象,该类用于创建为生成对指定 URI 的请求而实例化的 WebRequest。 (Inherited from WebRequest) |
| Credentials |
获取或设置请求的身份验证信息。 |
| Date |
获取或设置要在 HTTP 请求中使用的 |
| DefaultCachePolicy |
获取或设置此请求的默认缓存策略。 |
| DefaultMaximumErrorResponseLength |
获取或设置 HTTP 错误响应的默认最大长度。 |
| DefaultMaximumResponseHeadersLength |
获取或设置 MaximumResponseHeadersLength 属性的默认值。 |
| Expect |
获取或设置 |
| HaveResponse |
获取一个值,该值指示是否收到了来自 Internet 资源的响应。 |
| Headers |
指定构成 HTTP 标头的名称/值对的集合。 |
| Host |
获取或设置要在 HTTP 请求中独立于请求 URI 使用的 Host 标头值。 |
| IfModifiedSince |
获取或设置 |
| ImpersonationLevel |
获取或设置当前请求的模拟级别。 (Inherited from WebRequest) |
| KeepAlive |
获取或设置一个值,该值指示是否与 Internet 资源建立持久性连接。 |
| MaximumAutomaticRedirections |
获取或设置请求将跟随的重定向的最大数目。 |
| MaximumResponseHeadersLength |
获取或设置响应标头允许的最大长度。 |
| MediaType |
获取或设置请求的媒体类型。 |
| Method |
获取或设置请求的方法。 |
| Pipelined |
获取或设置一个值,该值指示是否通过管线将请求传输到 Internet 资源。 |
| PreAuthenticate |
获取或设置一个值,该值指示是否随请求发送一个身份验证标头。 |
| ProtocolVersion |
获取或设置用于请求的 HTTP 版本。 |
| Proxy |
获取或设置请求的代理信息。 |
| ReadWriteTimeout |
获取或设置写入或读取流时的超时(以毫秒为单位)。 |
| Referer |
获取或设置 |
| RequestUri |
获取请求的原始统一资源标识符 (URI)。 |
| SendChunked |
获取或设置一个值,该值指示是否将数据分段发送到 Internet 资源。 |
| ServerCertificateValidationCallback |
获取或设置用于验证服务器证书的回调函数。 |
| ServicePoint |
获取用于请求的服务点。 |
| SupportsCookieContainer |
获取一个值,该值指示请求是否为 CookieContainer 提供支持。 |
| Timeout |
获取或设置 GetResponse() 和 GetRequestStream() 方法的超时值(以毫秒为单位)。 |
| TransferEncoding |
获取或设置 |
| UnsafeAuthenticatedConnectionSharing |
获取或设置一个值,该值指示是否允许经过高速 NTLM 身份验证的连接共享。 |
| UseDefaultCredentials |
获取或设置一个 Boolean 值,该值控制默认凭据是否随请求一起发送。 |
| UserAgent |
获取或设置 |
【已更新最新开发文章,点击查看详细】
C# HTTP系列1 HttpWebRequest类的更多相关文章
- HttpWebRequest类
HttpWebRequest类与HttpRequest类的区别. HttpRequest类的对象用于服务器端,获取客户端传来的请求的信息,包括HTTP报文传送过来的所有信息.而HttpWebReque ...
- Java基础复习笔记系列 五 常用类
Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String ...
- C# 之 HttpWebRequest类
提供 WebRequest 类的 HTTP 特定的实现. 继承层次结构 System.Object → System.MarshalByRefObject → System.Net.We ...
- C# HttpWebRequest类
HttpWebRequest类与HttpRequest类的区别. HttpRequest类的对象用于服务器端,获取客户端传来的请求的信息,包括HTTP报文传送过来的所有信息.而HttpWebReque ...
- VB.NET中网络编程的另一种方案----system.net中的HttpWebRequest类的使用
VB.NET中网络编程的另一种方案---- system.net中的HttpWebRequest类的使用 在VB.net中进行网络编程,除了我之前写的随笔中的使用WinHttp组件进行编程,还有另一种 ...
- C#中调用HttpWebRequest类中Get/Post请求无故失效的诡异问题
先附代码 /// <summary> /// 客户端Http(GET) /// </summary> /// <param name="strUrl" ...
- C#利用 HttpWebRequest 类发送post请求,出现“套接字(协议/网络地址/端口)只允许使用一次”问题
声明:问题虽然已经被解决,但是并没有明白具体原理,欢迎大佬补充. 最近网站出现一个问题,在C#里面使用 HttpWebRequest 类去发送post请求,偶尔 会出现 “套接字(协议/网络地址/端 ...
- c/c++ 模板与STL小例子系列<二> 模板类与友元函数
c/c++ 模板与STL小例子系列 模板类与友元函数 比如某个类是个模板类D,有个需求是需要重载D的operator<<函数,这时就需要用到友元. 实现这样的友元需要3个必要步骤 1,在模 ...
- HttpWebRequest类与HttpRequest类的区别
HttpRequest类的对象用于服务器端,获取客户端传来的请求的信息,包括HTTP报文传送过来的所有信息.而HttpWebRequest用于客户端,拼接请求的HTTP报文并发送等. HttpWebR ...
随机推荐
- 解决移动端ios下overflow-x scroll无法隐藏滚动条的问题
这次有个需求是在web首页添加分类菜单,一共是8个分类,在移动端水平展示,可以左右滚动. 最后在手机上微信浏览器看到是有个滚动条,非常影响美观. 主要通过以下代码实现水平滚动 white-space: ...
- Knative 实践:从源代码到服务的自动化部署
通过之前的文章,相信大家已经熟悉了 Serving.Eventing 以及 Tekton.那么在实际使用中,我们往往会遇到一些复杂的场景,这时候就需要各个组件之间进行协作处理.例如我们提交源代码之后是 ...
- 使用NumPy、Numba的简单使用(一)
Numpy是python的一个三方库,主要是用于计算的,数组的算数和逻辑运算.与线性代数有关的操作. 很多情况下,我们可以与SciPy和 Matplotlib(绘图库)一起使用.来替代MatLab,下 ...
- PIE调用Python返回得到直方图矩阵数组
前段时间我研究了PIE SDK与Python的结合,已经能成功的通过C#调用Python,获得彩色直方图.(上一篇随笔中有分享:https://www.cnblogs.com/yuan1120/p/1 ...
- Go语言中初始化变量中字面量&Type{}、new、make的区别
Go语言中new和make是内建的两个函数,主要用来创建分配类型内存.在我们定义生成变量的时候,可能会觉得有点迷惑,其实他们的规则很简单,下面我们就通过一些示例说明他们的区别和使用. 变量的声明 va ...
- Filco圣手二代双模蓝牙机械键盘连接方法
转自:https://www.cnblogs.com/goldenSky/p/11437780.html 常规方法 确认键盘的电源接通. 同时按下「Ctrl」+「Alt」+「Fn」执行装置切换模式.配 ...
- 4-consul HTTP API及实践
其他参考:https://www.cnblogs.com/duanxz/p/9660766.html 原文:https://www.douban.com/note/629645759/ 注意:使用AP ...
- 【转】测试开发工程师必备软硬能力&高级测试开发工程师需要具备什么能力?
对于测试的基本知识,可以查看软件测试相关书籍 对于在公司成为一位优秀的测试开发工程师,我觉得下面这篇文章涉及到的是我们需要的,稍微进行改动https://blog.csdn.net/sinat_210 ...
- string 字符串 的一些使用方法
Java语言中,把字符串作为对象来处理,类String就可以用来表示字符串(类名首字母都是大写的). 字符串常量是用双引号括住的一串字符. 例如:"Hello World" Str ...
- https申请证书并部署到网站流程,浏览器验证证书流程
https申请证书并部署到网站流程: 1.生成一对秘钥,设公钥为pubk1,私钥为prik12.假设发布的网站地址为https://www.example.com3.生成一个CSR文件(Cerific ...