C# 使用HttpWebRequest

C# POST、GET访问需要HTTP、及认证资源的实现

 在你访问一个需要HTTP Digest Authentication的URL的时候,如果你没有提供用户名和密码,服务器就会返回401,如果你直接在浏览器中打开,浏览器会提示你输入用户名和密码;要在发送请求的时候添加HTTP Digest Authentication认证信息到请求中,有两种方法:

  • 一是在请求头中添加Authorization: Authorization: "Digest 用户名和密码的base64加密字符串
  • 二是在url中添加用户名和密码: http://userName:password@XXX
  •        除去最常用的GET,当使用需要账户密码访问的站点功能时(比如以http形式访问的短信网关)常常需要POST相应信息(无论它的消息格式是什么),下面是封装好的一个方法:

  #region 网络操作

        /// <summary>
        /// 发送数据
        /// </summary>
        /// <param name="url">URL</param>
        /// <param name="postData">参数</param>
        /// <param name="timeout">超时时间</param>
        /// <param name="contentType">请求类型</param>
        /// <param name="method">方法</param>
        /// <param name="authorization">认证</param>
        /// <returns></returns>
        private string Send(string url, string postData, int timeout, string contentType = "application/json", string method = "POST", string authorization = "") {
            var result = string.Empty;

            try {

                var req = (HttpWebRequest)WebRequest.Create(url);

                if (!string.IsNullOrWhiteSpace(authorization)) {
                    req.Headers.Add("Authorization", authorization);
                } else {
                    req.Headers.Clear();
                }

                req.Method = method;

                req.ContentType = contentType;

                req.Timeout = timeout; //请求超时时间

                var data = Encoding.UTF8.GetBytes(postData);

                req.ContentLength = data.Length;

                using (var reqStream = req.GetRequestStream()) {
                    reqStream.Write(data, 0, data.Length);

                    reqStream.Close();
                }

                var resp = (HttpWebResponse)req.GetResponse();

                var stream = resp.GetResponseStream();

                //获取响应内容
                if (stream != null) {
                    using (var reader = new StreamReader(stream, Encoding.UTF8)) {
                        result = reader.ReadToEnd();
                    }
                }
            } catch (Exception ex) {
                result = new JavaScriptSerializer().Serialize(new { code = "FAIL", msg = ex.Message, sub_code = "ERROR", sub_msg = ex.Message });
            }

            return result;
        }

        /// <summary>
        /// Get请求
        /// </summary>
        /// <param name="uri"></param>
        /// <param name="timeout"></param>
        /// <returns></returns>
        public static string Get(string uri, int timeout) {
            string result;
            try {
                var request = WebRequest.Create(new Uri(uri));

                request.Timeout = timeout;

                var response = request.GetResponse();
                var stream = response.GetResponseStream();
                //获取响应内容
                if (stream != null) {
                    using (var reader = new StreamReader(stream, Encoding.UTF8)) {
                        result = reader.ReadToEnd();
                    }
                }
            } catch (Exception ex) {
                result = ex.Message;
            }

            return result;
        }

        /// <summary>
        /// 请求头中添加Authorization
        /// </summary>
        /// <param name="username"></param>
        /// <param name="password"></param>
        /// <returns></returns>
        private static string GetAuthorization(string username, string password) {
            var authorization = string.Format("{0}:{1}", username, password);
            return "Basic " + Convert.ToBase64String(new ASCIIEncoding().GetBytes(authorization));
        }

        #endregion

 

 

例如:

IP地址来源搜索 WEB 服务(是目前最完整的IP地址数据)
Endpoint:http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx
Disco        :http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?disco
WSDL      :http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?wsdl

        private void button_Click(object sender, RoutedEventArgs e)
        {

            var stringBuilder = new StringBuilder();

            stringBuilder.Append("<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:web=\"http://WebXml.com.cn/\">");
            stringBuilder.Append("   <soap:Header/>");
            stringBuilder.Append("   <soap:Body>");
            stringBuilder.Append("      <web:getCountryCityByIp>");
            stringBuilder.Append("         <web:theIpAddress>192.168.0.1</web:theIpAddress>");
            stringBuilder.Append("      </web:getCountryCityByIp>");
            stringBuilder.Append("   </soap:Body>");
            stringBuilder.Append("</soap:Envelope>");


            var result = Send("http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx", stringBuilder.ToString(), 3000, "application/soap+xml;charset=UTF-8;");

            /*
                <?xml version="1.0" encoding="utf-8"?>
                <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
                 <soap:Body>
                     <getCountryCityByIpResponse xmlns="http://WebXml.com.cn/">
                        <getCountryCityByIpResult>
                          <string>192.168.0.1</string>
                          <string>局域网 对方和您在同一内部网</string>
                        </getCountryCityByIpResult>
                     </getCountryCityByIpResponse>
                     </soap:Body>
                </soap:Envelope>
             */

 

        }

 

没有更多推荐了,返回首页