践踏都市

七月 2010 - 文章

网站建设是急功近利还是循序渐进?

从第一次做网站开始,到今年也差不多10年了,也可以算是“老鸟”了。自己做过很多创业型网站,也服务过N多的互联网公司去做网站。

急功近利和循序渐进是常见的两种建站的心态,在一个宏伟的规划面前,我们经常唯恐慢人一步,每每企图抢占先机,经过一番论证或者“研究”后跨马上架,而且常常越跑越快。04年的时候,我刚刚毕业,但当时也有大约4年做网站的经历,本着对网站的理解和对行业的了解,我一边找这工作,一边开始了我当时的第一次创业试验。

    我本来是油画专业毕业,然后自己又爱好程序,因此美工、开发、策划、推广我就一人开工干活了,当时的CMS还不像如今这么成熟,我当时就立足当时的情况(个人站长多如牛毛),想开发一套实用、能帮助个人站长快速建站的CMS,经过自己一番“研究”后,梳理了一堆CMS的功能点:频道管理、资讯采集(当时绝对是时髦有吸引力的功能)、无极分类、拖放布局(在当时也绝对是好创意)、前后端分离(我做过美工和开发,太明白前后端分离的重要性).......想好了一堆东东以后,我衡量了一下我的水平,觉得一定没问题,我对自己当时的开发能力相当自信。
    于是,我利用每天下班的时间和周末的时间,喀喀喀,一个月下来,一个可以用的CMS雏形和框架已近建立了,于是,我就自己用我的CMS建了个网站,叫"新楚天",网站建立的第一天,我就报着打造“楚天地方门户“的想法来做,加上我CMS内置的采集模块,每天以至少5000篇的采集速度来更新网站。很快,一个内容容量10W的网站就诞生了,当时界面抄Sina(和我在Sina工作有关),从外表看上去绝对是个大站。按当时的搜索引擎的状态,我以快速的更新和大量的泛资讯,我的网站流量成长很快(3个月内流量到达5000IP,6个月左右到达25000IP,此后一直增长,瓶颈状态是约一年左右的50000IP上下),我自认为我的网站已经是我打造的CMS的一个很好的推广平台和案例,在之后的半年内,随着网站的运作不我也完善了CMS的功能,于是我就挂了上了我的CMS的开源下载,发布了第一个版本的CMS。
