Reputation: 524
I'm trying to display the movie dates for movies than are going to screen today. I have been reading different threads the whole day, buy I can´t get the webRequest to work.
Basically I had working code with webClient, but I wanted the UI to be responsive so I decided to use httpWebRequest to keep the xml parsing off the UI thread.
public partial class MainPage : PhoneApplicationPage {
public MainPage() {
InitializeComponent();
}
private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) {
DoHttpWebRequest();
}
private void DoHttpWebRequest() {
string url = "http://www.cinamon.ee/rss/schedule/1001.xml";
var request = HttpWebRequest.Create(url);
var result = (IAsyncResult)request.BeginGetResponse(ResponseCallback, request);
}
private void ResponseCallback(IAsyncResult result) {
var request = (HttpWebRequest)result.AsyncState;
var response = request.EndGetResponse(result);
using (var stream = response.GetResponseStream()) {
XDocument scheduleXml = XDocument.Load(stream);
var todayMovies = from query in scheduleXml.Descendants("schedule").Descendants("shows").Descendants("show")
where DateTime.Parse(query.Element("showDateTime").Value).Date.Equals(DateTime.Now.Date) &&
DateTime.Parse(query.Element("showDateTime").Value).TimeOfDay.CompareTo(DateTime.Now.TimeOfDay) > 0
select new Movie() {
MoviePicture = new BitmapImage(new Uri((string)query.Element("images").Element("imageType2").Value, UriKind.RelativeOrAbsolute)),
MovieName = (string)query.Element("title"),
MovieId = (string)query.Element("movieId"),
MovieSoonest = DateTime.Parse(query.Element("showDateTime").Value).ToString("H:mm")
};
// Removing duplicate movies from list.
List<Movie> todayList = todayMovies.ToList();
IEnumerable<Movie> noDuplicates3 = todayList.Distinct(new MovieComparer());
// Adding to the UI
Dispatcher.BeginInvoke(() => {
todayBox.ItemsSource = noDuplicates.ToList();
});
}
}
}
Does anyone have an idea as to what is wrong by looking at this code?
Thank you in advance EDIT. This is the link I based my solution on - http://social.msdn.microsoft.com/Forums/en-US/windowsphone7series/thread/594e1422-3b69-4cd2-a09b-fb500d5eb1d8
EDIT2. My Mainpage.xaml
<StackPanel x:Name="TodayPanel" Grid.Row="1" Margin="10,5,10,10" Orientation="Horizontal" Height="580" Background="#90000000" >
<ListBox x:Name="todayBox">
<ListBox.ItemTemplate>
<DataTemplate>
<HyperlinkButton x:Name="hyperLinkButton" Style="{StaticResource HyperlinkButtonStyle1}" CommandParameter="{Binding MovieId}" Tap="hyperLinkButton_Tap">
<HyperlinkButton.Content>
<StackPanel Margin="10" Grid.Row="1" Orientation="Horizontal">
<Image Source="{Binding MoviePicture}" />
<StackPanel Margin="10" Grid.Row="1" Orientation="Vertical">
<TextBlock TextWrapping="Wrap" Margin="10, 5, 10, 5" Width="200" FontFamily="Trebuchet MS" Foreground="Orange" VerticalAlignment="Top">
<Run Text="{Binding MovieName}"/>
<LineBreak></LineBreak>
</TextBlock>
<TextBlock TextWrapping="Wrap" Width="200" FontFamily="Trebuchet MS" Foreground="White" VerticalAlignment="Bottom">
<Run Text="Järgmine seanss: "/>
<LineBreak></LineBreak>
<Run Text="{Binding MovieSoonest}"/>
</TextBlock>
</StackPanel>
</StackPanel>
</HyperlinkButton.Content>
</HyperlinkButton>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
And my edited code behind.
private void DoHttpWebRequest() {
string url = "http://www.cinamon.ee/rss/schedule/1001.xml";
var request = HttpWebRequest.Create(url);
var result = (IAsyncResult)request.BeginGetResponse(ResponseCallback, request);
}
private void ResponseCallback(IAsyncResult result) {
var request = (HttpWebRequest)result.AsyncState;
var response = request.EndGetResponse(result);
// Adding to the UI
Dispatcher.BeginInvoke(() => {
IEnumerable<Movie> todayMovies;
using (var stream = response.GetResponseStream()) {
XDocument scheduleXml = XDocument.Load(stream);
todayMovies = from query in scheduleXml.Descendants("schedule").Descendants("shows").Descendants("show")
where DateTime.Parse(query.Element("showDateTime").Value).Date.Equals(DateTime.Now.Date) &&
DateTime.Parse(query.Element("showDateTime").Value).TimeOfDay.CompareTo(DateTime.Now.TimeOfDay) > 0
select new Movie() {
MoviePicture = new BitmapImage(new Uri((string)query.Element("images").Element("imageType2").Value, UriKind.RelativeOrAbsolute)),
MovieName = (string)query.Element("title"),
MovieId = (string)query.Element("movieId"),
MovieSoonest = DateTime.Parse(query.Element("showDateTime").Value).ToString("H:mm")
};
}
var todayList = todayMovies.ToList();
//IEnumerable<Movie> noDuplicates = movieList.Distinct(new MovieComparer());
todayBox.ItemsSource = todayList.ToList();
});
Upvotes: 0
Views: 598
Reputation: 632
I tried out your code and getting UnauthorizedAccessException. By changing Dispactcher.Begininvoke delegate's scope it works as follow:
private void ResponseCallback(IAsyncResult result){
var request = (HttpWebRequest) result.AsyncState;
var response = request.EndGetResponse(result);
// Adding to the UI
Dispatcher.BeginInvoke(() =>
{
IEnumerable<Movie> todayMovies;
using (var stream = response.GetResponseStream())
{
XDocument scheduleXml = XDocument.Load(stream);
todayMovies =
from query in scheduleXml.Descendants("schedule").Descendants("shows").Descendants("show")
where DateTime.Parse(query.Element("showDateTime").Value).Date.Equals(DateTime.Now.Date) &&
DateTime.Parse(query.Element("showDateTime").Value).TimeOfDay.CompareTo(DateTime.Now.TimeOfDay) >
0
select new Movie()
{
MoviePicture =
new BitmapImage(
new Uri((string) query.Element("images").Element("imageType2").Value,
UriKind.RelativeOrAbsolute)),
MovieName = (string) query.Element("title"),
MovieId = (string) query.Element("movieId"),
MovieSoonest = DateTime.Parse(query.Element("showDateTime").Value).ToString("H:mm")
};
}
// Removing duplicate movies from list.
var todayList = todayMovies.ToList();
//IEnumerable<Movie> noDuplicates3 = todayList.Distinct(new MovieComparer());
todayBox.ItemsSource = todayList.ToList();
});
}
However you may use RestSharp library (you may find it in Nuget) in order to make it easier. Check following code:
public void RestSample(){
var client = new RestClient
{
BaseUrl = "http://www.cinamon.ee/"
};
var request = new RestRequest
{
Resource = "rss/schedule/1001.xml"
};
client.ExecuteAsync(request, (a) =>
{
if (a.StatusCode == HttpStatusCode.OK)
{
var scheduleXml = XDocument.Parse(a.Content);
var todayMovies = from query in scheduleXml.Descendants("schedule").Descendants("shows").Descendants("show")
where DateTime.Parse(query.Element("showDateTime").Value).Date.Equals(DateTime.Now.Date) &&
DateTime.Parse(query.Element("showDateTime").Value).TimeOfDay.CompareTo(DateTime.Now.TimeOfDay) > 0
select new Movie()
{
MoviePicture = new BitmapImage(new Uri((string)query.Element("images").Element("imageType2").Value, UriKind.RelativeOrAbsolute)),
MovieName = (string)query.Element("title"),
MovieId = (string)query.Element("movieId"),
MovieSoonest = DateTime.Parse(query.Element("showDateTime").Value).ToString("H:mm")
};
// Removing duplicate movies from list.
List<Movie> todayList = todayMovies.ToList();
//IEnumerable<Movie> noDuplicates = todayList.Distinct(new MovieComparer());
// Adding to the UI
Dispatcher.BeginInvoke(() =>
{
todayBox.ItemsSource = todayList.ToList();
});
}
else
{
//error
}
});
}
Try it out and let us know...
EDITED: xaml.cs datatemplate:
<StackPanel x:Name="TodayPanel" Grid.Row="1" Margin="10,5,0,10" Orientation="Horizontal" Height="580" Background="#90000000" >
<ListBox x:Name="todayBox" Width="468">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Margin="10" Orientation="Horizontal">
<Image Source="{Binding MoviePicture, FallbackValue=http://www.cinamon.ee/visinternetticketing/images/movies/NowShowingComingSoon/HungerGames.jpg}" />
<StackPanel Margin="10" Grid.Row="1" Orientation="Vertical">
<TextBlock TextWrapping="Wrap" Margin="10, 5, 10, 5" FontFamily="Trebuchet MS" Foreground="Orange" VerticalAlignment="Top" Text="{Binding MovieName}"/>
<TextBlock TextWrapping="Wrap" FontFamily="Trebuchet MS" Foreground="White" VerticalAlignment="Bottom" Text="{Binding MovieSoonest}"/>
</StackPanel>
<HyperlinkButton x:Name="hyperLinkButton" CommandParameter="{Binding MovieId}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
RECALL Change MovePicture Property from BitmapImage to string.
Upvotes: 1