Windows Phone 7上面的通信方式和限制

最近在看WP7通信相关的内容,做个小结。

首先说说什么可以用(from Networking in Silverlight for Windows Phone):

  • WCF,也就是Windows Communication Foundation,微软力推的(把WSE拍死在沙滩上的)新一代框架,面向服务但是用起来对OOP程序员友好(不过细节上说起来就不行了,例如不能直接支持重载之类),消息基于SOAP Message。扩展性很好。后面会专门提到WP7上的WCF。
  • 大名鼎鼎的WebClientHttpWebRequest。这两个类是MS在System.Net中对于Socket的封装。
  • 上面两类通信的基本验证(Basic authentication)功能,以及设定user-agent的能力。
  • Push Notification。也是微软力推的一个服务,和Azure合体的话能做出不错的东东,例如现在Marketplace里那个”Send to WP7″程序。

你可能会问了,Socket呢?蓝牙呢?Wifi控制呢?Socket的话,微软的意思就是让你安心用WebClient去做HTTP请求吧,至于什么监听端口啊拆包啊之类就不要想了。虽然有人(搜Jeremish Morrill)Hack出了直接访问Socket的方法,但用本地代码也只能得到接口,上层封装——包括各种System.Net内的框架类(IPEndPoint之类)——都写出来工作量不会小,弄不好写完时候API已经开放(虽然去年这个时候MS就说“未来会开放”)。

而蓝牙……至少在开放的API中没有看到任何消息。现在连文件对传都不行,所以估计一时半会没法实现。最后,有关Wifi:对于一般的程序而言,网络访问是系统全局控制的,程序没有办法选择是利用蜂窝网络还是Wifi作为访问方式。不过可以得到当前的网络类型:

NetworkInterface.NetworkInterfaceType

CodeProject上有人封装了一个网络相关的类用于检测网络类型以及判断手机各种连接状态(包括Zune连接),很好用,文章和代码见Zune Detection and Network Awareness

另外,还要注意,Silverlight在WP7上和其他版本的Silverlight也有不同,例如NTLM认证、UDP多播和Silverlight的Tookit网络功能都无法使用,更多信息可以参考Differences Between Silverlight and Silverlight for Windows Phone

好了,现在来说最后一个话题,WP7上的WCF。之前在桌面平台以及Silverlight里面用过WCF的同学们要失望了:WP7上的WCF纯粹就是一充满了太监类的太监框架。先来看看我这几天在学习过程中遇到的各种不支持:

  • 不支持basicHttpBinding以外的各种内置Binding方式,同时也就是说:
  • 不支持Duplex方式访问,无法进行有session的访问以及服务器端的回调,同时也就是说:
  • 不支持PerCall之外的另两种服务实例的维护方式(PerSession, Singleton),你每一次访问服务都会创建/销毁一次Service实例(靠……)
  • 不支持自定义Binding
  • 不支持代码自定义创建Channel和Client,只能使用SLsvcutil.exe创建或者用IDE的Add Web Reference
  • 不支持basicHttpBinding的大部分属性(……),我这边试了一下,代码中只能修改MaxBufferSize和MaxReceivedMessageSize,剩下的必须在.config里面配置。

好了,这么看来,WCF在WP7上的可玩性真的不高,我能想到的就是远程控制之类的单向消息程序,顺带一提”PC Remote for WP7″和“LazyAdmin”就是基于WCF的。今天决定好好学学WCF,推荐这个教程《我的WCF之旅》和《WCF后续之旅》,作者是WCF和分布式开发的大牛,写过《WCF技术剖析》,是难得的在布教微软技术以及本身技术能力方面都强大的MS MVP。

发现这篇Blog多数都是在说“不支持”,没有办法,现状如此。但就算如此也有很多牛逼的程序被做出来,例如GoVoice和FreeTalk这两个Google Voice的客户端,还有前两天出来的那个Youtube客户端。