(当时.net开发的完整系统都不多)
    基于我网站的流量,当时的日均下载量约有100多次,貌似有人是拿来研究代码的,有人是下编译版做网站的,一时间,我收到了很多朋友的邮件、留言,通过这个东东我确实是交了一些朋友(全国各地的,有些现在还有联系,目前这些朋友有很多也分散到各大网站和IT公司),这在当时确实是让我的虚荣心一下子膨胀了,更快的想最求成就感。急功近利的心态就出现了。之后的一段时间,我频发新功能,应该也有一些用户已经用我的CMS架了网站,很快我又收到了一些铺天盖地的问题和反馈,由于放了太多的功能,凭我当时的开发能力做出来不是问题,但是毕竟精力有限,无法在铺开的同时保证每一个功能精益求精,在刚放出功能的时候,都有朋友给我反馈功能的创意和理念的好(比如我当时已经模板化的提供采集,用户可以毫无门槛的去采集众多网站,提供的绝对分离换肤功能在当时也挺赞的),但是,每个功能放出没多久,都会有bug和一些使用上的问题,后面很长一段时间,我都疲于应付bug和优化,功能上都无发做开发,我自己的网站”新楚天“也没去多想做什么新内容,依旧机械的采集。
    我早期建立起来的跟新快、功能强的口碑很快就要瓦解,群里的朋友虽然能理解我当时的精力有限等困难,但是实际的用户是不能忍受他们的网站不太好用(我当时建了一个QQ群,把我的优质用户和一些开发研究朋友加了进来),于是有的朋友慢慢开始请我帮忙做数据迁移,我忍痛帮朋友将数据迁移到其他新起的CMS。(我的这个QQ群还在,以前的一些老友还常常聊起)从做CMS的初衷来看,我认为我的这次创业是失败的,因为到最后,差不多只是我自己的网站的一个系统,更不不能产品化。值得安慰的是,收获了一些朋友。

    在我的产品梦破灭后,我就转向开始做网站运营,”新楚天“作为我做CMS产品的一个衍生物保留下来了,而且当时流量还不错,于是我就自己安慰一下自己,还是吧网站经营好,做的CMS自己用得了。当时流行做Google的联盟广告,我也跟着一起来做,刚开始的时候,由于我没摸到门路,我一个月下来只要几十美金。这个时候,我之前建立的群,性质就变了,之前一群做网站的站长和技术人员,现在都开始一起讨论google广告赚钱的方法。当时还不知道用户体验的概念,我们就很单纯的去交流”怎么能让用户多点广告"(现在想想,就是用户体验里转化率的概念),以我当时的网站流量,我的转化率上到1/1000我的广告收入就可以上百美金,当时的汇率有近1000人民币,对当时的我还是补贴很大的。
    经过一番研究,我的转化率最终达到了1-2%左右,我一个月可以有1000多美金的收入,折合人民币,不比我的工资少了,过了一段相当爽的日子,由于“业绩”的刺激,我想把业绩再翻一番(当时已经到了现在的公司),于是又想了一堆吸引流量做内容的点子,做RSS聚合和资讯分享等等,当时也是受web2.0的刺激~于是新一轮的开发开始了。但是好景不长,睡着铺开的功能多,访问量和用户量的上升,性能遇到了瓶颈,程序需要大规模的优化,当时又遇到公司网站改版这样的大项目,瞬间感到精力不够用了,网站频频崩溃,新的功能上线后有bug,但是开发已经开始了,要撤回到之前的状态,貌似也很困难了(偶自己做网站自然不会有太多的版本管理),这个时候的网站已经是一个“理念高级但不成熟的产品”基本不能回到之前相对“低级但完整的网站”这给用户带来是毁灭性的体验,流量开始下滑,迫于个人精力的压力,基本不可能持续开发下去,于是在2008年初,只有将网站关闭了,也损失了每月约800-900美金的收入(反正前景不妙,不如乘早,免得影响工作)
    如果说这算第二次创业,那么也是因为一时冲动,追求业绩突长,没有控制好风险,将功能和产品线功能拉长,自己将自己拖死了。

    回过头来,在看看我当时的一些朋友,自己不懂网站的开发,守着一个网站系统去用,将功能发挥到极致,在原功能上不断改善和包装网站的内容和形态,随着产品的升级步步为营,几个朋友的网站都取得了不错的收益,一个朋友在07年凭借800万美金的风投,成功度过积累期,一个朋友连产品带人一起卖给了电信的合作公司飞信获得了产品的飞跃。

    其实,急功近利和循序渐进两种不同的心态,将决定你在互联网的领域能走多远。行业内可以看到,那些稳步经营的如QQ、163都比那些快速拿到风投的企业走的远!

[转贴]用户体验是一种态度

近些年来,用户体验(User Experience,UX/UE)被提及得越来越频繁,无论是软件、IT
还是任何其他行业都开始日益重视用户体验,例如:


  • 成立专门的用户体验部门/小组
  • 新增与用户体验相关的专职设计师、工程师甚至高层管理人员
  • 引入与用户体验相关的新开发设计流程
  • 用户体验以需求或主要评价指标的形式单独出现

这场用户体验革命的浪潮让几乎所有人都意识到了重视用户体验的意义以及带来的价值,但在实践过程中,人们也发现它对传统的软件开发产生着巨大的冲
击。很容易可以找出在企业或者产品团队中用户体验设计人员与开发人员之间的矛盾与对抗:









设计人员认为开发人员认为

  • 开发人员不理解用户的需求
  • 开发人员总是从程序的结构角度来考虑问题
  • 开发人员总是用性能或者其他各式理由来拒绝一些设计上的要求
  • 开发人员不愿意把时间花在进一步提升用户体验上

  • 设计人员对技术一窍不通
  • 设计人员的想法经常是天马行空、不切实际
  • 设计人员总是喜欢标新立异,用户根本不习惯这些怪异的设计
  • 设计人员的设计复杂度远远超出了项目初期的预算,我们根本不可能按时交付

