Общий ответ веб-запроса - PullRequest
1 голос
/ 07 февраля 2012

Я только что написал C # Lib для безопасной обработки веб-запросов (что можно найти с открытым кодом, Здесь )

В настоящее время мой метод GET всегда будет возвращать строку в качестве ответа, но иногда, как при извлечении капч с сайта, вместо этого ему нужно будет возвращать растровое изображение.

Как мне это сделать? Как использовать тип Type, чтобы сделать этот запрос 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 ]

1 голос
/ 07 февраля 2012

Вы можете использовать дженерики или просто передать 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 голос
/ 07 февраля 2012

Я бы предположил, что вы большую часть пути туда. Если ответом является растровое изображение, важно то, как вы отображаете или интерпретируете эти данные.

В конце дня у вас есть набор байтов, который содержит строку, возвращаемую из метода 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);

При отображении данных пользователю, если в веб-браузере интерпретация того, что браузер должен делать с ответом, может контролироваться заголовками ответа:

Response.AddHeader ("Content-Disposition", "Attachment; filename = Report.xls"); Response.ContentType = "application / vnd.ms-excel";

1 голос
/ 07 февраля 2012

Подход 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...