Быстрый способ посмотреть на URL в запросы WebRequest/метода webresponse в HTML


Что я пытаюсь здесь сделать, это получить RSS-канал и добавить приложения XML-узел для каждого элемента, который имеет ссылку на видео (wmv) файл.

Попробуйте ниже код

url = "http://www.microsoft.com/events/series/digitalblackbelt.aspx?tab=rss"

например, чтобы получить точку

Производительность нажмите здесь состоит из двух частей: длинной "по каждому элементу" петля, наряду с огромным количеством просьб сделать для получения ссылки мультимедиа (отмеченные в коде комментарий "Эта часть требует внимания"). Любые советы о том, как сделать СМИ ссылке гораздо быстрее образом будет действительно оценили!

Вы можете получить представление о том, что этот код делать, сравнивая этот канал (URL-адрес):

http://www.microsoft.com/events/series/digitalblackbelt.aspx?tab=rss

на этот канал (создается код ниже), обратите внимание, что он будет медленным и может дать ошибку, если она просто обновить страницу:

http://mshady.apphb.com/feeds/index?url=http://www.microsoft.com/events/series/digitalblackbelt.aspx?tab=rss

public class FeedsController : Controller
{
    private XmlDocument _Xml;

    [OutputCache(VaryByParam = "url", Duration=86400)]    
    public string Index(string url)
    {
        string feed = "";

        _Xml = new XmlDocument();
        _Xml.Load(url);

        foreach (XmlNode node in _Xml.ChildNodes[0].ChildNodes[0].ChildNodes)
        {
            if (node.Name == "item")
            {
                XmlNode childnode = GetEnclosureXmlNode(node);
                node.AppendChild(childnode);
            }
        }

        feed =  _Xml.OuterXml;

        return feed;
    }

    private string GetMediaUrl(string articleUrl)
    {
        string mediaUrl = "";

        ////////////////////////////////////////////    
        // This part needs attention
        ////////////////////////////////////////////    
        Regex regex = new Regex(@"<a href=""(.*?)"">WMV Download</a>");
        var request = HttpWebRequest.Create(articleUrl);
        var response = request.GetResponse();
        string responseHtml = new StreamReader(response.GetResponseStream()).ReadToEnd();
        var match = regex.Match(responseHtml);
        ////////////////////////////////////////////    
        // This part needs attention
        ////////////////////////////////////////////    


        if (match.Success)
            mediaUrl = match.Groups[1].Value;

        return mediaUrl;
    }

    private XmlNode GetEnclosureXmlNode(XmlNode node)
    {
        string articleUrl = node["link"].InnerText;
        string mediaUrl = GetMediaUrl(articleUrl);

        XmlElement childnode = CreateEnclosureXmlNode(mediaUrl);
        return childnode;
    }

    private XmlElement CreateEnclosureXmlNode(string mediaUrl)
    {
        XmlElement childnode = _Xml.CreateElement("enclosure");
        childnode.SetAttribute("url", mediaUrl);
        childnode.SetAttribute("type", "video/wmv");
        return childnode;
    }
}


1667
1
задан 8 июля 2011 в 08:07 Источник Поделиться
Комментарии
2 ответа

Я уверен, что регулярное выражение.Матч-это проблема, как Джефф Этвуд описывает здесь: http://www.codinghorror.com/blog/2006/01/regex-performance.html

Одна вещь, которую я хотел сделать, это переместить определение regex в статическую переменную вне функции, как указано ниже:

    static Regex regex = new Regex(@"<a href=""(.*?)"">WMV Download</a>", RegexOptions.Compiled);

Это единственная реальная вещь, которая прыгает на меня. Попробуйте взглянуть на этот блог для большего количества идей и информации: http://blogs.msdn.com/b/bclteam/archive/2010/06/25/optimizing-regular-expression-performance-part-i-working-with-the-regex-class-and-regex-objects.aspx

Должны дать вам что-то попробовать, пока ребята с большим опытом взгляд своих глаз на него :)

2
ответ дан 9 июля 2011 в 08:07 Источник Поделиться

Я не уверен, что там слишком большая производительность на цикл foreach, но можно изолировать все элементы с XPath, например:

var itemNodes = _Xml.SelectNodes(@"//channel/item");
foreach (XmlNode node in itemNodes)
{
XmlNode childnode = GetEnclosureXmlNode(node);
node.AppendChild(childnode);
}

Проблему я вижу, это время, чтобы пойти и вернуть страницу не зная, если это будет даже СМИ ссылке, которую вы ищете. Если нет другого способа, чем сделать каждый URL-адрес RSS, вернуть, а потом искать медиа файл URL, а затем добавить некоторые формы многопоточность для этого и обрабатывать несколько одновременно следует сократить общую длину. Найти баланс, сколько за один раз то узкое место.

1
ответ дан 12 августа 2011 в 09:08 Источник Поделиться