在这些“抱怨”中我们可以注意到,最主要的矛盾在于设计人员和开发人员往往不能理解对方的工作内容,能够在对方知识背景方面有深厚积累的更是凤毛麟
角。也正是因为这一点,很多产品经理(PM)并不能很好地对设计和开发进行权衡,使得很多决策必须通过设计人员与开发人员的反复“对抗”来进行。无疑,不
管是团队内部的人员关系还是配合效率都有严重的负面影响。


是主导还是妥协?


一山不容二虎。如果设计人员和开发人员都各行其主张,产品永远无法不可能被开发出来。为了提升用户体验的地位,或者说是为了引入更加“用户体验”的
开发设计流程,一些原本是“开发驱动”的流程开始转向“用户体验驱动(UX-driven)”。用户体验驱动的本意可能是强调“用户体验的重要性”,避免
用户体验处于被动地位。对于强调“以用户为中心(User-Centered Design,UCD)”的开发流程中,更是起到了保障的作用。


勿容置疑,用户体验驱动开发确实提升了用户体验设计的主动性,但是遗憾的是:用户体验仍然是最终做出让步的一方。通俗地说,虽然现如今设计人员有了
软件设计的主动权(而不是被动根据开发的要求进行设计支持),但是开发人员仍然可以(而且应当)拒绝一切在技术和资源上不合理或者不切实际的设计。如果设
计妥协,产品只是不太好用而已;如果技术妥协,产品根本无法开发。一旦到了需要权衡的时候,牺牲的只能是用户体验。任何所谓“设计高于技术”的信条,只是
市场宣传的一套说辞和吸引公众的口号罢了:没有哪一个企业能够容忍自己的产品开发永远处于未知状态。


所以,作为企业来说,只有商业驱动,没有技术驱动,更没有用户体验驱动。


是研发还是开发?


很多企业在这一点上界定并不明确,这里列出“研发”和“开发”的一些主要区别:









研发开发

  • 创新、探索式的
  • 以得到某项数据或者实现某项新技术为目标
  • 没有严格的时间限制,往往是长期的
  • 研究失败是正常的、可以接受的

  • 项目工程式的
  • 以生产制造某项产品为目标
  • 有明确的时间限制和详细的开发计划
  • 非市场因素造成的失败会被视为严重事故

一般来说,产品开发人员不会把“研发一项新技术”写进产品开发的需求列表,因为他们很清楚无法进行这样的规划和预算,他们也不会承诺在产品中实现某
项目前还不存在或者没有掌握的技术——这是新技术实验室的研究人员做的事情。产品团队在制订开发计划时,只会选用现有的技术,因为只有这样,才能最大限制
地保证在给定的时间范围内,用给定的资源完成项目开发。谁知道新技术猴年马月才能被研发出来呢?


不过,这一切在引入了用户体验设计之后就被打破了。“更好的用户体验”进入了产品开发的需求范围,用户体验设计人员并不是利用现成的技术在生产产
品,而被要求进行“创新”。设计人员在几乎没有约束的状态下进行用户体验研发(而非开发),项目范围(scope)和工作量都处于严重模糊甚至失控的状
态。开发人员不知道设计人员设计出来的软件需要多少工作量来“生产”,甚至往往连设计人员都无法预计自己的工作量。


是技术还是态度?


现在一提到“以用户为中心”,大家都会联想到用户体验的一套研究设计方法流程。但是如果提到“用户导向”这个概念,可能大家已经习以为常。对于以商
业为目的的企业活动来说,我(至少目前)并不觉得这两个概念有什么区别,只不过前者听起来更加亲切,后者的学术感更强而已。“客户至上”“顾客就是上帝”
“顾客永远是对的”这些口号无一不在反映着“以用户为中心”的根本思想。很多年前,市场营销学家们就提出了变“生产导向”为“市场导向”,后又将“市场导
向”重新表述为“用户导向”。但是无论是哪种导向,市场营销还是市场营销,客服还是客服,并没有让用户体验团队来取代他们的职责。对于各种职能部门来说,
无论是“用户导向”还是“以用户为中心”都是一种理念,一种新的思维方式,而不是新的技术。


