/* get url's response * */ public HttpWebResponse getUrlResponse(string url, Dictionary<string, string> headerDict = defHeaderDict, Dictionary<string, string> postDict = defPostDict, int timeout = defTimeout, string postDataStr = defPostDataStr, int readWriteTimeout = defReadWriteTimeout) { #if USE_GETURLRESPONSE_BW //BackgroundWorker Version getUrlResponse HttpWebResponse localCurResp = null; getUrlResponse_bw(url, headerDict, postDict, timeout, postDataStr, readWriteTimeout); while (bNotCompleted_resp) { System.Windows.Forms.Application.DoEvents(); } localCurResp = gCurResp; //clear gCurResp = null; return localCurResp; #else //non-BackgroundWorker Version getUrlResponse return _getUrlResponse(url, headerDict, postDict, timeout, postDataStr);; #endif }
从上面的代码中可以看出,此处的getUrlResponse内部的实现,是依赖于是否设置宏USE_GETURLRESPONSE_BW,而去调用对应的BackgroundWorker版本的,还是非BackgroundWorker版本的_getUrlResponse
此处,getUrlResponse,是用来返回HttpWebResponse的,且支持N多参数。
下面就对于getUrlResponse的各个参数,进行详细解释一下:
headerDict的意思是,header的dict,即用于存放对应的header信息
默认的headerDict的值为defHeaderDict
defHeaderDict值是null:
private const Dictionary<string, string> defHeaderDict = null;
作用是,当不指定对应的header信息时,默认为空
常见用法中,一般也不需要指定此headerDict
当然,有时候,需要用到一些header,比如其中最最常见的referer等等。
postDict即POST的dict,用于存放post数据。
默认的postDict的值为defPostDict
defPostDict值是null:
private const Dictionary<string, string> defPostDict = null;
一般的GET时,无需指定此参数。
只有当是POST时,才可能会用到此postDict。
timeout用于指定网络超时的最大允许时间,单位是毫秒ms。
默认的timeout的值为defTimeout
defTimeout值是30000毫秒==30秒:
private const int defTimeout = 30 * 1000;
注意,此timeout,是针对于http网络发送请求后,得到服务器的响应之前,这段时间,是否超时,即和GetResponse和GetRequestStream有关。
一般来说,也不需要设置此timeout,即无需改变对应的默认超时时间。
当然,如果有需要,可以根据你自己的情况修改为更合适的值。
postDataStr是用来传递,特殊的POST的数据是以回车为分隔符的那些POST数据的。
postDataStr的默认值为defPostDataStr
defPostDataStr值也是null:
private const string defPostDataStr = null;
需要注意的是,如果是GET,很明显无需关系此参数,而如果是POST,正常情况下,也只需要去设置对应的postDict参数即可,对应的内部处理POST数据,都是以'&'为分隔符的。
但是,有些特殊的POST,POST的数据是以回车为分隔符的,比如之前折腾【记录】给BlogsToWordPress添加支持导出网易的心情随笔时遇到这种特殊情况,此时,才需要你用到此去设置postDataStr
readWriteTimeout指的是,针对于获得了response后,用SteamReader去read或write时,对应的超时时间。单位是毫秒ms。
readWriteTimeout的默认值是defReadWriteTimeout
defReadWriteTimeout值是30000毫秒==30秒:
private const int defReadWriteTimeout = 30 * 1000;
注意,参考微软官网的解释:HttpWebRequest.ReadWriteTimeout 属性 其默认的ReadWriteTimeout是300秒=5分钟,太长了。
所以,此处才把默认时间改短一些的,否则,5分钟的超时时间,太长了。
此参数,是经过多次折腾后,才搞明白的,详见:【已解决】C#中在GetResponseStream得到的Stream后,通过StreamReader去ReadLine或ReadToEnd会无限期挂掉 + 给StreamReader添加Timeout支持
getUrlResponse参数太多,但是其实也是自己一点点,从无到有,加进去的,以适应各种应用需求。
此处,就来通过例子来说明,如何使用此getUrlResponse函数。
其实,此处的getUrlResponse,在绝大多数的时候,都是被,我的另外一个函数:getUrlRespHtml,所调用的。
即,getUrlRespHtml,调用,getUrlResponse,获得对应的HttpWebResponse,然后后续再处理,得到返回的html的。
所以,用起来,一般都是这样的:
例 9.5. getUrlResponse 的使用范例:被getUrlRespHtml调用
// valid charset:"GB18030"/"UTF-8", invliad:"UTF8" public string getUrlRespHtml(string url, Dictionary<string, string> headerDict = defHeaderDict, string charset = defCharset, Dictionary<string, string> postDict = defPostDict, int timeout = defTimeout, string postDataStr = defPostDataStr, int readWriteTimeout = defReadWriteTimeout) { string respHtml = ""; HttpWebResponse resp = getUrlResponse(url, headerDict, postDict, timeout, postDataStr, readWriteTimeout);
关于此种用法,更详细的代码和解释,参见下面要介绍的:第 9.6 节 “获得Url地址返回的网页内容:getUrlRespHtml”
getUrlResponse的相对次要的用法是:当有时候,不仅仅需要html,而且也要关心和处理HttpWebResponse时,此时,才会考虑直接调用getUrlResponse(而不是去调用getUrlRespHtml)
而直接使用getUrlResponse的话,相对简单的用法就是,只传入对应的url即可:
例 9.6. getUrlResponse 的使用范例:只传入url
const string constSkydriveUrl = "https://skydrive.live.com/"; HttpWebResponse resp = getUrlResponse(constSkydriveUrl);