Home > IT > XML-RPC in C#

XML-RPC in C#

分享家:Addthis中国

由于本人的手机是Windows Mobile 6.5的系统,我总是试图找到一款支持WM的对Wordpress操作的软件。但一直找不到,无奈之下,正好运用一下比较喜欢的Linq来实现一下。
在此,正好讲讲XML-RPC以及它与Wordpress关系。
Wordpress进行操作,除了通过他的Web后台外,还有一种方法就是通过XML-RPC来实现。
关于XML-RPC我就不再赘述了,简单的来说就是:将包含着操作命令和操作数据的XML通过Http传输给XML-RPC Server。然后Server根据此XML分析出来的命令和数据进行操作,然后返回用户一个XML,里面包含了用户所需要数据的XML。

拿Wordpress自身的wp.getUsersBlogs命令举例

wp.getUsersBlogs
Retrieve the blogs of the users.
Parameters

  • string username
  • string password

Return Values

  • array
    • struct
      • boolean is_admin
      • string url
      • int blog_id
      • string blog_name
      • string xmlrpc_url

以上is_admin是表示该用户是否为管理员,url当然是你的博客地址,blog_id指的是博客的id到后面有用,blog_name指的是博客名(比方说我的是“风云阁”),xmlrpc_url是XML-RPC Server的地址。
值得一提的是,针对Wordpress而言,如果你的博客地址是http://www.xxx.com,则他的XML-RPC Server地址是http://wwwxxx.com/xmlrpc.php。
它的输入XML是

<methodCall>
    <methodName>wp.getUsersBlogs</methodName>
    <params>
        <param>
            <value>
                Username
            </value>
        </param>
        <param>
            <value>
                Password
            </value>
        </param>
    </params>
</methodCall>

以上的Username当然就是用户名了,Password当然就是你的密码,wp.getUsersBlogs是获得Blog的操作名。
当正确的时候返回的XML是(以我为例)

<methodResponse>
  <params>
    <param>
      <value>
        <array>
          <data>
            <value>
              <struct>
                <member>
                  <name>isAdmin</name>
                  <value>
                    <boolean>1</boolean>
                  </value>
                </member>
                <member>
                  <name>url</name>
                  <value>
                    <string>http://www.iron-feet.cn/</string>
                  </value>
                </member>
                <member>
                  <name>blogid</name>
                  <value>
                    <string>1</string>
                  </value>
                </member>
                <member>
                  <name>blogName</name>
                  <value>
                    <string>风云阁</string>
                  </value>
                </member>
                <member>
                  <name>xmlrpc</name>
                  <value>
                    <string>http://www.iron-feet.cn/xmlrpc.php</string>
                  </value>
                </member>
              </struct>
            </value>
          </data>
        </array>
      </value>
    </param>
  </params>
</methodResponse>

当用户名和密码出错的时候的XML是

<methodResponse>
  <fault>
    <value>
      <struct>
        <member>
          <name>faultCode</name>
          <value>
            <int>403</int>
          </value>
        </member>
        <member>
          <name>faultString</name>
          <value>
            <string>Bad login/pass combination.</string>
          </value>
        </member>
      </struct>
    </value>
  </fault>
</methodResponse>

根据Wordpress官方网站,Wordpress还支持Blogger API、MetaWeblog API以及Movable Type API

WordPress uses an XML-RPC interface. We currently support the Blogger API, metaWeblog API, and the Movable Type API.

各位看官们可以通过相关文档以及我上面的结构,获得正确的XML

自从有了Linq,很多东西变得非常方便了,比方说构造XML。接下来,介绍一下如果利用C#语言通过Linq构造XML,
比方说刚刚那个wp.getUsersBlogs的XML,构造代码如下:

                    XElement XmethodCall=
                        new XElement("methodCall",
                            new XElement("methodName", "wp.getUsersBlogs"),
                            new XElement("params",
                                new XElement("param",
                                    new XElement("value",
                                        new XElement("string", _strUsr)
                                    )
                                ),
                                new XElement("param",
                                    new XElement("value",
                                        new XElement("string", _strPwd)
                                    )
                                )
                            )
                        );

如何通过C#发送Post,方法如下:

        XElement Post(XElement XmethodCall)
        {
            WebRequest req = WebRequest.Create(strXmlRpc);//strXmlRpc是XML-RPC Server的地址,例如:我的就是http://www.iron-feet.cn/xmlrpc.php
            req.ContentType = "application/x-www-form-urlencoded";
            req.Method = "POST";
            byte[] bytes = System.Text.Encoding.ASCII.GetBytes(XmethodCall.ToString());
            req.ContentLength = bytes.Length;
 
            System.IO.Stream os = req.GetRequestStream();
            os.Write(bytes, 0, bytes.Length);
            os.Close();
            System.Net.WebResponse resp = req.GetResponse();
 
            System.IO.StreamReader sr = new System.IO.StreamReader(resp.GetResponseStream());
 
            XElement tempX=XElement.Parse(sr.ReadToEnd().Trim());
 
            var query = tempX.Elements("fault").Elements("value").Elements("struct").Elements("member").Elements("name");
            foreach (XElement x in query)
            {
                if (x.Value == "faultString")
                {
                    throw new Exception(x.Parent.Elements("value").First().Value);
                }
            }
 
            if (tempX.Name.ToString()== "methodResponse")
            {
                return tempX;
            }
            else
            {
                throw new Exception("This is not an XML-RPC server!");
            }
 
        }