回到软件开发行业。最早的软件开发就是编码,能把程序写出来就万事大吉——那个时候可以算是“功能导向”的。当软件规模越来越大时,这种随意的开发
不再适合,于是开始有人研究软件开发的工程化,出现了面向软件开发的流程管理和质量控制,形成了软件工程体系。这一阶段,软件内部的质量有了明显的提高,
开发过程的质量也得到了控制。当“生产导向”变成“市场导向”时,软件开发商不得不开始重视用户对软件的感受,于是开始试图提升“软件面向最终用户的质
量”,也就是我们常说的“用户体验”。


在用户眼中,一切都是用户体验。无论是软件的界面美观性、可用性、说明书的装订、包装盒的印刷、杂志广告的内容、还是销售和客服人员的服务态度等
等,都是用户体验的范畴。用户体验部门如果对于界面设计事事具细,理应对生产印刷、物流、广告、售前售后等都应进行详尽的设计和规范。但事实上又没有哪个
组织的用户体验部门能够如此“全能”。因此,在我看来,无论是说“用户体验”还是说“以用户为中心”,都不是在指具体的技术或职能,更多的是一种工作态
度,就和认真仔细、耐心、热情、有责任心等等方面一样,是一种横跨所有技能职位的行事态度。换句话说:要做 UX 的人,而不是 UX 的事。


如何发挥用户体验的价值?


经过之前三个方面的讨论,现在应该来说说用户体验以及用户体验团队应该如何更好地在 IT 企业中发挥价值。


首先,“以用户为中心”是一种理念,“关注用户体验”是企业每个部门每个岗位的责任,而不只是专职人员的工作。也正因为如此,用户体验部门的主要职
能不再是细节的界面设计,而是对整个公司各项活动进行宏观指导和规范,以整体提高每个环节的用户体验。此时的用户体验部门不再是一个垂直部门,而是变为横
向部门。


其次,原来的那些事情还是需要人来做的,比如信息架构设计、交互设计、视觉设计、用户研究、可用性测试等等。这些职能仍然需要相关的专职人员,但不
再属于用户体验部门,而是根据其具体的业务对象,回归各个部门的职能。就好像开发需要前端、后台、测试工程师等等一样,需求工程师、交互设计师、视觉设计
师、可用性测试工程师也是开发团队中的职能,没有必要非要用“用户体验部门”将其独立和分离,更不可与开发团队并行。至于用户研究人员则可以回归市场营销
部门。在一个完整的产品小组中,各职能人员是在 PM
的带领下协同工作,而不是某部分去“驱动”另外的部分。真正的用户体验部门则应当制订更好的跨部门工作流程并给予各部门专业指导,以保证大家确实是在“以
用户为中心”的方式工作。


最后,也是最重要的:研发与开发的分离。用户的反馈收集与研究、用户体验的提升、交互方式改进等等应当是研发的范畴,由研发部门进行。产品部门要做
的仅仅是从研发部门中选取适合自己的研究成果,并把一些问题和想法提给研发部门——而绝不是在产品开发过程中给研发部门下达计划任务。用户体验设计从根本
上来说是一种创新活动,而在产品开发过程中是很难做到充分创新的,因此用户体验设计应当放入科研轨道。更彻底的做法是:即使是在研发团队中,用户体验设计
也应当只是研发团队的一部分,研发团队向其他部门输出的不能只是空洞的“创意”和“想法”,而必须是经过技术研发的、可行的“解决方案”,保证产品开发团
队只需要“拿来主义”。只有这样,才能让科研人员没有束缚地不断追求更好的用户体验并将其付诸于实现,而产品团队也不至于对产品需求、范围和工期难以掌控
导致项目延期甚至失败。


当然,要建立这样的体系需要强大的资金支持。追求好的用户体验与实现好的传统软件工程一样,都需要组织自身的积累和支撑。对于实力并不雄厚的小企业
来说,除了发挥英雄主义之外,还有很长的路要走。

在 Asp.Net中创建MetaWeblog API
毫无疑问MetaWeblog API是一个非常有益和受欢迎的发明,只为博客和其他网站的一些一般服务。


概念

metaweblog是基于XML的RPC通信( 下载 )。这意味着你有一组预先定义的结构(简单的数据类型属性 )表示,正转客户端和服务器之间。

您需要使用MetaWeblog API 的以下六个结构:

