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

C#, WebService, 技术心得 2 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 »

ASP.NET应用程序的http请求超时的解决方案

C#, 技术心得 1 Comment »

  写后台的WebService的时候,常常碰到大规模的后台网络访问,客户端发来一个请求,程序需要处理很长时间。比如,我的代理验证程序就是这样。此时,如果禁用了web.config中的Debug模式,就会发生超时。原因来自web.config的一个设置:httpRuntime下的executionTimeout。
  MSDN对此的解释:

executionTimeout
可选的 TimeSpan 属性。
 
指定在被 ASP.NET 自动关闭前,允许执行请求的最大秒数。
 
只有当 compilation 元素中的调试属性为 False 时,此超时属性才适用。若要帮助避免在调试期间关闭应用程序,请不要将此超时属性设置为较大值。
 
注意
在 .NET Framework 1.0 版和 1.1 版中,默认值为 90。
默认值为“00:01:50”(110 秒)。

  事实上,最后一句话是错误的,写成这种时间格式不能通过编译,必须写成整数形式的秒。
  知道了问题所在,只要修改一下这个设置即可,改成

<system .web>
        <httpruntime executionTimeout="600"/>
        </system>

即可设置超时为600秒,对我的代理验证程序足够了

WebService的缓存机制

C#, WebService, 技术心得 1 Comment »

  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