阿布云

你所需要的,不仅仅是一个好用的代理。

C#使用代理IP使用方法

阿布云 发表于

简要介绍一:WebProxy:即HTTP代理设置。

官方解释:WebProxy类包含WebRequest实例用以确定是否使用Web代理发送请求的代理设置。可以在计算机和应用程序配置文件中指定全局Web代理设置,并且应用程序可用WebProxy类的实例自定义Web代理的用途。

个人理解:即将代理IP、Port进行封装,并设置代理IP的用户名及密码,通过该用户名和密码登陆登陆代理主机并进行相关访问。

简要介绍二:HttpWebClientProtocol:所有使用HTTP传输协议的xmlWebservices客户端代理的基类。

在调用易行接口时,会动态编译源码,将编译后创建的实例强制转换成HttpWebClientProtocol类型,并在HttpWebClientProtocol中附上proxy类型,即可使用代理IP进行访问。

简要介绍三:在HttpWebRequest、WebClien、HttpWebClientProtocol都可以使用代理IP。

一:HttpWebRequest:已Http形式抓取网页,仅需在发起http前给request加上proxy属性即可,如下面使用代理IP抓取百度首页:

HttpWebRequesthttpRequest=(HttpWebRequest)HttpWebRequest.Create("");

httpRequest.Method="GET";

httpRequest.Credentials=CredentialCache.DefaultCredentials;

//设置代理属性WebProxy-------------------------------------------------

WebProxyproxy=newWebProxy();

proxy.Address=newUri(":888/");

proxy.Credentials=newNetworkCredential("juese","1029");

//在发起HTTP请求前将proxy赋值给HttpWebRequest的Proxy属性

httpRequest.Proxy=proxy;

//-------------------------------------------------

HttpWebResponseres=(HttpWebResponse)httpRequest.GetResponse();

StreamReaderreader=newStreamReader(res.GetResponseStream(),System.Text.Encoding.UTF8);

stringcontent=reader.ReadToEnd();

reader.Close();

二:WebClien:与上面类似,

WebClientwc=newWebClient();

WebProxyproxy=newWebProxy();

proxy.Address=newUri(":888/");

proxy.Credentials=newNetworkCredential("juese","1029");

wc.Proxy=proxy;

StreamPageHtml=wc.OpenRead("");

StreamReaderreader=newStreamReader(PageHtml,System.Text.Encoding.UTF8);

stringcontent=reader.ReadToEnd();

returncontent;

三:HttpWebClientProtocol:针对webService的代理IP使用(详情可参加TTS交互服务的WebServiceHelper.cs):

//获取WSDL

WebClientwc=newWebClient();

stream=wc.OpenRead(url);

ServiceDescriptionsd=ServiceDescription.Read(stream);

ServiceDescriptionImportersdi=newServiceDescriptionImporter();

sdi.AddServiceDescription(sd,string.Empty,string.Empty);

CodeNamespacecn=newCodeNamespace(@namespace);

//生成客户端代理类代码

CodeCompileUnitccu=newCodeCompileUnit();

ccu.Namespaces.Add(cn);

sdi.Import(cn,ccu);

CSharpCodeProvidericc=newCSharpCodeProvider();

//设定编译参数

CompilerParameterscplist=newCompilerParameters();

cplist.GenerateExecutable=false;

cplist.GenerateInMemory=true;

cplist.ReferencedAssemblies.Add("System.dll");

cplist.ReferencedAssemblies.Add("System.xml.dll");

cplist.ReferencedAssemblies.Add("System.Web.Services.dll");

cplist.ReferencedAssemblies.Add("System.Data.dll");

////此处不停编译,会造成内存泄露

//编译代理类

cr=icc.CompileAssemblyFromDom(cplist,ccu);

//生成代理实例,并调用方法

System.Reflection.Assemblyassembly=cr.CompiledAssembly;

Typet=assembly.GetType(@namespace+"."+classname,true,true);

objectobj=Activator.CreateInstance(t);

if(ConfigurationManager.AppSettings["UseYeexingProxy"]=="true")

ICredentialscred;

WebProxyp=null;

varprox=objasHttpWebClientProtocol;

stringproxyAddressAndPort=ConfigurationManager.AppSettings["ProxyIP"];

stringproxyUserName=ConfigurationManager.AppSettings["ProxyName"];

stringproxyPassword=ConfigurationManager.AppSettings["ProxyPwd"];

cred=newNetworkCredential(proxyUserName,proxyPassword);

p=newWebProxy(proxyAddressAndPort,true,null,cred);

prox.Proxy=p;

System.Reflection.MethodInfomi=t.GetMethod(methodname);

returnmi.Invoke(prox,args);

System.Reflection.MethodInfomi=t.GetMethod(methodname);

returnmi.Invoke(obj,args);