metawebblog api  是一个博客标准,这样我们就可以通过实现这个标准来实现

 

我们自己的博客支持word2007,windows liver writer来写博客.

 

metablog的.net接口如下.

 

using System;
using System.Collections.Generic;
using System.Text;
using CookComputing.XmlRpc;

namespace blog
{

    #region Structs

    public struct BlogInfo
    {
        public string blogid;
        public string url;
        public string blogName;
    }

    public struct Category
    {
        public string categoryId;
        public string categoryName;
    }

    [Serializable]
    public struct CategoryInfo
    {
        public string description;
        public string htmlUrl;
        public string rssUrl;
        public string title;
        public string categoryid;
    }

    [XmlRpcMissingMapping(MappingAction.Ignore)]
    public struct Enclosure
    {
        public int length;
        public string type;
        public string url;
    }

    [XmlRpcMissingMapping(MappingAction.Ignore)]
    public struct Post
    {
        [XmlRpcMissingMapping(MappingAction.Error)]
        [XmlRpcMember(Description = "Required when posting.")]
        public DateTime dateCreated;
        [XmlRpcMissingMapping(MappingAction.Error)]
        [XmlRpcMember(Description = "Required when posting.")]
        public string description;
        [XmlRpcMissingMapping(MappingAction.Error)]
        [XmlRpcMember(Description = "Required when posting.")]
        public string title;

        public string[] categories;
        public Enclosure enclosure;
        public string link;
        public string permalink;
        [XmlRpcMember(
             Description = "Not required when posting. Depending on server may "
             + "be either string or integer. "
             + "Use Convert.ToInt32(postid) to treat as integer or "
             + "Convert.ToString(postid) to treat as string")]
        public object postid;
        public Source source;
        public string userid;

        //public string mt_excerpt;
    }

    [XmlRpcMissingMapping(MappingAction.Ignore)]
    public struct Source
    {
        public string name;
        public string url;
    }

    public struct UserInfo
    {
        public string userid;
        public string firstname;
        public string lastname;
        public string nickname;
        public string email;
        public string url;
    }

    public struct MediaObjectUrl
        {
            public string url;
        }

    public struct MediaObject
        {
            public string name;
            public string type;
            public byte[] bits;
        }
    #endregion
    public interface IMetaWeblog
    {
        #region MetaWeblog API

        [XmlRpcMethod("metaWeblog.newPost",
             Description = "Makes a new post to a designated blog using the "
             + "MetaWeblog API. Returns postid as a string.")]
        string newPost(
            string blogid,
            string username,
            string password,
            Post post,
            bool publish);

        [XmlRpcMethod("metaWeblog.editPost", Description = "Updates and existing post to a designated blog "
             + "using the MetaWeblog API. Returns true if completed.")]
        bool editPost(
            string postid,
            string username,
            string password,
            Post post,
            bool publish);

        [XmlRpcMethod("metaWeblog.getPost",
             Description = "Retrieves an existing post using the MetaWeblog "
             + "API. Returns the MetaWeblog struct.")]
        Post getPost(
            string postid,
            string username,
            string password);

        [XmlRpcMethod("metaWeblog.getCategories",
             Description = "Retrieves a list of valid categories for a post "
             + "using the MetaWeblog API. Returns the MetaWeblog categories "
             + "struct collection.")]
        CategoryInfo[] getCategories(
            string blogid,
            string username,
            string password);

        [XmlRpcMethod("metaWeblog.getRecentPosts",
             Description = "Retrieves a list of the most recent existing post "
             + "using the MetaWeblog API. Returns the MetaWeblog struct collection.")]
        Post[] getRecentPosts(
            string blogid,
            string username,
            string password,
            int numberOfPosts);

        [XmlRpcMethod("metaWeblog.newMediaObject", Description = "Add a media object to a post using the metaWeblog API. Returns media url as a string.")]
        MediaObjectUrl newMediaObject(string blogid, string username, string password, MediaObject mediaObject);

        #endregion

        #region BloggerAPI

