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