小小的介绍结束了。
接下来提一下昨天和今天的工作。主要是写了个Linq2XMLRPC的类库,顺便做了个针对Windows Mobile进行Wordpress博客操作的GUI的雏形,这个GUI调用的就是我自己写的Linq2XMLRPC。目前日志和分类的一些操作已经成功实现。目前发现的最大问题感觉是局限于手机上网速度的限制,发表日志等待时间很长有空得研究研究手机上网的数据压缩问题

You don't feel like leaving comments? Please leave your palm-print.
懒得留言?那留下您的掌印吧。
Categories: IT Tags: , , , , ,
  1. May 26th, 2009 at 01:35 | #1

    小试牛刀,用Linq操作了一下XML,Linq真是太帅了

  2. alex
    August 3rd, 2009 at 21:57 | #2

    你好,我也在研究MetaWeblog API在windows mobile上的运用
    我遇到的问题是,有没有比较简单的方法,可以将服务器端返回的XML反序列化成类?
    比如我需要将metaWeblog.getRecentPosts返回的XML绑定到DataGrid上,需要对返回的XML进行解析处理。

    谢谢。

    • August 3rd, 2009 at 22:30 | #3

      比较简单的方法是:你可以将DataGrid和一个DataSet进行绑定。然后利用DataSet的ReadXML方法,将服务器返回的XML进行分析。由于DataSet是和DataGrid绑定了,因此DataSet分析出的表格将会在DataGrid中显示出来的。
      值得提醒你一句的是,无论是DataGrid还是DataSet,都是典型地对关系型表格能够很好体现的控件类。但是如文档所示,其实metaWeblog.getRecentPosts返回的并不是一个很友好的关系型表格的形式。
      因此我个人觉得,针对metaWeblog.getRecentPosts返回的XML,你可以利用Linq方便地把values那4个量的子XML节点提取出来,然后送往DataSet,这样子你应该可以得到你需要的效果。

  3. tuhu
    September 13th, 2009 at 00:53 | #4

    但是如何获取POST 过来的XMK呢,我写的总是报错bject reference not set to an instrace of an object.接收过来后如何解析,谢谢。我的邮箱是:sam-0802@163.com

    • September 13th, 2009 at 16:23 | #5

      WebRequest这个类里面有个GetRequestStream()方法就可以获取返回回来的XML(参见我日志上的最后一段代码,里面前半部分是向服务器发送命令及数据XML,中间部分是结构服务器返回的数据XML,最后部分是对返回数据XML进行简单分析来判断服务器是否支持XML-RPC;如果是返回数据XML),而返回回来的XML你可以利用Linq类很简单的进行解析。
      关于XML的解析,我的最后一段代码有写到,你可以看一下。虽然写得比较简单,但是可以起到抛砖引玉的作用。
      你提到的错误,我没法给你合理的解决方法。我并不能通过错误而想象出你的代码是如何的。
      你或者可以贴出你的部分代码给我看看~

  4. tuhu
    September 14th, 2009 at 12:57 | #6

    当我用 POST 向对方请地发送 XML-RPC 时,对方会给我一个返回值(XML-RPC),我可以用下面我方面接收:

    string url = “http://xxxxxxxxxx”;
    HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(url);
    string result = string.Empty;
    HttpWebResponse response = (HttpWebResponse)webReq.GetResponse();
    XmlDocument resultDocument = new XmlDocument();
    resultDocument.Load(response.GetResponseStream());
    result += resultDocument.SelectSingleNode(“methodResponse”.InnerText;
    resultDocument.Save(@”D:/object/webSite/Feedback/Feedback.xml”;

    但是如果是我去接收发送的XML-RPC时,用这个方法就不凑效了。而且这个方法的接收方法是固定的,只能根据URL的地址来接收,由于本人对这方面的开发不久,呵呵,还请您多多指点指点,谢谢。

    • September 15th, 2009 at 21:48 | #7

      你所说的不奏效指的是报错object reference not set to an instrace of an object,还是什么问题?
      能具体点吗?
      发代码的时候可以用pre标签将其包起来,这样就不会被转义成表情了。
      因为里面有表情,所以我只能断章取义的看了下。
      我没有用过XmlNode.SelectSingleNode这个方法,但是我查看了一下MSDN的相关文档,感觉你使用这个方法所写的参数好像有问题。
      你是否可以用pre标签把你的代码再给我看看,把你的所指的不奏效,说的清楚一点!

  1. No trackbacks yet.

:D 8) :down: 8O :!: :halo: :evil: :heart: :kiss: :lol: :money: :mrgreen: :x :| :pirate: :?: :oops: :roll: :P :( :) :o :up: :vangry: :twisted: ;) :? :cry:

也许您会觉得ReCAPTCHA验证码很繁琐,会认为他和其他所有的验证码一样让你厌烦。那请点击这里,您会了解到ReCAPTCHA为人类文化的传承做出了多大的贡献。请您也为人类知识的保存和传递也出一份力吧,谢谢!


Additional comments powered by BackType

    Posts Nav.