        [XmlRpcMethod("blogger.deletePost",
             Description = "Deletes a post.")]
        [return: XmlRpcReturnValue(Description = "Always returns true.")]
        bool deletePost(
            string appKey,
            string postid,
            string username,
            string password,
            [XmlRpcParameter(
                 Description = "Where applicable, this specifies whether the blog "
                 + "should be republished after the post has been deleted.")]
        bool publish);

        [XmlRpcMethod("blogger.getUsersBlogs",
             Description = "Returns information on all the blogs a given user "
             + "is a member.")]
        BlogInfo[] getUsersBlogs(
            string appKey,
            string username,
            string password);

        [XmlRpcMethod("blogger.getUserInfo",
             Description = "Returns information about the given user.")]
        UserInfo getUserInfo(
            string appKey,
            string username,
            string password);

        #endregion

    }

}

 

我们再实现这个接口:

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Data;
using System.IO;
using individual;
using CookComputing.XmlRpc;
using article;
using System.Web;

namespace blog
{
    public class MetaWeblog : XmlRpcService, IMetaWeblog
    {

        #region IMetaWeblog 成员

        public string newPost(string blogid, string username, string password, Post post, bool publish)
        {
            if (!ValidateUser(username, password)) throw new XmlRpcFaultException(0, "用户不存在");

            ArticleCategory cat = new ArticleCategory();
            DataSet ds= cat.GetAllDSByBlogId(int.Parse(blogid));

            DataTable dt = ds.Tables[0];
            DataRowCollection drs = ds.Tables[0].Rows;

            Article article = new Article();
            ArticleModel model = new ArticleModel();
            model.AddTime = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
            model.BlogId = int.Parse(blogid);
            model.Contents = post.description;
            model.CanRemark = 1;
            model.Subject = post.title;
            model.State = (publish) ? 1 : 2;

            if (post.categories.Length > 0)
            {
                string catName = post.categories[0];
                DataRow[] aryDr = dt.Select("name='" + catName +"'");
                model.CategoryId = int.Parse(aryDr[0]["categoryId"].ToString());
            }
            else
            {
                model.CategoryId = int.Parse(drs[0]["categoryId"].ToString());
            }

            article.Model = model;
            long postId = article.Add();

            if (postId > 0)
                return postId.ToString();
            else
                throw new XmlRpcFaultException(0, "发表文章不成功");

        }

        public bool editPost(string postid, string username, string password, Post post, bool publish)
        {
            if (!ValidateUser(username, password)) throw new XmlRpcFaultException(0, "用户不存在");
            try
            {
                Article article = new Article();
                int articleId = int.Parse(postid);
                ArticleModel model = (ArticleModel)article.GetById(articleId);

                model.AddTime = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
                model.Contents = post.description;
                model.Subject = post.title;
                model.State = (publish) ? 1 : 2;
                if (post.categories.Length > 0)
                {
                    ArticleCategory cat = new ArticleCategory();
                    DataSet ds = cat.GetAllDSByBlogId(model.BlogId);
                    DataTable dt = ds.Tables[0];
                    string catName = post.categories[0];
                    DataRow[] aryDr = dt.Select("name='" + catName +"'");
                    model.CategoryId = int.Parse(aryDr[0]["categoryId"].ToString());
                }
                article.Model = model;
                article.Update();
                return true;
            }
            catch (Exception ex)
            {
                throw new XmlRpcFaultException(0, "更新文章失败");
            }
        }

        public Post getPost(string postid, string username, string password)
        {
            if (!ValidateUser(username, password)) throw new XmlRpcFaultException(0, "用户不存在");
            Article article = new Article();
            int articleId = int.Parse(postid);
            ArticleModel model = (ArticleModel)article.GetById(articleId);

            Post post = ConvertModelToPost(model);
            return post;
        }

        public CategoryInfo[] getCategories(string blogid, string username, string password)
        {
            if (!ValidateUser(username, password)) throw new XmlRpcFaultException(0, "用户不存在");
            ArticleCategory cat = new ArticleCategory();
            int blogId=int.Parse(blogid);
            DataSet ds= cat.GetAllDSByBlogId(blogId);
            DataRowCollection drs = ds.Tables[0].Rows;
            ArrayList al = new ArrayList(drs.Count);
            foreach (DataRow dr in drs)
            {
                CategoryInfo catInfo = new CategoryInfo();
                catInfo.categoryid = dr["CategoryId"].ToString();
                catInfo.title = dr["name"].ToString();
                catInfo.description = "";
                catInfo.htmlUrl = "";
                catInfo.rssUrl = "";
                al.Add(catInfo);
            }
            return al.ToArray(typeof(CategoryInfo)) as CategoryInfo[];
        }

