• C# HTTP系列1 HttpWebRequest类


      .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. 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对象以用于发送数据。该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属性。
    连接 通过设置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
     
  • 相关阅读:
    原码、反码、补码之间的相互关系
    在用 JavaScript 工作时,我们经常和条件语句打交道,这里有5条让你写出更好/干净的条件语句的建议。
    冒泡排序最佳情况的时间复杂度
    path的join和resolve的使用区别
    SCSS入门
    webpack 前后端分离开发接口调试解决方案,proxyTable解决方案
    JS中原型链的理解
    30分钟,让你彻底明白Promise原理
    状态码常用对照表
    前端性能优化方案都有哪些?
  • 原文地址:https://www.cnblogs.com/SavionZhang/p/11392709.html
Copyright © 2020-2023  润新知