parallel multiple rss feeds
This commit is contained in:
@@ -17,6 +17,7 @@ namespace jezebel.Controllers
|
|||||||
{
|
{
|
||||||
IMemoryCache cache;
|
IMemoryCache cache;
|
||||||
const string jezCache = "jezebelRss";
|
const string jezCache = "jezebelRss";
|
||||||
|
HashSet<string> urls = new HashSet<string>() { "http://jezebel.com/rss", "http://pictorial.jezebel.com/rss", "http://themuse.jezebel.com/rss", "http://thatswhatshesaid.jezebel.com/rss", "http://theslot.jezebel.com/rss" };
|
||||||
|
|
||||||
public ValuesController(IMemoryCache cache)
|
public ValuesController(IMemoryCache cache)
|
||||||
{
|
{
|
||||||
@@ -28,12 +29,20 @@ namespace jezebel.Controllers
|
|||||||
{
|
{
|
||||||
using (var httpClient = new HttpClient())
|
using (var httpClient = new HttpClient())
|
||||||
{
|
{
|
||||||
var result = cache.Get<Rss>(jezCache);
|
|
||||||
|
var result = cache.Get<List<Item>>(jezCache);
|
||||||
if(result == null || bypassCache)
|
if(result == null || bypassCache)
|
||||||
{
|
{
|
||||||
var rssRaw = await httpClient.GetStreamAsync("http://jezebel.com/rss");
|
var lst = new System.Collections.Concurrent.ConcurrentBag<Item>();
|
||||||
|
Parallel.ForEach(urls, url =>
|
||||||
|
{
|
||||||
|
var rssRaw = httpClient.GetStreamAsync(url).Result;
|
||||||
var xmlReader = new XmlSerializer(typeof(Rss));
|
var xmlReader = new XmlSerializer(typeof(Rss));
|
||||||
result = (Rss)xmlReader.Deserialize(rssRaw);
|
var rssDeserialized = (Rss)xmlReader.Deserialize(rssRaw);
|
||||||
|
rssDeserialized.Channel.Items.ForEach(a => lst.Add(a));
|
||||||
|
});
|
||||||
|
|
||||||
|
result = lst.Where(a => !a.Category.Any(b => b.Text.Contains("deals"))).Distinct(new Item()).ToList();
|
||||||
using (var entry = cache.CreateEntry(jezCache))
|
using (var entry = cache.CreateEntry(jezCache))
|
||||||
{
|
{
|
||||||
entry.SetValue(result);
|
entry.SetValue(result);
|
||||||
@@ -43,8 +52,8 @@ namespace jezebel.Controllers
|
|||||||
}
|
}
|
||||||
|
|
||||||
var rng = new Random();
|
var rng = new Random();
|
||||||
var randomArticleNumber = rng.Next(0, result.Channel.Items.Count);
|
var randomArticleNumber = rng.Next(0, result.Count);
|
||||||
var randomArticle = result.Channel.Items[randomArticleNumber];
|
var randomArticle = result[randomArticleNumber];
|
||||||
var resultString = $"{randomArticle.Title} by {randomArticle.Creator} {randomArticle.Link}";
|
var resultString = $"{randomArticle.Title} by {randomArticle.Creator} {randomArticle.Link}";
|
||||||
return new ContentResult() { Content = resultString, ContentType = "text", StatusCode = 200 };
|
return new ContentResult() { Content = resultString, ContentType = "text", StatusCode = 200 };
|
||||||
|
|
||||||
|
|||||||
12
Rss.cs
12
Rss.cs
@@ -34,7 +34,7 @@ namespace jezebel
|
|||||||
}
|
}
|
||||||
|
|
||||||
[XmlRoot(ElementName = "item")]
|
[XmlRoot(ElementName = "item")]
|
||||||
public class Item
|
public class Item : IEqualityComparer<Item>
|
||||||
{
|
{
|
||||||
[XmlElement(ElementName = "title")]
|
[XmlElement(ElementName = "title")]
|
||||||
public string Title { get; set; }
|
public string Title { get; set; }
|
||||||
@@ -50,6 +50,16 @@ namespace jezebel
|
|||||||
public Guid Guid { get; set; }
|
public Guid Guid { get; set; }
|
||||||
[XmlElement(ElementName = "creator", Namespace = "http://purl.org/dc/elements/1.1/")]
|
[XmlElement(ElementName = "creator", Namespace = "http://purl.org/dc/elements/1.1/")]
|
||||||
public string Creator { get; set; }
|
public string Creator { get; set; }
|
||||||
|
|
||||||
|
public bool Equals(Item x, Item y)
|
||||||
|
{
|
||||||
|
return x.Title.Equals(y.Title);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int GetHashCode(Item obj)
|
||||||
|
{
|
||||||
|
return obj.Title.GetHashCode();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[XmlRoot(ElementName = "channel")]
|
[XmlRoot(ElementName = "channel")]
|
||||||
|
|||||||
Reference in New Issue
Block a user