C# HTTP系列1 HttpWebRequest类

  .NET Framework 中 System.Net 命名空间下提供了 HttpWebRequestHttpWebResponse 2个类,他们是用于发送和接收HTTP数据的最好选择。它们支持一系列有用的属性。默认状况下这2个类对于控制台程序、WinForm、ASP.NET来讲都是可访问的。HttpWebRequest 对象不是利用 new 关键字经过构造函数来建立的,而是利用工厂机制(factory mechanism),经过抽象类WebRequest.Create()方法来建立的。html

HttpWebRequest webRequest = WebRequest.Create(url) as HttpWebRequest;

设置相关属性与请求参数后,接下来调用 HttpWebRequest. GetResponse 方法中经过 RequestUri 属性发出同步请求,并返回 HttpWebResponse 包含响应的对象。 android

HttpWebResponse webResponse = webRequest.GetResponse() as HttpWebResponse;

可使用 GetResponseStream 方法返回的流来接收响应的数据。 若是关闭响应对象或响应流时,剩余数据将做废。 将耗尽剩余的数据并关闭流的响应对象,若是如下条件成立时,将为后续请求从新使用套接字: 它是保持活动状态或经过管线传输请求,只有少许的数据须要接收,或在较短期间隔内收到剩余数据。 若是没有提到条件保存或超出消耗时间,将关闭套接字。 为保持活动状态或经过管道传递的链接,咱们强烈建议在应用程序直到 EOF 读取流。 这可确保将生成更好的性能和更低的使用的资源的后续请求重复使用套接字。能够把HTTP响应的数据流(Stream)绑定到一个StreamReader对象,而后就能够经过ReadToEnd()方法把整个HTTP响应做为一个字符串取回。也能够经过 StreamReader.ReadLine()方法逐行取回HTTP响应的内容。ios

using (StreamReader sr = new StreamReader(webResponse.GetResponseStream()))
{
   string content = sr.ReadToEnd();
}

  当您想要将数据发送到资源时,GetRequestStream方法返回一个Stream对象以用于发送数据。该BeginGetRequestStreamEndGetRequestStream方法提供了发送数据流的异步访问。web

  对于使用HttpWebRequest的客户端身份验证,客户端证书必须安装在当前用户的My certificate store中。正则表达式

  该HttpWebRequest的类会引起引起WebException同时访问资源时发生错误。该WebException.Status属性包含一个WebExceptionStatus值,指示错误的来源。当WebException.StatusWebExceptionStatus.ProtocolError时Response属性包含从资源接收的HttpWebResponse算法

 1 /// <summary>
 2 ///  HTTP请求(包含文本的body数据)
 3 /// </summary>
 4 /// <param name="url">请求目标URL</param>
 5 /// <param name="data">主体数据(普通文本或者JSON文本)</param>
 6 /// <param name="method">请求的方法。请使用 WebRequestMethods.Http 的枚举值</param>
 7 /// <param name="contentType"><see langword="Content-type" /> HTTP 标头的值。请使用 ContentType 类的常量来获取</param>
 8 /// <returns></returns>
 9 private HttpResult Request(string url, string data, string method, string contentType)
