XML-RPC技术在WP上研究(一)

鉴于电脑在下载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还没完全支持的原因。希望大家能帮忙解决我的问题。

转载于:https://www.cnblogs.com/apir8181/archive/2012/09/14/2685526.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值