Как проверить если Система. Сеть. WebClient. DownloadData загружает двоичный файл?

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

22
задан user247702 14 May 2014 в 18:04
поделиться

5 ответов

Учитывая Ваше обновление, можно сделать это путем изменения.Method в GetWebRequest:

using System;
using System.Net;
static class Program
{
    static void Main()
    {
        using (MyClient client = new MyClient())
        {
            client.HeadOnly = true;
            string uri = "http://www.google.com";
            byte[] body = client.DownloadData(uri); // note should be 0-length
            string type = client.ResponseHeaders["content-type"];
            client.HeadOnly = false;
            // check 'tis not binary... we'll use text/, but could
            // check for text/html
            if (type.StartsWith(@"text/"))
            {
                string text = client.DownloadString(uri);
                Console.WriteLine(text);
            }
        }
    }

}

class MyClient : WebClient
{
    public bool HeadOnly { get; set; }
    protected override WebRequest GetWebRequest(Uri address)
    {
        WebRequest req = base.GetWebRequest(address);
        if (HeadOnly && req.Method == "GET")
        {
            req.Method = "HEAD";
        }
        return req;
    }
}

, С другой стороны, можно проверить заголовок при переопределении GetWebRespons (), возможно, выдаче исключения, если это не то, что Вы хотели:

protected override WebResponse GetWebResponse(WebRequest request)
{
    WebResponse resp = base.GetWebResponse(request);
    string type = resp.Headers["content-type"];
    // do something with type
    return resp;
}
56
ответ дан Marc Gravell 29 November 2019 в 03:51
поделиться

WebResponse является абстрактным классом, и свойство ContentType определяется в наследующих классах. Например, в объекте HttpWebRequest этот метод перегружается для обеспечения заголовка типа контента. Я не уверен, какой экземпляр WebResponse WebClient использует. Если Вы ТОЛЬКО хотите файлы HTML, Ваше лучшее из использования HttpWebRequest возражают непосредственно.

1
ответ дан Micah 29 November 2019 в 03:51
поделиться

Вы могли выпустить первый запрос с ГЛАВНЫМ глаголом и проверить заголовок ответа типа контента? [редактирование] похоже, что необходимо будет использовать HttpWebRequest для этого, все же.

0
ответ дан Marc Gravell 29 November 2019 в 03:51
поделиться

Ваш вопрос немного сбивает с толку: если Вы используете экземпляр Сети. Класс WebClient, Сеть. WebResponse не вводит в уравнение (кроме того, что это - действительно абстрактный класс, и Вы использовали бы конкретную реализацию, такую как HttpWebResponse, как указано в другом ответе).

Так или иначе, при использовании WebClient, можно достигнуть того, что Вы хотите путем выполнения чего-то вроде этого:

Dim wc As New Net.WebClient()
Dim LocalFile As String = IO.Path.Combine(Environment.GetEnvironmentVariable("TEMP"), Guid.NewGuid.ToString)
wc.DownloadFile("http://example.com/somefile", LocalFile)
If Not wc.ResponseHeaders("Content-Type") Is Nothing AndAlso wc.ResponseHeaders("Content-Type") <> "text/html" Then
    IO.File.Delete(LocalFile)
Else
    '//Process the file
End If

Примечание, которое действительно необходимо проверить на существование заголовка Типа контента как сервер, как гарантируют, не возвратит его (хотя большинство современных серверов HTTP будет всегда включать его). Если никакой заголовок Типа контента не присутствует, можно отступить к другому методу обнаружения HTML, например, открыв файл, читая первые 1K символы или так в строку, и видя, содержит ли это подстроку < html>

Также примечание, что это немного расточительно, поскольку Вы будете всегда передавать полный файл до решения, хотите ли Вы его или нет. Работать вокруг этого, переключаясь на Сеть. Классы HttpWebRequest/Response могли бы помочь, но стоит ли дополнительный код того, зависит от Вашего приложения...

0
ответ дан mdb 29 November 2019 в 03:51
поделиться

Я приношу извинения за не очень ясный. Я записал класс обертки, который расширяет WebClient. В этом классе обертки я добавил контейнер cookie и представил свойство тайм-аута для WebRequest.

я использовал DownloadDataAsync () от этого класса обертки, и я не смог получить тип контента от WebResponse этого класса обертки. Мое основное намерение состоит в том, чтобы прервать ответ и определить если природа текста/HTML. Если это не будет, я прерву этот запрос.

мне удалось получить тип контента после переопределения WebClient. GetWebResponse (WebRequest, IAsyncResult) метод.

следующее является образцом моего класса обертки:

public class MyWebClient : WebClient
{
    private CookieContainer _cookieContainer;
    private string _userAgent;
    private int _timeout;
    private WebReponse _response;

    public MyWebClient()
    {
        this._cookieContainer = new CookieContainer();
        this.SetTimeout(60 * 1000);
    }

    public MyWebClient SetTimeout(int timeout)
    {
        this.Timeout = timeout;
        return this;
    }

    public WebResponse Response
    {
        get { return this._response; }
    }

    protected override WebRequest GetWebRequest(Uri address)
    {
        WebRequest request = base.GetWebRequest(address);

        if (request.GetType() == typeof(HttpWebRequest))
        {
            ((HttpWebRequest)request).CookieContainer = this._cookieContainer;
            ((HttpWebRequest)request).UserAgent = this._userAgent;
            ((HttpWebRequest)request).Timeout = this._timeout;
        }

        this._request = request;
        return request;
    }

    protected override WebResponse GetWebResponse(WebRequest request)
    {
        this._response = base.GetWebResponse(request);
        return this._response;
    }

    protected override WebResponse GetWebResponse(WebRequest request, IAsyncResult result)
    {
        this._response = base.GetWebResponse(request, result);
        return this._response;
    }

    public MyWebClient ServerCertValidation(bool validate)
    {
        if (!validate) ServicePointManager.ServerCertificateValidationCallback += delegate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; };
        return this;
    }
}
0
ответ дан 29 November 2019 в 03:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: