.Net下HTTP访问穿越多层代理的方法以及代理服务器的验证

C#, WebService, 技术心得 No Comments »

  我们学校的网络环境是,所有的出校访问均须通过代理服务器(我们叫作sproxy),并且不能连接国外网站。为此,我想要做一个自动抓取和验证出国代理列表的WebService。我们所有的验证代理的请求,都需要通过两层代理,最终通到用来测试的网站(我使用了www.redhat.com)

  技术上的思路是,通过连接第一层代理sproxy(支持http tunnel),给第二层代理发送GET指令,从而完成对目标网页的访问。

  首先,通过普通的匿名透明代理的方法,是直接使用Socket发送GET命令,只不过与GET普通网站稍有不同罢了

直接访问:

GET / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, */*
Accept-Language: zh-cn
UA-CPU: x86
Accept-Encoding: gzip, deflate
If-Modified-Since: Thu, 06 Jul 2006 15:39:53 GMT
If-None-Match: "1172d9-381c-44ad2ec9"
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: www.redhat.com
Connection: Keep-Alive
Cookie: s_vi=[CS]v1|44AAA05400004577-A170C060000008A[CE]; Apache=61.147.159.196.23241152032846747

通过本机CCproxy:

GET / HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, */*
Accept-Language: zh-cn
UA-CPU: x86
Proxy-Connection: Keep-Alive
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: www.redhat.com
Cookie: s_vi=[CS]v1|44AAA05400004577-A170C060000008A[CE]; Apache=61.147.159.196.23241152032846747

  可以看出来,只要给代理服务器发送正确的请求地址即可,不需要程序上特殊的变化。
  事实上,对于不使用代理服务器的场合,你可以直接向某HTTP服务器发送GET /,而这在使用代理时不行,需要说明详细地址或者标明Host: www.redhat.com

对于两层代理,就有所不同了
Read the rest of this entry »

让WebService支持Post和Get方法

WebService, 技术心得 No Comments »

  在WebService的测试页面,你看到了什么?SOAP1.1/SOAP1.2/HTTP POST三种方法的测试页面,但是事实上,此时你用post方法是无法访问这个webservice的,更不用说get了。.net 2.0下的所有新建webservice默认关闭了这两种方法,是为了安全考虑。
  但是我们有的时候不得不使用这两种方法,特别是get方法,几乎由一切软件和编程方法支持,并且可以穿越几乎所有的防火墙(除非连web访问都不让,那是中情局吧……)。那么如何让部署起来的webservice支持这种方法呢?
Read the rest of this entry »

WebService的缓存机制

C#, WebService, 技术心得 No Comments »

  WebService的缓存分为两种,一种是简单的输出缓存,一种是强大的数据缓存

  一、输出缓存
  输出缓存的使用非常简单,比较适用于WebService的参数比较少,结果比较单一的情况,例如股票信息,可以设置5-10秒的缓存,天气预报,则可以设置30分钟甚至数小时的缓存。使用方法是,在WebMethod属性上指定CacheDuration属性即可,例如

[WebMethod(Description = "Test",CacheDuration=600)]
public string Test()
{
      return "Test";
}

  这样,600秒内这个WebService的所有输出数据都将从缓存中读取,不会真正做数据处理,如果事务代码是访问数据库的话,现在这种方法就会比每次都访问数据库快得多。这种缓存适合初接触WebService的新手使用。
  要注意的是,不是所有服务都适合使用这种缓存,例如每次结果都不一样的,访问数极高的服务,缓存将会变得非常大,占用很多服务器的内存,却没有实际效果。
Read the rest of this entry »

LilyStudio & WordPress & N.Design Studio
Entries RSS Comments RSS Log in