9.5. 获得Url地址的响应:getUrlResponse


    /* 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多参数。

9.5.1. getUrlResponse的参数详解

下面就对于getUrlResponse的各个参数,进行详细解释一下:

9.5.1.1. getUrlResponse的参数:url

要访问的url地址

必填参数,无默认值。

支持http,也支持https类型的地址。

9.5.1.2. getUrlResponse的参数:headerDict

headerDict的意思是,header的dict,即用于存放对应的header信息

默认的headerDict的值为defHeaderDict

defHeaderDict值是null:


    private const Dictionary<string, string> defHeaderDict = null;

            

作用是,当不指定对应的header信息时,默认为空

常见用法中,一般也不需要指定此headerDict

当然,有时候,需要用到一些header,比如其中最最常见的referer等等。

9.5.1.3. getUrlResponse的参数:postDict

postDict即POST的dict,用于存放post数据。

默认的postDict的值为defPostDict

defPostDict值是null:


    private const Dictionary<string, string> defPostDict = null;

            

一般的GET时,无需指定此参数。

只有当是POST时,才可能会用到此postDict。

9.5.1.4. getUrlResponse的参数:timeout

timeout用于指定网络超时的最大允许时间,单位是毫秒ms。

默认的timeout的值为defTimeout

defTimeout值是30000毫秒==30秒:


    private const int defTimeout = 30 * 1000;

            

注意,此timeout,是针对于http网络发送请求后,得到服务器的响应之前,这段时间,是否超时,即和GetResponse和GetRequestStream有关。

一般来说,也不需要设置此timeout,即无需改变对应的默认超时时间。

当然,如果有需要,可以根据你自己的情况修改为更合适的值。

9.5.1.5. getUrlResponse的参数:postDataStr

postDataStr是用来传递,特殊的POST的数据是以回车为分隔符的那些POST数据的。

postDataStr的默认值为defPostDataStr

defPostDataStr值也是null:


    private const string defPostDataStr = null;

            

需要注意的是,如果是GET,很明显无需关系此参数,而如果是POST,正常情况下,也只需要去设置对应的postDict参数即可,对应的内部处理POST数据,都是以'&'为分隔符的。

但是,有些特殊的POST,POST的数据是以回车为分隔符的,比如之前折腾【记录】给BlogsToWordPress添加支持导出网易的心情随笔时遇到这种特殊情况,此时,才需要你用到此去设置postDataStr

9.5.1.6. getUrlResponse的参数:readWriteTimeout

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支持

9.5.2. getUrlResponse 的用法详解

getUrlResponse参数太多,但是其实也是自己一点点,从无到有,加进去的,以适应各种应用需求。

此处,就来通过例子来说明,如何使用此getUrlResponse函数。

9.5.2.1. 被getUrlRespHtml调用

其实,此处的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”

9.5.2.2. 只传入url而获得对应的url的response

getUrlResponse的相对次要的用法是:当有时候,不仅仅需要html,而且也要关心和处理HttpWebResponse时,此时,才会考虑直接调用getUrlResponse(而不是去调用getUrlRespHtml)

而直接使用getUrlResponse的话,相对简单的用法就是,只传入对应的url即可:

例 9.6. getUrlResponse 的使用范例:只传入url


    const string constSkydriveUrl = "https://skydrive.live.com/";
    HttpWebResponse resp = getUrlResponse(constSkydriveUrl);