        public Post[] getRecentPosts(string blogid, string username, string password, int numberOfPosts)
        {
            if (!ValidateUser(username, password)) throw new XmlRpcFaultException(0, "用户不存在");

            int blogId=int.Parse(blogid);

            Article article = new Article();
            DataSet ds= article.GetAllByBlogId(blogId, 1, numberOfPosts).PageDataSet;

            DataRowCollection drs=ds.Tables[0].Rows;

            ArrayList al = new ArrayList(drs.Count);

            foreach (DataRow dr in drs)
            {
                Post post = new Post();
                post.postid = dr["articleId"].ToString();
                post.title = dr["subject"].ToString();
                post.description = dr["Contents"].ToString();
                post.categories = new string[] { dr["CategoryId"].ToString()};
                al.Add(post);
            }

            return (Post[])al.ToArray(typeof(Post));
        }

//实现文件上传

        public MediaObjectUrl newMediaObject(string blogid, string username, string password, MediaObject mediaObject)
        {
            if (!ValidateUser(username, password)) throw new XmlRpcFaultException(0, "用户不存在");

            Blog blog = new Blog();
            BlogModel model = (BlogModel)blog.GetById(int.Parse(blogid));

            string filename =  HttpContext.Current.Server.MapPath("/data/" + model.UserId + "/" + mediaObject.name);
            if (!Directory.Exists(Path.GetDirectoryName(filename)))
                Directory.CreateDirectory(Path.GetDirectoryName(filename));
            File.WriteAllBytes(filename, mediaObject.bits);
            MediaObjectUrl mediaObjectUrl = new MediaObjectUrl();
            mediaObjectUrl.url = "http://博客地址/data/" + model.UserId + "/" + mediaObject.name;
            return mediaObjectUrl;
        }

        public bool deletePost(string appKey, string postid, string username, string password, bool publish)
        {
            if (!ValidateUser(username, password)) throw new XmlRpcFaultException(0, "用户不存在");
            Article article = new Article();
            article.Delete(int.Parse(postid));
            return true;
        }

        public BlogInfo[] getUsersBlogs(string appKey, string username, string password)
        {
            if (!ValidateUser(username, password)) throw new XmlRpcFaultException(0, "用户不存在");
            Blog blog = new Blog();

            BlogModel model =(BlogModel) blog.GetByNickname(username);
            BlogInfo bloginfo = new BlogInfo();
            bloginfo.blogid = model.BlogId.ToString();
            bloginfo.blogName = username;
            bloginfo.url = http://博客地址/ + username;
            return new BlogInfo[] { bloginfo };
        }

        public UserInfo getUserInfo(string appKey, string username, string password)
        {
            if(!ValidateUser(username,password)) throw new XmlRpcFaultException(0, "用户不存在");
            Individual indi = new Individual();
            IndividualModel model= indi.GetByNickName(username);
            UserInfo userInfo = new UserInfo();
            userInfo.nickname = model.Nickname;
            userInfo.email = model.Account;
            userInfo.userid = model.UserId.ToString();

            return userInfo;
        }

        private Post ConvertModelToPost(ArticleModel model)
        {
            Post post = new Post();
            post.postid = model.ArticleId.ToString();
            post.title = model.Subject;
            post.description = model.Contents;
            post.categories = new string[] { model.CategoryId.ToString() };
            return post;
        }

        private bool ValidateUser(string username, string password)
        {
            try
            {
                bool isLogin = Individual.LoginNickname(username, password);
                return isLogin;
            }
            catch (Exception ex)
            {
                return false;
            }

        }
        #endregion
    }
}

 

 

这样就实现了博客支持客户端写作了

posted on 2007-07-20 12:05  自由港  阅读(1001)  评论(0编辑  收藏  举报