10 {
11     HttpResult httpResult = new HttpResult();
12     HttpWebRequest webRequest = null;
13 
14     try
15     {
16         webRequest = WebRequest.Create(url) as HttpWebRequest;
17         webRequest.Method = method;
18         webRequest.Headers = HeaderCollection;
19         webRequest.CookieContainer = CookieContainer;
20         webRequest.ContentType = contentType;
21         webRequest.UserAgent = _userAgent;
22         webRequest.AllowAutoRedirect = _allowAutoRedirect;
23         webRequest.ServicePoint.Expect100Continue = false;
24 
25         if (data != null)
26         {
27             webRequest.AllowWriteStreamBuffering = true;
28             using (Stream requestStream = webRequest.GetRequestStream())
29             {
30                 requestStream.Write(EncodingType.GetBytes(data), 0, data.Length);
31                 requestStream.Flush();
32             }
33         }
34 
35         HttpWebResponse webResponse = webRequest.GetResponse() as HttpWebResponse;
36         if (webResponse != null)
37         {
38             GetResponse(ref httpResult, webResponse);
39             webResponse.Close();
40         }
41     }
42     catch (WebException webException)
43     {
44         GetWebExceptionResponse(ref httpResult, webException);
45     }
46     catch (Exception ex)
47     {
48         GetExceptionResponse(ref httpResult, ex, method, contentType);
49     }
50     finally
51     {
52         if (webRequest != null)
53         {
54             webRequest.Abort();
55         }
56     }
57 
58     return httpResult;
59 }
 1 /// <summary>
 2 /// 获取HTTP访问网络期间发生错误时引起的异常响应信息
 3 /// </summary>
 4 /// <param name="httpResult">即将被HTTP请求封装函数返回的HttpResult变量</param>
 5 /// <param name="webException">访问网络期间发生错误时引起的异常对象</param>
 6 private void GetWebExceptionResponse(ref HttpResult httpResult, WebException webException)
 7 {
 8     HttpWebResponse exResponse = webException.Response as HttpWebResponse;
 9     if (exResponse != null)
10     {
11         httpResult.HttpWebResponse = exResponse;
12         httpResult.Status = HttpResult.STATUS_FAIL;
13         httpResult.StatusDescription = exResponse.StatusDescription;
14         httpResult.StatusCode = (int)exResponse.StatusCode;
15 
16         httpResult.RefCode = httpResult.StatusCode;
17         using (StreamReader sr = new StreamReader(exResponse.GetResponseStream(), EncodingType))
18         {
19             httpResult.Text = sr.ReadToEnd();
20             httpResult.RefText = httpResult.Text;
21         }
22 
23         exResponse.Close();
24     }
25 }

 

  HttpWebRequest公开发送到Internet资源的公共HTTP标头值做为属性,由方法设置或由系统设置; 下表包含完整列表。您能够在Headers属性中将其余标头设置为名称/值对。请注意,服务器和缓存可能会在请求期间更改或添加标头。api

下表列出了由属性或方法或系统设置的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

获取或设置 Accept HTTP 标头的值。

Address

获取实际响应请求的 Internet 资源的统一资源标识符 (URI)。

AllowAutoRedirect

获取或设置一个值,该值指示请求是否应跟随重定向响应。

AllowReadStreamBuffering

获取或设置一个值,该值指示是否对从 Internet 资源接收的数据进行缓冲处理。

AllowWriteStreamBuffering

获取或设置一个值,该值指示是否对发送到 Internet 资源的数据进行缓冲处理。

AuthenticationLevel

获取或设置用于此请求的身份验证和模拟的级别。

(Inherited from WebRequest)
AutomaticDecompression

获取或设置所使用的解压缩类型。

CachePolicy

获取或设置此请求的缓存策略。

(Inherited from WebRequest)
ClientCertificates

获取或设置与此请求关联的安全证书集合。

Connection

获取或设置 Connection HTTP 标头的值。

ConnectionGroupName

获取或设置请求的链接组的名称。

ContentLength

获取或设置 Content-length HTTP 标头。

ContentType

获取或设置 Content-type HTTP 标头的值。

ContinueDelegate

获取或设置当从 Internet 资源接收到 HTTP 100-continue 响应时调用的委托方法。

ContinueTimeout

获取或设置在接收到来自服务器的 100-Continue 以前要等待的超时(以毫秒为单位)。

CookieContainer

获取或设置与此请求关联的 Cookie。

CreatorInstance

当在子类中重写时,获取从 IWebRequestCreate 类派生的工厂对象,该类用于建立为生成对指定 URI 的请求而实例化的 WebRequest

(Inherited from WebRequest)
Credentials

获取或设置请求的身份验证信息。

Date

获取或设置要在 HTTP 请求中使用的 Date HTTP 标头值。

DefaultCachePolicy

获取或设置此请求的默认缓存策略。

DefaultMaximumErrorResponseLength

获取或设置 HTTP 错误响应的默认最大长度。

DefaultMaximumResponseHeadersLength

获取或设置 MaximumResponseHeadersLength 属性的默认值。

Expect

获取或设置 Expect HTTP 标头的值。

HaveResponse

获取一个值,该值指示是否收到了来自 Internet 资源的响应。

Headers

指定构成 HTTP 标头的名称/值对的集合。

Host

获取或设置要在 HTTP 请求中独立于请求 URI 使用的 Host 标头值。

IfModifiedSince

获取或设置 If-Modified-Since HTTP 标头的值。

ImpersonationLevel

获取或设置当前请求的模拟级别。

(Inherited from WebRequest)
KeepAlive

获取或设置一个值,该值指示是否与 Internet 资源创建持久性链接。

MaximumAutomaticRedirections

获取或设置请求将跟随的重定向的最大数目。

MaximumResponseHeadersLength

获取或设置响应标头容许的最大长度。

MediaType

获取或设置请求的媒体类型。

Method

获取或设置请求的方法。

Pipelined

