浏览模式: 标准 | 列表

SilverLight 2.0、异步调用和泛型支持是 PHPRPC 3.0.1 for .NET 中增加的新特征,下面我们通过一个小程序来演示一下这三个特征。首先 SilverLight 2.0 程序的建立我就不详细说明了,我用的是 Microsoft Expression Blend 2 + Microsoft Visual Web Developer 2008 Express Edition +Microsoft Silverlight 2 SDK。这个演示程序很简单,首先建立一个 SilverLight 2.0 程序,然后拖一个文本块和一个按钮到界面上,然后进入代码编辑区,下面是程序的主要代码:

 

C#代码
  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 org.phprpc;  
  13. using org.phprpc.util;  
  14.   
  15. namespace SilverlightPHPRPCExample  
  16. {  
  17.     public interface ITest  
  18.     {  
  19.         void hi(string name, PHPRPC_Callback callback);  
  20.         void hi(string name, PHPRPC_Callback<String> callback);  
  21.         void array_sort(List<int> list, PHPRPC_Callback<List<int>> callback);  
  22.     }  
  23.     public partial class Page : UserControl  
  24.     {  
  25.         PHPRPC_Client client;  
  26.         ITest it;  
  27.         public Page()  
  28.         {  
  29.             InitializeComponent();  
  30.             client = new PHPRPC_Client();  
  31.             it = (ITest)client.UseService("http://localhost/server.php"typeof(ITest));  
  32.         }  
  33.         private void callback1(Object result, Object[] args, String output, PHPRPC_Error warning) {  
  34.             textBlock.Text += "\r\n" + PHPConvert.ToString(result);  
  35.         }  
  36.         private void callback2(String result, Object[] args, String output, PHPRPC_Error warning) {  
  37.             textBlock.Text += "\r\n" + result + " 泛型";  
  38.         }  
  39.         private void callback3(List<int> result, Object[] args, String output, PHPRPC_Error warning) {  
  40.             foreach (int i in result) {  
  41.                 textBlock.Text += "\r\n" + i.ToString();  
  42.             }  
  43.         }  
  44.         private void Button_Click(object sender, System.Windows.RoutedEventArgs e)  
  45.         {  
  46.             client.KeyLength = 256;  
  47.             client.EncryptMode = 1;  
  48.             it.hi("Ma Bingyao"new PHPRPC_Callback(callback1));  
  49.             it.hi("马秉尧", callback2);  
  50.             List<int> list = new List<int>(10);  
  51.             Random r = new Random();  
  52.             for (int i = 0; i < 10; i++) {  
  53.                 list.Add(r.Next());  
  54.             }  
  55.             it.array_sort(list, callback3);  
  56.         }  
  57.     }  
  58. }  

这里面 hi,array_soft 都是用 PHP 发布的 PHPRPC 方法,因为很简单,大家不看也都能看懂这个程序的意思,所以 PHP 部分的具体代码我就不写了。

首先来说一下异步调用,异步调用的接口方法最后有一个 PHPRPC_Callback 类型的参数,而且这个 PHPRPC_Callback 类型还可以是泛型化的。PHPRPC_Callback 实际上是一个委托类型。该委托类型中,第一个参数是表示返回结果,第二个参数表示传递的参数,第三个参数表示服务器端重定向输出的字符串,第四个参数表示 服务器端产生的警告错误。如果使用的是非泛型化的 PHPRPC_Callback 委托,则返回结果以 Object 类型返回,如果要转换为你需要的类型,需要自己调用 PHPConvert 类中的类型转换方法,如果发生调用发生错误,则返回结果就是 PHPRPC_Error 类型的一个错误对象。如果使用泛型化的 PHPRPC_Callback 委托,则返回结果可以直接转换为第一个参数所指定的类型,不需要自己使用 PHPConvert 来进行转换了。但如果调用发生错误,则会抛出 PHPRPC_Error 类型的异常,而不是作为第一个参数传递给回调方法。

不论是调用的参数,还是返回结果都可以是泛型容器类型,当然现在支持的泛型容器类型只有 List<T> 和 Dictionary<K,V>,不过对于大多数应用来说已经足够了。

最后要说明的是,在 SilverLight 2.0 中只能使用异步调用,不能使用同步调用。但是在 ASP.NET 或者WinForm 程序中(.NET 2.0 及其以上版本),既可以使用异步调用,也可以使用同步调用,而且即使同时使用也不会有冲突。当然,在 WinForm 程序中推荐使用异步调用,这样可以避免远程调用造成界面卡死的现象,而在 ASP.NET 中则推荐使用同步调用,这样可以保证调用在页面执行完之前结束。

» 阅读全文

12月
20

PHPRPC 3.0.1 for .NET 发布

该版本是一个大的升级,修正了动态代理类在某些情况下不稳定的问题,服务器增加了对 P3P 的支持。对于 .NET 2.0 (包括 Mono2)以上版本增加了泛型容器(List<T>,Dictionary<K,V>)的传输支持,增加了通过回调方法来进行异步调用的支持。该版本最大的更新是增加了对 SilverLight 2 的完美支持。

下载地址:http://www.phprpc.org/download/

» 阅读全文

昨天晚上终于把 Silverlight 2 的开发工具下载完了,装好之后打算测试一下 PHPRPC for .NET 客户端是否可以在 Silverlight 2 上运行,因为原来的 PHPRPC for JavaScript 可以很好的在 Silverlight 1 上运行,本以为 PHPRPC for .NET 也应该很顺利的在 Silverlight 2 上运行,可是测试之后才发现完全不是那么回事。通过查看 MSDN,才知道 Silverlight 2 支持的 .NET 框架也是一个精简的框架,而这个精简的框架不但不同于 .NET Framework,而且也不同于 .NET Compact Framework. 这里主要说一下常用的一些不同之处:

Silverlight 2 将 System.Collections 名空间中的大部分容器类都拿掉了,比如 ArrayList、Hashtable 等这些常用的容器现在都不可以再用了。取而代之的是 System.Collections.Generic 名空间中的那些泛型容器类。看来 Silverlight 2 是打算要强制用户使用泛型类了。

Silverlight 2 中的 System.Net.HttpWebRequest 只支持异步操作,而不再支持同步操作了,看来是害怕用户使用同步操作将浏览器卡死,就直接干掉同步操作了。不过 Silverlight 2 是支持多线程的,在单独的线程中做同步调用应该是不会卡死浏览器的。所以感觉 Silverlight 2 将 System.Net.HttpWebRequest 的同步操作干掉是多此一举。

Silverlight 2 中的 System.Net.HttpWebRequest 和 System.Net.HttpWebResponse 支持的属性明显减少了。尤其是 System.Net.HttpWebResponse, 连 Headers 属性都没有了。所以根本就没有办法操作服务器端返回的特殊头信息了。我想这应该是为安全考虑才这样做的吧。另外,也没法操作 Cookie,但愿这两个类能够自动处理 Cookie 吧,如果不支持 Cookie 的话,那可就太糟糕了。

Silverlight 2 支持 System.Reflection.Emit,而 .NET Compact Framework 不支持。这是比较好的一点,因为有了 System.Reflection.Emit 之后,就可以动态创建类型,这对于实现远程调用来说就方便很多了。

当然还有许多其他的一些不同点,但我暂时还没接触到,这里就不说了。

没办法,如果想让 PHPRPC for .NET 支持 Silverlight 2 的话,看来只能改代码了。自己实现
ArrayList、Hashtable 这两个容器,还要增加异步调用的支持,这些改动还真不小呢。

» 阅读全文