Windows Live Writer как редактор для своего блога
Полезности | создано: 18.04.2011 | опубликовано: 18.04.2011 | обновлено: 13.01.2024 | просмотров: 4952
Уже давно ведутся споры о том, где и как, можно и нужно управлять записями блога. Речь идет о HTML-редакторах на стороне сайта (блога) и о сторонних редакторах, например, Windows Live Writer (далее WLW). Вдаваться в подробности я не буду, только скажу в своем блоге я теперь могу использовать два выше указанных способа. А вот как реализовать второй я расскажу в этой статье, собрав воедино всё необходимое для реализации.
Вступление как хотелка
Как-то совершенно случайно попалась на глаза статья, которая навела на мысль о том, что не плохо было бы реализовать такую же возможность и в своем блоге. Первоочередная порция данных получена, а значить ничто не мешает начать. Для начал определимся с хотелками: сервис, с которым должен работать редактор WLW, должен быть WCF; сервис должен реализовывать интерфейс от MetaWeblog API.
Приступим
Для начала я скачал библиотеку. Скачал, откомпилировал, настроил endpoint – Ура! Сервис заработал. Далее приступил к реализации интерфейсов. Я по примеру Дениса, так же сделал классы а не структуры. Вот пример одно из них:
public class MetaUserInfo { [DataMember(Name = "userid")] public string UserID { get; set; } [DataMember(Name = "firstname")] public string FirstName { get; set; } [DataMember(Name = "lastname")] public string LastName { get; set; } [DataMember(Name = "url")] public string Url { get; set; } [DataMember(Name = "email")] public string Email { get; set; } [DataMember(Name = "nickname")] public string Nickname { get; set; } }
А вот и самый главный класс, ради которого всё и задумывалось:
[DataContract] public class MetaPost { [DataMember(Name = "postid")] public string ID { get; set; } [DataMember(Name = "title")] public string Title { get; set; } [DataMember(Name = "dateCreated")] public DateTime DateCreated { get; set; } [DataMember(Name = "date_created_gmt")] public DateTime DateCreatedGmt { get; set; } [DataMember(Name = "description")] public string Description { get; set; } [DataMember(Name = "categories")] public string[] Categories { get; set; } [DataMember(Name = "publish")] public bool IsPublish { get; set; } [DataMember(Name = "permalink")] public string Permalink { get; set; } [DataMember(Name = "userid")] public string UserId { get; set; } [DataMember(Name = "wp_slug")] public string WordPressSlug { get; set; } [DataMember(Name = "mt_keywords")] public string Tags { get; set; } [DataMember(Name = "mt_allow_comments")] public int IsCommentEnabled { get; set; } [DataMember(Name = "wp_author")] public string Author { get; set; } }
А вот, собственно говоря, и сам интерфейс для WCF-сервиса:
[ServiceContract] public interface IMetaWeblog { [OperationContract(Name = "wp.newCategory")] string NewCategory(string blog_id, string username, string password, NewCategoryInfo newCategory); [OperationContract(Name = "wp.getAuthors")] AuthorInfo[] GetAuthors(string blog_id, string username, string password); [OperationContract(Name = "metaWeblog.newPost")] string NewPost(string blogid, string username, string password, MetaPost post, bool publish); [OperationContract(Name = "metaWeblog.editPost")] bool EditPost(string postid, string username, string password, MetaPost post, bool publish); [OperationContract(Name = "metaWeblog.getPost")] MetaPost GetPost(string postid, string username, string password); [OperationContract(Name = "metaWeblog.getCategories")] MetaCategory[] GetCategories(string blogid, string username, string password); [OperationContract(Name = "wp.getCategories")] MetaCategory[] GetCategoriesWordPress(string blogid, string username, string password); [OperationContract(Name = "metaWeblog.getRecentPosts")] MetaPost[] GetRecentPosts(string blogid, string username, string password, int numberOfPosts); [OperationContract(Name = "blogger.deletePost")] bool DeletePost(string appkey, string postid, string username, string password, bool publish); [OperationContract(Name = "blogger.getUsersBlogs")] MetaBlog[] GetUserBlogs(string appkey, string username, string password); [OperationContract(Name = "blogger.getUserInfo")] MetaUserInfo[] GetUserInfo(string appkey, string username, string password); [OperationContract(Name = "metaWeblog.newMediaObject")] MediaObjectInfo NewMediaObject(string blogid, string username, string password, MediaObject mediaObject); }
Как не трудно заметить, маппинг названий переопределен, чтобы реализовать интерфейс. А вот названия свойствам даны в соответствии с моим представлением об именовании. Тут хотелось бы несколько слов упомянуть о префиксах в маппинге. Во всей реализации используется несколько интерфейсов. Вот как раз эти префиксы и соответствуют конкретному интерфейсу. Класс-реализацию интерфейса приводить не буду, дабы каждый сможет это сделать самостоятельно.
Настройка Windows Live Writer
Предположим, что сайт успешно обновлен (добавлен новый сервис, изменения в web.config применены) и теперь настало время запустить WLW и настроить его таким образом, чтобы можно был приступить к работе.
Весь процесс показывать не смысла, но некоторые нюансы поясню. Вот окно в котором вы вводите адрес блога:
Как вы понимаете этот адрес ведет на Default.aspx в папке Blog моего сайта. Так вот, чтобы WLW обнаружил ваш блог в мета данных этой страницы должны быть определены следующие мета теги:
<link rel="EditURI" type="application/rsd+xml" href="http://www.calabonga.com/blog/rsd.xml"/> <link rel="wlwmanifest" type="application/wlwmanifest+xml" href="http://www.calabonga.com/blog/wlwmanifest.xml" />
Каждая из этих строк указывает местоположение файлов rsd и wlwmanifest. Посмотрев на содержание и описание указанных форматов, я думаю не составит особого труда создать такие файлы для своего сайта и положить их в соответствии с ссылками указанных в мета-тегах. Кстати, востребованность этих файлов при первоначальной настройке WLW я обнаружил при помощи Fiddler’а. И, как оказалось, не зря, сразу разрешилось очень много проблем с настройками сервисов. Но хотелось бы заменить, что wlwmanifest.xml действует только на Windows Live Writer.
Обновление по теме
Windows Live Writer стал проектом с открытым кода и теперь называется Open Live Writer (github).