获取或设置一个值,该值指示是否经过管线将请求传输到 Internet 资源。

PreAuthenticate

获取或设置一个值,该值指示是否随请求发送一个身份验证标头。

ProtocolVersion

获取或设置用于请求的 HTTP 版本。

Proxy

获取或设置请求的代理信息。

ReadWriteTimeout

获取或设置写入或读取流时的超时(以毫秒为单位)。

Referer

获取或设置 Referer HTTP 标头的值。

RequestUri

获取请求的原始统一资源标识符 (URI)。

SendChunked

获取或设置一个值,该值指示是否将数据分段发送到 Internet 资源。

ServerCertificateValidationCallback

获取或设置用于验证服务器证书的回调函数。

ServicePoint

获取用于请求的服务点。

SupportsCookieContainer

获取一个值,该值指示请求是否为 CookieContainer 提供支持。

Timeout

获取或设置 GetResponse() 和 GetRequestStream() 方法的超时值(以毫秒为单位)。

TransferEncoding

获取或设置 Transfer-encoding HTTP 标头的值。

UnsafeAuthenticatedConnectionSharing

获取或设置一个值,该值指示是否容许通过高速 NTLM 身份验证的链接共享。

UseDefaultCredentials

获取或设置一个 Boolean 值,该值控制默认凭据是否随请求一块儿发送。

UserAgent

获取或设置 User-agent HTTP 标头的值。

 
方法
Abort()

取消对 Internet 资源的请求。

AddRange(Int32)

向请求添加从请求数据的开始处或结束处的特定范围的字节范围标头。

AddRange(Int32, Int32)

向请求添加指定范围的字节范围标头。

AddRange(Int64)

向请求添加从请求数据的开始处或结束处的特定范围的字节范围标头。

AddRange(Int64, Int64)

向请求添加指定范围的字节范围标头。

AddRange(String, Int32)

向请求添加从请求数据的开始处或结束处计算的特定范围的 Range 标头。

AddRange(String, Int32, Int32)

向请求添加指定范围的范围标头。

AddRange(String, Int64)

向请求添加从请求数据的开始处或结束处计算的特定范围的 Range 标头。

AddRange(String, Int64, Int64)

向请求添加指定范围的范围标头。

BeginGetRequestStream(AsyncCallback, Object)

开始对用于写入数据的 Stream 对象执行异步请求。

BeginGetResponse(AsyncCallback, Object)

开始对 Internet 资源的异步请求。

CreateObjRef(Type)

建立一个对象,该对象包含生成用于与远程对象进行通讯的代理所需的所有相关信息。

(Inherited from MarshalByRefObject)
EndGetRequestStream(IAsyncResult)

结束对用于写入数据的 Stream 对象的异步请求。

EndGetRequestStream(IAsyncResult, TransportContext)

结束对用于写入数据的 Stream 对象的异步请求,并输出与该流关联的 TransportContext

EndGetResponse(IAsyncResult)

结束对 Internet 资源的异步请求。

Equals(Object)

肯定指定的对象是否等于当前对象。

(Inherited from Object)
GetLifetimeService()

检索控制此实例的生存期策略的当前生存期服务对象。

(Inherited from MarshalByRefObject)
GetObjectData(SerializationInfo, StreamingContext)

使用序列化目标对象所需的数据填充 SerializationInfo

GetRequestStream()

获取用于写入请求数据的 Stream 对象。

GetRequestStream(TransportContext)

获取用于写入请求数据的 Stream 对象,并输出与该流关联的 TransportContext

GetRequestStreamAsync()

当在子类中被重写时,将用于写入数据的 Stream 做为异步操做返回到 Internet 资源。

(Inherited from WebRequest)
GetResponse()

返回来自 Internet 资源的响应。

GetResponseAsync()

当在子类中被重写时,将做为异步操做返回对 Internet 请求的响应。

(Inherited from WebRequest)
GetType()

获取当前实例的 Type

(Inherited from Object)
InitializeLifetimeService()

获取生存期服务对象来控制此实例的生存期策略。

(Inherited from MarshalByRefObject)
MemberwiseClone()

建立当前 Object 的浅表副本。

(Inherited from Object)
MemberwiseClone(Boolean)

建立当前 MarshalByRefObject 对象的浅表副本。

(Inherited from MarshalByRefObject)
ToString()

返回表示当前对象的字符串。

(Inherited from Object)
 
安全性
WebPermission 
若要访问请求的 URI 或请求重定向到任何 URI。 关联的枚举: Connect
 
相关文章
相关标签/搜索