IIS 7 справился, модуль не мог отправить Довольную Длину или байты

Во-первых, вы можете создать функцию, которая будет возвращать весь HTML-код сайта, как вы это сделали. Вот тот, который у меня есть!

public string GetPageContents()
{
    string link = "https://www.abc.net.au/news/science/"
    string pageContent = "";
    WebClient web = new WebClient();
    Stream stream;

    stream = web.OpenRead(link);
    using (StreamReader reader = new StreamReader(stream))
    {
        pageContent = reader.ReadToEnd();
    }
    stream.Close();

    return pageContents;
}

Тогда вы можете создать функцию, которая будет возвращать подстроку или список подстрок (это означает, что если вы захотите все теги < a>, вы, вероятно, получите больше, чем один).

List<string> divTags = GetBetweenTags(pageContents, "<div>", "</div>")

Это даст вам список, где вы можете, например, сделать еще один поиск для < a> теги внутри каждого из них < теги div>.

public List<string> GetBetweenTags(string pageContents, string startTag, string endTag)
{
    Regex rx = new Regex(startTag + "(.*?)" + endTag);
    MatchCollection col = rx.Matches(value);

    List<string> tags = new List<string>();

    foreach(Match s in col)
        tags.Add(s.ToString());

    return tags;
}

Редактировать: Ух ты, не знал о HTML Agility Pack, спасибо @Gauravsa, я обновлю свой проект, чтобы использовать его!

7
задан matt.mercieca 27 January 2009 в 16:05
поделиться

1 ответ

Достигать байты отправило, можно использовать HttpResponse.Filter свойство. Поскольку в документах MSDN говорится, что это свойство получает или устанавливает переносящийся объект фильтра, который используется для изменения тела объекта HTTP перед передачей.

Можно создать новое System.IO.Stream это переносит существующее HttpResponse.Filter поток и количества байты передали в Write метод перед передачей их. Например:

public class ContentLengthModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.BeginRequest += OnBeginRequest;
        context.EndRequest += OnEndRequest;
    }

    void OnBeginRequest(object sender, EventArgs e)
    {
        var application = (HttpApplication) sender;
        application.Response.Filter = new ContentLengthFilter(application.Response.Filter);
    }

    void OnEndRequest(object sender, EventArgs e)
    {
        var application = (HttpApplication) sender;
        var contentLengthFilter = (ContentLengthFilter) application.Response.Filter;
        var contentLength = contentLengthFilter.BytesWritten;
    }

    public void Dispose()
    {
    }
}

public class ContentLengthFilter : Stream
{
    private readonly Stream _responseFilter;

    public int BytesWritten { get; set; }

    public ContentLengthFilter(Stream responseFilter)
    {
        _responseFilter = responseFilter;
    }

    public override void Flush()
    {
        _responseFilter.Flush();
    }

    public override long Seek(long offset, SeekOrigin origin)
    {
        return _responseFilter.Seek(offset, origin);
    }

    public override void SetLength(long value)
    {
        _responseFilter.SetLength(value);
    }

    public override int Read(byte[] buffer, int offset, int count)
    {
        return _responseFilter.Read(buffer, offset, count);
    }

    public override void Write(byte[] buffer, int offset, int count)
    {
        BytesWritten += count;
        _responseFilter.Write(buffer, offset, count);
    }

    public override bool CanRead
    {
        get { return _responseFilter.CanRead; }
    }

    public override bool CanSeek
    {
        get { return _responseFilter.CanSeek; }
    }

    public override bool CanWrite
    {
        get { return _responseFilter.CanWrite; }
    }

    public override long Length
    {
        get { return _responseFilter.Length; }
    }

    public override long Position
    {
        get { return _responseFilter.Position; }
        set { _responseFilter.Position = value; }
    }
}
7
ответ дан 7 December 2019 в 07:51
поделиться
Другие вопросы по тегам:

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