WebRequest的一般响应

本文关键字:响应 WebRequest | 更新日期: 2023-09-27 18:22:48

我刚刚写了一个C#库来安全地处理WebRequest(可以在打开代码的情况下找到,在这里)

目前,我的GET方法总是会返回一个字符串作为响应,但有时就像从网站获取captchas一样,它需要返回一个位图。

我该怎么做?我如何使用一种类型使这个Get请求尽可能通用,使任何人都可以选择它将收到的响应类型。

改进问题:

这就是我现在尝试的。它不编译,因为它说它不能在以下行上将String转换为类型T

response = (T) new StreamReader(resp.GetResponseStream()).ReadToEnd();

这是我的新方法:

public T Get <T> (string url)
    {
        T response = default(T);
        // Checking for empty url
        if (String.IsNullOrEmpty(url))
        {
            throw new Exception("URL para o Request não foi configurada ou é nula.");
        }
        try
        {
            // Re-Creating Request Object to avoid exceptions
            m_HttpWebRequest = WebRequest.Create (url) as HttpWebRequest;
            m_HttpWebRequest.CookieContainer              = m_CookieJar;
            m_HttpWebRequest.Method                       = "GET";
            m_HttpWebRequest.UserAgent                    = m_userAgent;
            m_HttpWebRequest.ServicePoint.ConnectionLimit = m_connectionsLimit;
            m_HttpWebRequest.Timeout                      = m_timeout;
            m_HttpWebRequest.ContentType                  = m_contentType;
            m_HttpWebRequest.Referer                      = m_referer;
            m_HttpWebRequest.AllowAutoRedirect            = m_allowAutoRedirect;
            if (!String.IsNullOrEmpty(m_host))
            {
                m_HttpWebRequest.Host = m_host;
            }
            // Execute web request and wait for response
            using (HttpWebResponse resp = (HttpWebResponse) m_HttpWebRequest.GetResponse())
            {
              response = (T) new StreamReader(resp.GetResponseStream()).ReadToEnd();
            }
        }
        catch (Exception ex)
        {
            m_error  = ex.ToString();
            if (m_logOnError)
                LogWriter.Error(ex);
        }
        return response;
    } 

WebRequest的一般响应

您可以使用泛型,也可以只传递所需对象的Type

   private T Get<T>()
    {
        Type t_type = typeof(T);
        if (t_type == typeof(string))
        {
            // return string
        }
        else if (t_type == typeof(Bitmap))
        {
            // return bitmap
        }
    }

那就这么说吧。

Bitmap b = response.Get<Bitmap>();

方法1:

您可以使用Base64对位图进行编码。下面的示例向您展示了如何:http://www.dailycoding.com/Posts/convert_image_to_base64_string_and_base64_string_to_image.aspx

这样,即使返回图像,也总是返回字符串:-)

方法2:

您可以将类型信息附加到URL,如下所示:

GET /mypage/whatever/api?x=3&y=4&t=image

我建议您已经完成了大部分工作。如果响应恰好是位图,那么重要的是如何显示或解释数据。

在一天结束时,您所拥有的是一组字节,它包括您从get方法返回的字符串,而不管该内容是字符串还是图像。

您可以(例如,未测试的代码)将此字符串转换回字节,然后再转换为位图。

System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
Byte[] bytes = encoding.GetBytes(responseString);
TypeConverter tc = TypeDescriptor.GetConverter(typeof(Bitmap));
Bitmap bitmap1 = (Bitmap) tc.ConvertFrom(bytes);

当向用户显示数据时,如果在web浏览器中,则可以通过响应标头来控制浏览器应对响应的解释:

Response.AddHeader("内容处置","附件;filename=Report.xls");Response.ContentType="application/vnd.ms-excel";