苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 6823|回复: 1

[源码分享] winhttp网页访问类

[复制链接]
发表于 2013-11-5 14:03:00 | 显示全部楼层 |阅读模式
该库是对ms的winhttp进行了封装。操作很灵活。
自主设置属性、协议头等!
[code=csharp]using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace GetIpAddress
{

    /// <summary>
    /// COM对象的后期绑定调用类库  
    /// </summary>
    public class ComObject
    {
        private System.Type _ObjType;
        private object ComInstance;
        /*public DxComObject()
        {
            throw new
        }*/
        public ComObject(string ComName)
        {
            //根据COM对象的名称创建COM对象
            _ObjType = System.Type.GetTypeFromProgID(ComName);
            if (_ObjType == null)
                throw new Exception("指定的COM对象名称无效");
            ComInstance = System.Activator.CreateInstance(_ObjType);
        }
        public System.Type ComType
        {
            get { return _ObjType; }
        }
        //执行的函数
        public object DoMethod(string MethodName, object[] args)
        {
            return ComType.InvokeMember(MethodName, System.Reflection.BindingFlags.InvokeMethod, null, ComInstance, args);
        }

        public object DoMethod(string MethodName, object[] args, System.Reflection.ParameterModifier[] ParamMods)
        {
            return ComType.InvokeMember(MethodName, System.Reflection.BindingFlags.InvokeMethod, null, ComInstance, args, ParamMods, null, null);
        }
        //获得属性与设置属性
        public object this[string propName]
        {
            get
            {
                return _ObjType.InvokeMember(propName, System.Reflection.BindingFlags.GetProperty, null, ComInstance, null);
            }
            set
            {
                _ObjType.InvokeMember(propName, System.Reflection.BindingFlags.SetProperty, null, ComInstance, new object[] { value });
            }
        }
    }


    /// <summary>
    /// WinHttp对象库
    /// </summary>
    public class WinHttp
    {
            private ComObject HttpObj;
    private string _ContentType;
    private int _ContentLength;
    private bool _Active;
    private System.Collections.ArrayList PostDataList;//提交的数据字段
    public WinHttp()
    {
      //构建WinHttp对象
      HttpObj = new ComObject("WinHttp.WinHttpRequest.5.1");      
      _ContentType = "application/x-www-form-urlencoded";
      _ContentLength = 0;  
      PostDataList = new System.Collections.ArrayList();
    }
   
    //提交参数信息的个数
    public int PostDataCount
    {
      get{return PostDataList.Count;}
    }

    //设置Content-Type属性
    public string ContentType
    {
      get{return _ContentType;}
      set
      {
        if(!_Active) _ContentType = value;
        else if(_ContentType.CompareTo(value)!=0)
        {
          _ContentType = value;
          SetRequestHeader("Content-Type",_ContentType);
        }
      }
    }
   
    //对象是否是打开状态
    public bool Active
    {
      get{return _Active;}
    }
   
    //设置Send数据的长度
    public int ContentLength
    {
      get{return _ContentLength;}
      set
      {
        if(!_Active) _ContentLength = value;
        else if(_ContentLength != value)
        {
          _ContentLength = value;
          HttpObj.DoMethod("SetRequestHeader",new object[2]{"Content-Length",value});
        }
      }
    }
   
    //执行之后返回的结果
    public string ResponseBody
    {
      get
      {
        if(_Active)
        {
          ComObject AdoStream = new ComObject("Adodb.Stream");
          AdoStream["Type"] = 1;
          AdoStream["Mode"] = 3;
          AdoStream.DoMethod("Open",new object[]{});
          AdoStream.DoMethod("Write",new object[1]{HttpObj["ResponseBody"]});
          AdoStream["Position"] = 0;
          AdoStream["Type"] = 2;
          AdoStream["Charset"] = "GB2312";
          return AdoStream["ReadText"].ToString();
        }
        else return "";
      }
    }
   
    //设定请求头
    public string SetRequestHeader(string Header,object Value)
    {   
      object obj;
      obj = HttpObj.DoMethod("SetRequestHeader",new object[]{Header,Value});
      if(obj != null) return obj.ToString();
      else return "True";
    }
   
    //打开URL执行OpenMethod方法,Async指定是否采用异步方式调用,异步方式不会阻塞
    public string Open(string OpenMethod,string URL,bool Async)
    {
      object obj;
      obj = HttpObj.DoMethod("Open",new object[]{OpenMethod,URL,Async});      
      if (obj != null)
      {
        _Active = false;
        return obj.ToString();
      }
      else
      {        
        SetRequestHeader("Content-Type",_ContentType);
        SetRequestHeader("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
        if (_ContentLength != 0) SetRequestHeader("Content-Length",_ContentLength);         
          _Active = true;
        return "True";
      }
    }      
   
    //发送数据
    public string Send(string body)
    {
      if(!_Active) return "False";
      object obj;
      obj = HttpObj.DoMethod("Send",new object[1]{body});
      if(obj != null) return obj.ToString();
      else return "True";
    }
   
        //清空提交信息
    public void ClearPostData()
    {
      this.PostDataList.Clear();
    }

    //增加提交数据信息
    public void AddPostField(string FieldName,object Value)
    {
      this.PostDataList.Add(FieldName+"="+Value.ToString());
    }
   
    //通过参数指定提交
    public string Post()
    {
      if(!_Active)
      {
        return "False";
      }
      string st="";
      for(int i=0;i<this.PostDataList.Count;i++)
      {
        if(st != "") st = st + "&"+ PostDataList.ToString();
        else st = PostDataList.ToString();
      }
      this.ContentLength = st.Length;
      return Send(st);
    }
   
    //设置等待超时等
    public string SetTimeouts(long ResolveTimeout,long ConnectTimeout,long SendTimeout,long ReceiveTimeout)
    {
      object obj;
      obj = HttpObj.DoMethod("SetTimeouts",new object[4]{ResolveTimeout,ConnectTimeout,SendTimeout,ReceiveTimeout});
      if(obj != null) return obj.ToString();
      else return "True";
    }
    //等待数据提交完成
    public string WaitForResponse(object Timeout,out bool Succeeded)
    {
      if(!_Active) {Succeeded = false;return "";}
      object obj;
      bool succ;
      succ = false;
      System.Reflection.ParameterModifier[] ParamesM;
      ParamesM = new System.Reflection.ParameterModifier[1];
      ParamesM[0] = new System.Reflection.ParameterModifier (2); // 初始化为接口参数的个数
      ParamesM[0][1] = true; // 设置第二个参数为返回参数
      
      //ParamesM[1] = true;
      object[] ParamArray = new object[2]{Timeout,succ};
      obj = HttpObj.DoMethod("WaitForResponse",ParamArray,ParamesM);
      System.Windows.Forms.MessageBox.Show(ParamArray[1].ToString());
      Succeeded=bool.Parse(ParamArray[1].ToString());
      //Succeeded = bool.Parse(ParamArray[1].ToString);
      if(obj != null)  {return obj.ToString();}
      else return "True";
    }
   
    public string GetResponseHeader(string Header,ref string Value)
    {
      if(!_Active) {Value="";return "";}
      object obj;
      /*string str;
      str = "";
      System.Reflection.ParameterModifier[] Parames;
      Parames = new System.Reflection.ParameterModifier[1];
      Parames[0] = new System.Reflection.ParameterModifier (2); // 初始化为接口参数的个数
      Parames[0][1] = true; */// 设置第二个参数为返回参数
      obj = HttpObj.DoMethod("GetResponseHeader",new object[2]{Header,Value});
      //Value = str;
      if(obj != null) {return obj.ToString();}
      else return "True";
    }
  }
}
[/code]


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2013-11-9 11:09:34 | 显示全部楼层
可以搞个例子吗
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-12-28 04:34

© 2014-2021

快速回复 返回顶部 返回列表