* BlogInfo: 有关博客的网址, ID或名称。
* UserInfo: 博客用户的ID ,名字,姓氏或电子邮件。
* Post: 就是博客帖子,标题,正文和类别。
* CategoryInfo: 博客类别信息,编号和名称。
* MediaObject: 有关媒体对象(图像,音频和其他文件类型)的名称,类型和数据。
* MediaObjectInfo: 媒体对象。



作为一般规则,您可以请记住, metaweblog API使用字符串类型为基本类型,参数和返回类型和不存在任何整数类型。 在几个地方也用到了布尔和Base64编码的字符串两个类型。



MetaWeblog API有九个方法:

* metaWeblog.newPost: 增加一个新帖子。
* metaWeblog.editPost: 更新帖子。
* metaWeblog.getCategories: 获得博客的类别。
* metaWeblog.getPost: 得到一个单一的POST数据。
* metaWeblog.getRecentPosts: 得到的最近的帖子。
* metaWeblog.newMediaObject: 增加一个新的媒体对象。
* blogger.deletePost: 删除一个帖子。
* blogger.getUserInfo: 获得用户信息。
* blogger.getUsersBlogs: 得到用户的blog清单。



如何创建metaweblog

1.首先下载XML-RPC.NET, 然后添加引用到项目中。。

2.创建一个 HTTP Handler 或者 WebService。这里创建的是HTTP处理程序MetaWeblogAPI.ashx。并设置入口点- Class="MetaWeblogSample.MetaWeblog"。

<%@ WebHandler Language="C#" CodeBehind="MetaWeblogAPI.ashx.cs" Class="MetaWeblogSample.MetaWeblog" %>



3.创建结构Structures( Structs.cs ),至于如何正确创建此结构,请看 MetaWeblog API 规范。

下面的代码是我创建的结构。 你也可以在你的项目中使用相同的代码, 因为这些结构是固定不变的。

using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using CookComputing.XmlRpc;

namespace MetaWeblogSample
{
#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
{
public DateTime dateCreated;
public string description;
public string title;
public string[] categories;
public string permalink;
public object postid;
public string userid;
public string wp_slug;
}


[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;
}

[XmlRpcMissingMapping(MappingAction.Ignore)]
public struct MediaObject
{
public string name;
public string type;
public byte[] bits;
}

[Serializable]
public struct MediaObjectInfo
{
public string url;
}

#endregion
}

4.创建 MetaWeblog API 接口( IMetaWeblog.cs )。这个接口的定义也是 MetaweBlog的规范。 其中有 两组核心 MetaWeblog API 和 Blogger API。代码如下:

using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using CookComputing.XmlRpc;

namespace MetaWeblogSample
{
public interface IMetaWeblog
{
#region MetaWeblog API

[XmlRpcMethod("metaWeblog.newPost")]
string AddPost(string blogid, string username, string password, Post post, bool publish);

[XmlRpcMethod("metaWeblog.editPost")]
bool UpdatePost(string postid, string username, string password, Post post, bool publish);

[XmlRpcMethod("metaWeblog.getPost")]
Post GetPost(string postid, string username, string password);

[XmlRpcMethod("metaWeblog.getCategories")]
CategoryInfo[] GetCategories(string blogid, string username, string password);

[XmlRpcMethod("metaWeblog.getRecentPosts")]
Post[] GetRecentPosts(string blogid, string username, string password, int numberOfPosts);

[XmlRpcMethod("metaWeblog.newMediaObject")]
MediaObjectInfo NewMediaObject(string blogid, string username, string password,
MediaObject mediaObject);

#endregion

#region Blogger API

[XmlRpcMethod("blogger.deletePost")]
[return: XmlRpcReturnValue(Description = "Returns true.")]
bool DeletePost(string key, string postid, string username, string password, bool publish);

[XmlRpcMethod("blogger.getUsersBlogs")]
BlogInfo[] GetUsersBlogs(string key, string username, string password);

[XmlRpcMethod("blogger.getUserInfo")]
UserInfo GetUserInfo(string key, string username, string password);

#endregion
}
}

5. 也是最后一步,实现接口。。此外,你还需要一个方法来验证用户的用户名和密码,验证通过的可以让其实现接口的方法。以下代码有所不同,这取决于你的博客引擎或网站。

using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using CookComputing.XmlRpc;
using System.Collections.Generic;

