Web 2.0 og .Net 3.5 - Del 2:4
Som nævnt tidligere lavede jeg 4 demoer til fire emner på dagens Techtalk. Andet emne var introduktion til syndikeringsmulighederne i Windows Communication Foundation.
Demo: RSS og Atom med WCF
Kort fortalt kommer WCF med en projekt template til frembringelsen af feeds. Default templaten for et sådan projekt kan give en kørende service med syndikeringsendpoints.
Det er WCF's ABC model som stadig følges og med default template kode vil man få et simpelt kørende feed på et endpoint.
- Først laves kontrakten...
- ...og denne implementeres
Jeg tester mine feed endpoints fra en browser eller jeg kan skrive en simpel html klient som dels indeholder links til de enkelte feeds og dels udtager titel og indhold af de enkelte posts og skriver dem i html'en.
- html klient
- codebehind til klienten
Det giver så mulighed for at prøve det i en browser og få følgende:

Voila feeds og content!
Kommentarer (4)
[code=csharp]
using System;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Syndication;
using System.ServiceModel.Web;
namespace SyndicationService
{
[ServiceContract]
[ServiceKnownType(typeof(Atom10FeedFormatter))]
[ServiceKnownType(typeof(Rss20FeedFormatter))]
public interface IFeed1
{
[OperationContract]
[WebGet(UriTemplate = "*", BodyStyle = WebMessageBodyStyle.Bare)]
SyndicationFeedFormatter CreateFeed();
}
}
[/code]
[code=csharp]
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Syndication;
using System.ServiceModel.Web;
namespace SyndicationService
{
public class Feed1 : IFeed1
{
public SyndicationFeedFormatter CreateFeed()
{
SyndicationFeed feed = new SyndicationFeed("Alt omWebservices!", "Feed fra Renés blog - alt godt om webservices!", null);
List items = new List();
string s = "You can easily change.....";
SyndicationItem item1 = new SyndicationItem("Webservices er Fedt!", s, null);
SyndicationItem item2 = new SyndicationItem("Den fede webservicelever stadigt!", s, null);
items.Add(item1);
items.Add(item2);
feed.Items = items;
// rss ->http://localhost:8731/Design_Time_Addresses/SyndicationService/Feed1/
// atom ->http://localhost:8731/Design_Time_Addresses/SyndicationService/Feed1/?format=atom
string query = WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters["format"];
SyndicationFeedFormatter formatter = null;
if (query == "atom")
{
formatter = new Atom10FeedFormatter(feed);
}
else
{
formatter = new Rss20FeedFormatter(feed);
}
return formatter;
}
}
}
[/code]
[code=html]
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Mash_up._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Test af RSS og Atom feed</title>
</head>
<body>
<form id="form1" runat="server">
<% Response.Write(getFeedEntries("http://localhost:8731/Design_Time_Addresses/SyndicationService/Feed1")); %>
<p />
<div>
<a href="http://localhost:8731/Design_Time_Addresses/SyndicationService/Feed1/">
<img alt="RSS feed" src="feedlogo.gif"/> RSS
</a>
</div>
<div>
<a href="http://localhost:8731/Design_Time_Addresses/SyndicationService/Feed1/?fo...
<img alt="Atom feed" src="feedlogo.gif"/> Atom
</a>
</div>
</form>
</body>
</html>
[/code]
[code=csharp]
public string getFeedEntries(string uri)
{
XDocument doc = XDocument.Load(uri);
var entries = from entry in doc.Descendants("item")
select new
{
title = entry.Element("title").Value,
description = entry.Element("description").Value
};
string s = "";
foreach (var e in entries)
{
s += "
" + e.title + "
" + e.description + "";
}
return s;
}
[/code]
