【已更新最新开发文章,点击查看详细】

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

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

设置相关属性与请求参数后,接下来调用 HttpWebRequest.HttpWebResponse 包含响应的对象。 

HttpWebResponse webResponse = webRequest.GetResponse() as HttpWebResponse;

可以把HTTP响应的数据流(Stream)绑定到一个StreamReader对象,然后就可以通过ReadToEnd()方法把整个HTTP响应作为一个字符串取回。也可以通过 StreamReader.ReadLine()方法逐行取回HTTP响应的内容。

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

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

  对于使用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属性中将其他标头设置为名称/值对。请注意,服务器和缓存可能会在请求期间更改或添加标头。

下表列出了由属性或方法或系统设置的HTTP标头。下表列出了由属性或方法或系统设置的HTTP标头。

Header 通过设置
接受 Accept属性。
连接 KeepAlive属性。
内容长度 ContentLength属性。
Content-Type ContentType属性。
期望 Expect属性。
日期 设置当前日期到系统。
Host 设置为当前主机信息系统。
If-Modified-Since IfModifiedSince属性。
范围 AddRange方法。
引用站点 Referer属性。
Transfer-Encoding SendChunked属性必须为true)。
用户代理 UserAgent属性。

 

  本地计算机或应用程序配置文件可以指定使用默认代理。如果Proxy指定的属性,然后从代理设置Proxy属性来覆盖本地计算机或应用程序配置文件和HttpWebRequest的实例将使用指定的代理服务器设置。如果在配置文件中未指定代理且未指定Proxy属性,则HttpWebRequest类将使用从本地计算机上的Internet Explorer继承的代理设置。如果Internet Explorer中没有代理设置,则请求将直接发送到服务器。

HttpWebRequest类,但将不使用 Internet Explorer 使用代理。

如果可能,框架会在创建SSL会话时对其进行缓存,并尝试将缓存会话重新用于新请求。尝试重用SSL会话时,Framework使用ClientCertificates的第一个元素(如果有),或者如果ClientCertificates为空,则尝试重用匿名会话。

出于安全原因,默认情况下禁用cookie。如果要使用cookie,请使用CookieContainer属性启用cookie。

默认情况下,使用 TLS/SSL 通过 HttpClient、 HttpWebRequest、 FTPClient,SmtpClient、 SslStream 等 Api 和面向.NET Framework 4.6 的应用程序获得更安全的行为。

这篇文章介绍了如何修改你的代码,以便禁用新行为。

属性
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

WebRequest。

(Inherited from WebRequest)
Credentials

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

Date

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

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)

TransportContext。

EndGetResponse(IAsyncResult)

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

Equals(Object)

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

(Inherited from Object)
GetLifetimeService()

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

(Inherited from MarshalByRefObject)
GetObjectData(SerializationInfo, StreamingContext)

SerializationInfo。

GetRequestStream()

Stream 对象。

GetRequestStream(TransportContext)

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 
Connect
 

相关文章:

  • 2021-11-12
  • 2022-01-23
  • 2022-12-23
  • 2022-12-23
  • 2022-01-08
猜你喜欢
  • 2021-09-20
  • 2022-12-23
  • 2021-07-10
  • 2022-12-23
  • 2021-10-11
  • 2022-12-23
相关资源
相似解决方案