WebRequest的通用响应

时间:2012-02-07 15:49:36

标签: c# httpwebrequest generic-programming

我刚刚编写了一个C#Lib来安全地处理WebRequests(可以找到代码打开的Here

目前,我的GET方法将始终返回一个字符串作为响应,但有时就像从站点获取验证码一样,它需要返回一个Bitmap。

我该怎么做?如何使用某种类型使此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;
    } 

3 个答案:

答案 0 :(得分:1)

方法1:

您可以使用Base64对位图进行编码。这是一个示例,向您展示如何:http://www.dailycoding.com/Posts/convert_image_to_base64_string_and_base64_string_to_image.aspx

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

方法2:

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

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

答案 1 :(得分:1)

您可以使用泛型,也可以只传递所需对象的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>();

答案 2 :(得分:1)

我建议你大部分时间都在这里。如果响应恰好是位图,那就是显示或解释重要数据的方式。

在一天结束时,你所拥有的是一组字节,它包含你从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(&#34; Content-Disposition&#34;,&#34; Attachment; filename = Report.xls&#34;); Response.ContentType =&#34; application / vnd.ms-excel&#34 ;;