News Blog - For the year 2008
-
Wizard Release 0.8
The eighth release of BlogSvc includes a new setup wizard. Also, this release contains the following new or improved features:
- Setup wizard will test your installation on your web server
- Setup wizard will modify your service.config and users.config
- New green theme called "Settings" (see right)
- All entries are cleansed from html to xhtml
- Comments allow html only from a whitelist of tags
- Authorized comments can use any tags
- New support for wlwmanifest.xml
- Entries can now be split in live writer or with <!--more--> comment
- Collection page now only shows first part of post when split
- New ExtendedEntriesOn setting for each collection which alters wlwmanifest.xml
- Feeds now only show first part of post when ExtendedEntriesOn
- Updates to jQuery rater plugin based on community feedback
- Updated Search to use render partial
- Updated views and partials to use strongly typed models
- BaseController and BaseModel greatly increase view potential
- Updated all existing entries to Xhtml
- Remove emails from annotation feeds (to prevent spam)
Visit the release page on codeplex to download.
-
New Setup Wizard
The next release will make setting up BlogSvc.net very simple. You won't even need to manually edit the config files as they are done as part of the wizard.
Loading…Wizard Steps
The wizard currently has 3 steps:
Read More
-
Extended Entries Support
I added extended content support for people who like to only show part of the post on their feed and listing pages.
There is a new setting on each collection called "ExtendedEntriesOn" which will alter the wlwmanifest.xml depending on the setting. Please note that setting this value to false will not disallow the <!--more--> tag. However, a theme designer may alter the display/layout of the theme based on this setting.
The collection page and simple entry partial were modified to have a "Read More" link whenever there is extended content.
For feeds, if ExtendedEntriesOn=True then each entry in the feed will not show the extended content (it will only show the content before the split).
Live Writer has built in support for splitting entries as seen in the picture to the right.
-
Trackback Release 0.7
The seventh release of BlogSvc includes support for Trackbacks. Also, this release contains the following new or improved features:
- Updated to latest MVC Beta
- A new theme: Hibiscus (see right)
- Auto-ping links upon create/update entry
- Trackback client and server support
- Pingback client and server support
- Search support added to both backend and frontend
- Search relevance ordering based on term hit count
- Updates to use RenderPartial instead of controls
- New recent comments display
- Additional sort support through repository
- New separate credential storage in Users.config
- New date/time support via timezone configuration
- New time ago jQuery feature shows relative time to user
- New support for storing entries in database
- Updated paging for both atom and web
- Bug fix to date/time storage
- Comment feeds at collection, workspace, and entire app level now supported
- Retrieve entries at multiple different levels
-
New Theme Hibiscus
This theme has not yet been updated for Release 0.9.
Release 0.7 has a new theme called Hibiscus. You can see this theme applied to the latest release on our test server: http://atomsite.net. To save time, the theme is built on top of the default theme using an import.
@import url('../default/default.css');This theme consists of only a CSS stylesheet and eight new images. The rest of the theme is inherited from the default theme. The theme can be applied to either a single collection or a whole workspace by setting the theme property in the Service.config document.
<workspace svc:default="true" svc:theme="hibiscus">I created this theme for my wife Kristin. It is based on a clipart found at the open clip art library called Hibiscus Remixed. Kristin altered the colors and I created the CSS and other images.
-
Trackback and Pingback Support
Trackback and pingback support is the top new feature of the next release. The support is unique in that it utilizes an MVC controller to receive trackbacks and pingbacks. I've also implemented auto-ping support for sending trackback and pingbacks to all the links in the content of an entry upon publish or update.
I believe that the Atom Threading Extension was built upon the notion of a trackback. This is why we are using the existing annotation support in BlogSvc for annotating an entry when a trackback or pingback occurs. Therefore, a trackback is just another atom entry with it's content source pointing back to the target location.
BlogSvc is unique in that it tries to extract information from the target location when it is not provided. This sometimes occurs with trackbacks and it is always the case with pingbacks.
The trackback and pingback support was built to verify the target location refers back to the entry. To further reduce potential spam, it also supports plugging in a spam blocking service.
Please let us know if you have any questions about the new trackback and pingback support.
-
New Global Date and Time Support
With .Net 3.5 there is great new support for working with dates across time zones. Check out Dan Rigsby's blog for some great posts about the new classes.
Working with Dates and Times in .Net 3.5 Series:
Part 1: DateTime vs. DateTimeOffset in .Net
Part 2: TimeZone vs. TimeZoneInfo in .NetBlogSvc directly benefits from these enhancements in two ways:
- Configure all dates to show in preferred timezone
- Show time relative to the user (via jQuery)
Two new configuration settings allow you to control which timezone your website uses. The TimeZoneInfoId sets the timezone based on the timezones loaded on the server. The TimeZoneDisplay sets a shorthand value that can be shown next to the times on your site.
BlogSvc utilizes the <abbr> to allow a concise view of the date. By hovering over the date you can see an unambiguous view of the time. BlogSvc also uses the jQuery Time Ago plugin to show relative times that make sense to viewers.
-
Test Trackback
This post is for testing trackbacks.
-
MVC Release 0.6
The sixth release of BlogSvc includes the switch over to MVC preview 5. Along with this switch are the following new or improved features:
- Improvements to markup for clean CSS themes
- Fully dynamic theme support
- Fix: unapproved comments filtered
- New unapproved comment shows "need approval" message
- Password filtering from service doc
- Refactor away the global statics
- BlogSvc.net website is now separate project
- Simple personal blog included as default
- Fix: authentication for multiple authors/contributors
- Removed dependency on ManagedFusion URL rewriting
- New authors added upon entry update
- Side controls work across collection and entry pages
- AtomPubController is fully testable
- Better ajax support via jQuery and MVC
- Added subtitle extension to workspace
- Improved ratings control using jQuery plugin
- Simplified deployment structure
You can read about some of the benefits of switching to MVC in my previous post.
We will put together a roadmap for future releases of BlogSvc and we would really love to hear your feedback on this release what you'd like to see in future releases. Please leave a comment below and let us know what you think!
You can download this release from Codeplex.
-
Now on ASP.NET MVC Preview 5
I'm proud to announce the next release is built on MVC. The move to MVC has many benefits for BlogService:
- No more WCF issues
- Testable
- Simplified authentication
- VS.net development server support
- Better flexibility around themes
- Url rewriting no longer required
- Better ajax scenarios
- Cleaner deployment structure (see right)
- Less configuration required
This website is already running on MVC and it appears overall speed has increased both on the browser and through Windows Live Writer (even on the new beta).
If you like to discuss the change to MVC, please head on over to the discussion already in progress.
-
Theme Scenarios
The development team is discussing themes in BlogSvc. I'm really interested in pushing towards using stylesheets as the primary method of altering a theme. As demonstrated by the success of the CSS Zen Garden, designers are comfortable working with CSS. I also believe it is safe to say that as browser technology continues to mature, designers will gain additional flexibility through CSS improvements.
The end-user scenario is very important to me and I want to target the whole range of users. Lets start with a non-technical user like my lovely wife. After talking with her, the ideal workflow for her would be:
- Click a link on her blog that takes her to a website like http://www.freewpthemes.net/
- Click a link on her blog that takes her to a website like http://www.freewpthemes.net/
-
Multiple Blogs via Collections and Workspaces
One of the major goals of BlogSvc is to support multiple blogs within a single application instance.
BlogSvc defaults to single workspace mode. Release 0.5 only supports a single workspace installed to the root of the website. With this single workspace, you can have any number of collections. For example, a personal site might have collections for:
- Personal Blog
- Work Blog
- Media Uploads
- Articles or Pages
- Photo Blog
Each of these collections can have multiple authors and contributors. However, it is likely that all the collections will be controlled by the same author(s). BlogSvc utilizes workspaces as a way to segment collections within a single application instance. Future versions of BlogSvc will support multiple workspaces in two different ways:
- Sub-folders, ex: http://www.mysite.com/workspace/collection
- Sub-domains, ex: http://workspace.mysite.com/collection
Also, the next release will support installation to a virtual directory. Virtual directory installations should support sub-folder workspace installations.
-
Convert from BlogEngine.Net to BlogSvc
I've added some code to the Test project to convert my blog over from BlogEngine.net. I exported the data as a BlogML file and then ran it through the code. It created a service document and atom entries. It worked well but is currently specialized for my situation.
- Some items in the future that should be considered:
- BlogML exports from other blog engines
- Broken links to images
- Updating links within content of existing blog posts
- GUI to guide the user
By adding a rewrite rule I can permanently redirect the old post locations to the new location.
#relocate old BlogEngine.NET posts
RewriteRule /post/(.+)\.aspx$ /blog/$1.xhtml [R=301,L]Check out my site which is based on a new blue theme that will be included with the next release.
-
Setup Development Environment
Abouch over on the discussion forum has a great post about how to setup BlogSvc on a local IIS7 server. He explains the steps of adding a new binding for hosting the service along side other existing websites in IIS7. This is needed because BlogSvc does not currently support installation to a directory below the root. We do plan to support that scenario in the future.
Also, the test project references the web testing assembly that is only available with Test/Suite edition of Visual Studio. You can safely remove this project until I have removed the dependency.
-
Deployment Release 0.5
The fifth release of BlogSvc is the first release that is ready for deployment. It includes an installation guide and the following great new/improved features:
- Entry ratings
- Annotation approval (comment approval)
- Browse by date, month or year
- Browse by category
- Browse by person, author, or contributor
- Collection index (archive)
- Collection & Feed Paging
- Full suite of Domain tests
- Install guide plus other documentation http://atomsite.net/info/Overview.xhtml
- ASP.Net forms authentication support
- Forms redirect bypass for WSSE
- Javascript (jQuery) code consolidated
- New Controls
- Archive Listing
- Category Listing
- Category Cloud
- Recent Entries
- Object model improvements (XmlBase)
As you can see, this brings BlogSvc in the realm of a fully featured blog engine. The combination of AtomPub, the Asp.net website, and windows live writer allows full control over content.
For example, use Windows Live Writer to:
- Create new entries
- Upload images
- Update existing entries
- Delete entries
- Add new categories
- Publish drafts
Use the website to:
- Create new annotations (comments)
- Approve individual comments
- Approve all comments
- Delete a comment
Looking forward to the next release, we hope to include database support. Also, we may move towards using the MVC framework. If there are any "must-have" features you'd like to see in the next release, please let us know in the comments.
-
Release 0.4
I have posted the fourth release to CodePlex. This release contains new support for the Atom Threading Extensions. This means that BlogSvc supports threaded comments. The website was also updated with new annotation controls using special jQuery support. As part of this release we have created/updated the following documentation.
There is a known issue with this release where media uploads fail with a 404 not found. It has been fixed in latest source code.
Looking forward to the next release, we will focus on testing, documentation, and installation. There will be some great new features on the website such as:
- Rating entries (jQuery Stars)
- Approval system (comment moderation)
- New pages for browsing by category, date, or person (author or contributor).
-
BlogSvc Now Supports Comments
The WCF annotation support in BlogSvc has been updated with the standardized Atom Threading Extensions. The website has also been updated with a very unique method of creating new comments. Lets just say, classic forms + jquery + ajax + rest = awesome. Most of the new code is in the Annotate.ascx. And most of that code is javascript/jquery code.
Currently, BlogSvc only supports anonymous comments. I do plan to support OpenID. In the meantime, all commentators are required to supply an email and website. Commentators can use html in their comments. I am using some anti-xss code to sanitize the html.
Thanks to jquery there is some pretty validation going on. I must say, I really like jquery. However, there are some quarks when working with jquery and calling a service that returns xml with a custom content-type such as application/xml+atom. However, I found workarounds to get things working.
Finally, BlogSvc does support threading comments. However, the website does not yet support annotating an annotation. It should be very easy to add using jquery.
I've also added some technical information to the Documentation.
Feel free to leave a comment to test things out.
-
Refactor Session
I have rearranged the solution during a large refactor session. Any non-domain specific logic has been moved into a new services project. The provider pattern has been replaced with a repository. The repositories and services all have interfaces to support future extensibility. I've already leveraged the authenticate interface to support multiple authentication schemes.
-
From Urn to Tag URIs
I'm migrating the usage of the urn scheme for IDs to the tag scheme. Only registered types are allowed to use the urn scheme. The tag scheme actually fits in very close to how I was using the urn scheme so the migration should be pretty painless. I've posted a new entry about URIs and URLs in BlogSvc that give plenty of examples of how BlogService will ID and locate resources.
-
BlogSvc AtomPub Release 0.3
I've uploaded a new release to CodePlex. This is the first release containing solid AtomPub support. Also, the website has been improved. This release contains the following new/improved features:
- Object model usage improvements (such as ToString)
- FileAtomPubProvider configuration extensions including file and folder paths
- Administrator support added to AppService
- WSSE authentication that supports anonymous and token expiration
- Roles added based on AppService
- Saving of AppService and AppCategories documents
- Add category (fixed, unfixed) to internal or external categories
- ETag support for caching and improved Live Writer performance
- HEAD request supported on entry and media resources
- New website, with new controls
- Load RSS feed using Syndication support in .NET 3.5
This release has been tested on both IIS 6 and IIS 7 integrated. The next release may leave IIS 6 support behind in favor of IIS 7 integrated mode. This would improve the URI formats throughout the system. However, the ID's would remain unchanged as they were designed to support many URL schemes.
BlogSvc creates IDs that are made up of 3 to 4 parts:
urn:{workspace*}.{domain}:{collection},{entryPath}
The workspace is optional unless there are multiple workspaces on the same site. The domain typically matches the domain of where the site is being hosted. The collection signifies the collection in the workspace. The entry path is a comma separated listing of the entry location in an optional thread.
Examples Blog Collection urn:blogsvc.net:blog About Entry in Info Collection urn:blogsvc.net:info,About Blog Post on Multi-user Site urn:kristin.jvance.com:blog,2008-08-08-AnotherPost Comment to Blog Post urn:blogsvc.net:blog,2008-08-08-MyBlogPost,1 Response to a Comment urn:blogsvc.net:blog,2008-08-08-MyBlogPost,1,1 See the release page for more details.
-
New Website
BlogSvc just got a new website. There are plenty of tweaks that still need to be done. This site can be used as an example of using BlogSvc directly through the provider API. With the strongly typed Atom and AtomPub objects, it is very simple to program against. And if you prefer to work directly with the Xml then that is also available. Also, live writer support is fully functional with WSSE authentication.
-
Ape Results 8/7
APP Service doc: http://atomsite.net/blog.svc/service
Summary: 0 errors, 6 warnings.
-
TESTING: Service
document and collections.
-
✓ Retrieval of Service Document: it exists and is served properly.
-
Found these
collections:
-
'FrontPage Blog' accepts application/atom+xml;type=entry
-
'Image Store' accepts image/png, image/jpeg, image/gif
-
-
Will use collection
'FrontPage Blog' for entry creation.
-
✓ Page 1 of Entry collection: it exists and is served properly.
-
✓ Entry collection has correct app:edited value order.
-
TESTING: Entry-posting
basics.
-
Now in the Entries
feed:
-
Test Multi-pic Post
-
BlogSvc Preview Release 0.2
-
-
✓ Posting of new entry to the Entries collection reported success, Location: http://atomsite.net/blog.svc/www/blog/2008-08-07-Ape-64739
-
Examining the new entry
as returned in the POST response
-
✓ Returned entry is consistent with posted entry.
-
✓ Provided categories included in Returned entry.
-
✓ Server preserved foreign markup in Returned entry.
-
✓ Retrieval of newly created entry: it exists and is served properly.
-
Examining the new entry
as retrieved using Location header in POST response:
-
? Client-provided slug 'ape-64739' not used in server-generated URI.
-
✓ Retrieved entry is consistent with posted entry.
-
✓ Provided categories included in Retrieved entry.
-
✓ Server preserved foreign markup in Retrieved entry.
-
Examining the new entry
as it appears in the collection feed:
-
✓ Entry from collection feed is consistent with posted entry.
-
✓ Provided categories included in Entry from collection feed.
-
✓ Server preserved foreign markup in Entry from collection feed.
-
✓ Update of new entry reported success.
-
✓ Title of new entry successfully updated.
-
✓ Entry deletion reported success.
-
✓ Entry not found in feed after deletion.
-
TESTING: Collection
re-ordering after PUT.
-
✓ Page 1 of Entries with multi-post: it exists and is served properly.
-
✓ Entries with multi-post has correct app:edited value order.
-
✓ Entries correctly ordered after multi-post.
-
✓ Page 1 of Entries post-update: it exists and is served properly.
-
✓ Entries post-update has correct app:edited value order.
-
✓ Entry deletion reported success.
-
✓ Entry deletion reported success.
-
✓ Entry deletion reported success.
-
✓ Entries correctly ordered after update of multi-post.
-
TESTING: Content
sanitization
-
✓ Retrieval of unclean XHTML entry: it exists and is served properly.
-
? Published entry retains xhtml:script element.
-
? Published entry retains 'background' attribute.
-
? Published entry retains 'style' attribute.
-
? Published entry retains dangerous hyperlink: 'javascript:evil'.
-
✓ Entry deletion reported success.
-
Will use collection
'Image Store' for media creation.
-
TESTING: Posting to
media collection.
-
✓ Post of image file reported success, media link location: http://atomsite.net/blog.svc/www/media/2008-08-07-Apix-70783
-
✓ Retrieval of media link entry: it exists and is served properly.
-
? Client-provided slug 'apix-70783' not used in Media Resource URI.
-
✓ Retrieval of media resource: it exists and is served properly.
-
✓ Media resource was apparently stored and retrieved properly.
-
✓ Entry deletion reported success.
-
✓ Media link entry no longer in feed.
-
✓ Media resource no longer fetchable.
-
TESTING: Media
collection re-ordering after PUT.
-
✓ Page 1 of Pictures from multi-post: it exists and is served properly.
-
✓ Pictures from multi-post has correct app:edited value order.
-
✓ Fetch image to get ETag: it exists and is served properly.
-
✓ Update one of newly posted pictures went OK.
-
✓ Page 1 of MLEs post-update: it exists and is served properly.
-
✓ MLEs post-update has correct app:edited value order.
-
✓ Entry deletion reported success.
-
✓ Entry deletion reported success.
-
✓ Entry deletion reported success.
-
✓ Entries correctly ordered after update of multi-post.
-
-
Test Multi-pic Post
Test update
-
BlogSvc Preview Release 0.2
I've put a new release up on codeplex. This release includes an implementation of Atom Publishing Protocol on WCF 3.5. In the words of Tim Bray:
An Atompub implementation lets you create, retrieve, update, and delete (CRUD) Web Resources. ... Atompub starts with a Service Document, which contains one or more named Workspaces, which contain Collections, which are what you actually POST to in order to start up the CRUD process. So the idea is simple; have a collection that when you POST to it, creates a new publication.
The object model is based off of the Atom Syndication Format and the AtomPub specs. All of the objects are based off of Xml or the new XElement. This means that each object has an Xml property that points to the underlying xml. The object's propeties have getters and setters which access the xml as strongly typed values.
Atom Syndication Format Atom Publishing Protocol AtomCategory AppCategories AtomContent AppCollection AtomEntry* AppControl AtomFeed AppService AtomGenerator AppWorkspace AtomLink* AtomPerson Atom Threading Extension AtomSource ThreadInReplyTo AtomText * Extended The objects listed above all support extensions and furthermore, it is very easy to add strongly typed access to those extensions. Note: .NET 3.5 already contains objects that are close to the Atom objects above and .NET 3.5 SP1 will have objects for AtomPub. See System.ServiceModel.Syndication namepace. In a future blog post, I will explain why I decided to go with the above object model over what is provided in the framework.
This release should work in IIS6 or IIS7 with .NET 3.5. Also the SVC handler must support all verbs. Since AtomPub is RESTful, you'll need PUT and DELETE to go along with the usual GET and POST verbs.
The WCF service is built using the new Web Programming Model available in 3.5. However, it is designed to support normal web services as well (more on this in a future post). A neat WCF feature with this release is the support of media entries allowing a user to post images to a collection. I found the trick to supporting raw data on Carlos' blog. However, there is a catch. Anytime you want to accept unknown content types and known content types, you must only deal with Stream objects. For example, although CreateEntry will always return an AtomEntry document you must specify a Stream because the input could be an AtomEntry or say a JPG image.
[ServiceContract] public interface IAtomPub { [WebGet(BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "{workspaceName}/{collectionName}/{entryName}/media")] Stream RetrieveMedia(string workspaceName, string collectionName, string entryName); [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "{workspaceName}/{collectionName}")] Stream CreateEntry(string workspaceName, string collectionName, Stream stream); [WebGet(UriTemplate = "{workspaceName}/{collectionName}/{entryName}")] Stream RetrieveEntry(string workspaceName, string collectionName, string entryName); [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "{workspaceName}/{collectionName}/{entryName}", Method = "PUT")] Stream UpdateEntry(string workspaceName, string collectionName, string entryName, Stream stream); [WebInvoke(UriTemplate = "{workspaceName}/{collectionName}/{entryName}", Method = "DELETE")] void DeleteEntry(string workspaceName, string collectionName, string entryName); [WebGet(UriTemplate = "service")] AppService RetrieveService(); [WebGet(UriTemplate = "{workspaceName}/{collectionName}/category?scheme={scheme}")] AppCategories RetrieveCategories(string workspaceName, string collectionName, string scheme); [WebGet(UriTemplate = "{workspaceName}/{collectionName}")] AtomFeed RetrieveFeed(string workspaceName, string collectionName); }You can direct it to a strongly typed implementation by checking the content type.
public Stream CreateEntry(string workspaceName, string collectionName, Stream stream) { string contentType = WebOperationContext.Current.IncomingRequest.ContentType; AtomEntry entry; if (contentType == Atom.ContentType || contentType == Atom.ContentTypeEntry) { entry = new AtomEntry(); XmlReader reader = new XmlTextReader(stream); entry.Xml = XElement.Load(reader); entry = CreateEntry(workspaceName, collectionName, entry); } else entry = CreateMedia(workspaceName, collectionName, stream); return GetStream(entry); }Please see the release page for more details.
In the next post, I will discuss workspace, collection, entry names, id's, links, etc.