Windows Live Writer как редактор для своего блога

Полезности | создано: 18.04.2011 | опубликовано: 18.04.2011 | обновлено: 13.01.2024 | просмотров: 4923

Уже давно ведутся споры о том, где и как, можно и нужно управлять записями блога. Речь идет о 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).

Ссылки по теме