.NET Framework 中 System.Net 命名空间下提供了 HttpWebRequest 和 HttpWebResponse 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对象以用于发送数据。该BeginGetRequestStream和EndGetRequestStream方法提供了发送数据流的异步访问。web
对于使用HttpWebRequest的客户端身份验证,客户端证书必须安装在当前用户的My certificate store中。正则表达式
该HttpWebRequest的类会引起引起WebException同时访问资源时发生错误。该WebException.Status属性包含一个WebExceptionStatus值,指示错误的来源。当WebException.Status是WebExceptionStatus.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 | 获取或设置 |
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 | 获取或设置 |