鉴于电脑在下载kubuntu,别写下最近几天的学习心得。
刚开始时是想把网易、新浪、cnblogs等博客整合一起做成一个Windows Phone有关的客户端的。但是现在遇到了瓶颈。
XML-RPC是什么,根据个人理解,是基于XML的远程调度协议(Remote Procedure Control)。RPC就像是这个程序在本地运行,然后运行到需要调用的子程序时,向网络发出调用并且获取结果。
网易等博客的API是基于xml-rpc里面的metaweblog的接口,我们只要实现了即可。
一.有关xml-rpc
百度百科有很详尽的解释:http://baike.baidu.com/view/643379.htm
然后由于XML-RPC需要实现,鉴于自己技术功底不行。只能依靠网上的开源项目。又由于自己想在.net平台上实现,自然会选择到xml-rpc了。
有关xml-rpc的.net实现,在这里要感谢Charles Cook大神。下载连接在这里:http://xmlrpcnet.googlecode.com/files/xml-rpc.net.3.0.0.270-snapshot.zip
选择3.0的版本下载。选择这个版本的原因是因为这个版本支持windows phone。
二。实现
由于在win下实现比较方便,先选择了WIN。
官方有自带的说明文档,想详细了解的可以查看:http://xml-rpc.net/
看了下,无非就是需要我们去实现一个类或继承一个接口来调用xml-rpc。我们使用的时候,把bin里面某个特定的(电脑CookComputing.XmlRpcV2.dll,WP是有phone的那个)dll添加到references即可。然后使用该域:using CookComputing.XmlRpc;
虽然官网上文档提供了使用XmlRpcProxyGen的类来实现的方法,但是由于这个类我没找到,所以我用了继承XmlRpcProxy这个类来实现的。
这个也是网上有相关的demo启发的:http://www.cnblogs.com/canlay/archive/2012/05/04/2483055.html
这个demo提供的是同步的实现,至于异步,可参考文档的2.10节。
这里我给个郑老师给的demo,这个demo是WP的,鉴于某些问题,修改了代码的一部分:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Net; 5 using System.Windows; 6 using System.Windows.Controls; 7 using System.Windows.Documents; 8 using System.Windows.Input; 9 using System.Windows.Media; 10 using System.Windows.Media.Animation; 11 using System.Windows.Shapes; 12 using Microsoft.Phone.Controls; 13 using CookComputing.XmlRpc; 14 using System.Reflection; 15 16 namespace PhoneApp1 17 { 18 public partial class MainPage : PhoneApplicationPage 19 { 20 // 构造函数 21 public MainPage() 22 { 23 InitializeComponent(); 24 } 25 26 private void button1_Click(object sender, RoutedEventArgs e) 27 { 28 double number = 2340.0; 29 var proxy = new TestProxy(); 30 proxy.BeginGetName(number, asr => 31 { 32 Dispatcher.BeginInvoke(delegate() 33 { 34 try 35 { 36 textBox1.Text = proxy.EndGetName(asr); 37 } 38 catch (XmlRpcFaultException fex) 39 { 40 textBox1.Text = "[" + fex.FaultCode.ToString() + "] " + fex.FaultString; 41 42 } 43 catch (Exception ex) 44 { 45 textBox1.Text = ex.Message; 46 } 47 }); 48 }); 49 } 50 } 51 [XmlRpcUrl("远程调用的网址")] 52 public class TestProxy : XmlRpcClientProtocol 53 { 54 [XmlRpcBegin("调用函数的名字")] 55 public IAsyncResult BeginGetName(double a, AsyncCallback acb) 56 { 57 return this.BeginInvoke(MethodBase.GetCurrentMethod(), new object[] { a }, acb, null); 58 } 59 [XmlRpcEnd] 60 public string EndGetName(IAsyncResult iasr) 61 { 62 string ret = (string)this.EndInvoke(iasr); 63 return ret; 64 } 65 } 66 }
DEMO之中设计到C#的reflection特性,也是让我好好学习了。
好了,里面的[XmlRpc....]这些代码是不是不知道在干什么?相关的知识有关C#的attribute和xml-rpc的文档,里面有详细定义怎么实现的。还有XmlRpcProxy.Invoke这个方法正是程序调用远程API函数的方法。
三。博客之研究
好,前面我们介绍有关xml-rpc的相关知识了。现在我们来研究博客。
因为以前本人都在在163平台下写博的,所以先拿它开刀!
这篇文章说明了博客的API:http://blog.163.com/blog_admin/blog/static/721279201082863728829/?frompersonalbloghome
至于里面的有关结构,我们可以在下载的文件中的interface找到相关的struct,自行添加到自己域中即可。
blogid是采用“default”,username格式是"你的用户名" + "@126"(或“@163”)
其中categories结构体由于163自行改动了一些,在调试过程中会出现问题。此时我们把会掉失的变量引入[XmlRpcMissingMapping(MappingAction.Ignore)]即可。
这是实测成功的图片:
好了,其他的API请自行研究吧。MetaWeBlog这个API在博客平台上非常常见,cnblogs,windows live等等也有,自行搜索吧。
那么我现在遇到的问题是在WP平台上进行同样的操作(无论是异步还是同步)总会出错:
代码的正确性等等已经验证了,在同步中出现如上图的错误,如果是异步的话,会出现invalidcast的错误。
不知道是不是因为这个库对WINDOWS PHONE还没完全支持的原因。希望大家能帮忙解决我的问题。