///
/// 注释说明来自网络。。
///

namespace MetaWeblogSample
{
public class MetaWeblog : XmlRpcService, IMetaWeblog
{
#region Public Constructors

public MetaWeblog()
{
}

#endregion

#region IMetaWeblog Members

string IMetaWeblog.AddPost(string blogid, string username, string password,
Post post, bool publish)
{
if (ValidateUser(username, password))
{
string id = string.Empty;

// TODO: 请根据实际情况返回一个字符串,一般是Blog的ID。

return id;
}
throw new XmlRpcFaultException(0, "User is not valid!");
}

bool IMetaWeblog.UpdatePost(string postid, string username, string password,
Post post, bool publish)
{
if (ValidateUser(username, password))
{
bool result = false;

// TODO: 请根据实际情况返回一个布尔值,表示是否更新成功。

return result;
}
throw new XmlRpcFaultException(0, "User is not valid!");
}

Post IMetaWeblog.GetPost(string postid, string username, string password)
{
if (ValidateUser(username, password))
{
Post post = new Post();

// TODO: 请根据实际情况返回一个Struct { Struct是一个规范格式,
// 格式就是Post的属性,注意category是一个数组,是这个Post所属的类别。
// 如果类别不存在,服务器端将只处理存在的类别}。

return post;
}
throw new XmlRpcFaultException(0, "User is not valid!");
}

CategoryInfo[] IMetaWeblog.GetCategories(string blogid, string username, string password)
{
if (ValidateUser(username, password))
{
List categoryInfos = new List();

// TODO: 请根据实际情况获取Blog的类别,并设置CategoryInfo。

return categoryInfos.ToArray();
}
throw new XmlRpcFaultException(0, "User is not valid!");
}

Post[] IMetaWeblog.GetRecentPosts(string blogid, string username, string password,
int numberOfPosts)
{
if (ValidateUser(username, password))
{
List posts = new List();

// TODO: 返回一个结构(struct)的数组(array)。
// 每一个Struct包含getPost返回值一样的结构。请设置后返回。


return posts.ToArray();
}
throw new XmlRpcFaultException(0, "User is not valid!");
}

MediaObjectInfo IMetaWeblog.NewMediaObject(string blogid, string username, string password,
MediaObject mediaObject)
{
if (ValidateUser(username, password))
{
MediaObjectInfo objectInfo = new MediaObjectInfo();

// TODO: 返回一个数组
// 其中blogid、username、password分别代表Blog的id(注释:如果你有两个Blog,blogid指定你需要编辑的blog)、用户名和密码。
// struct必须包含name, type 和bits三个元素,当然也可以包含其他元素。


return objectInfo;
}
throw new XmlRpcFaultException(0, "User is not valid!");
}

bool IMetaWeblog.DeletePost(string key, string postid, string username, string password, bool publish)
{
if (ValidateUser(username, password))
{
bool result = false;

// TODO: 请根据实际情况返回一个布尔值,表示是否删除成功。

return result;
}
throw new XmlRpcFaultException(0, "User is not valid!");
}

BlogInfo[] IMetaWeblog.GetUsersBlogs(string key, string username, string password)
{
if (ValidateUser(username, password))
{
List infoList = new List();

// TODO: 请根据实际情况获取 当前用户 Blog 信息,并设置用户 Blog 信息。

return infoList.ToArray();
}
throw new XmlRpcFaultException(0, "User is not valid!");
}

UserInfo IMetaWeblog.GetUserInfo(string key, string username, string password)
{
if (ValidateUser(username, password))
{
UserInfo info = new UserInfo();

// TODO: 请根据实际情况获取 当前用户 信息,并设置用户 信息。

return info;
}
throw new XmlRpcFaultException(0, "User is not valid!");
}

#endregion

#region Private Methods

private bool ValidateUser(string username, string password)
{
bool result = false;

// TODO: Implement the logic to validate the user

return result;
}

#endregion
}
}



6.编译通过了,测试下: http://localhost:1269/MetaWeblogAPI.ashx

app_img3

测试是通过了,具体如何怎么用在博客上我也没做出来,还得研究。值得提醒的是 通过 http://www.xmlrpc.com 下载 的 xml-rpc.net 包包已经包含各个结构,接口和方法的代码,请自行研究。