使用Windows Phone 7消费主机WCF服务
使用Windows Phone 7消费WCF服务

引言
我最近使用 Windows Phone 7 创建了一个简单的测试应用/演示,用于消费托管在控制台中的 WCF 服务。互联网上有很多关于这个主题的优秀教程/文档。
所有这些教程都很好地解释了如何以及如何从 Windows Phone 7 平台消费 WCF 服务。通常的技术是,在消费这些 WCF 服务时,我们必须对实际的 WCF 服务进行“服务引用”,该服务可以托管在 IIS 中或公开 wsdl,即服务可以在浏览器中看到。
但是对于控制台托管的 WCF 服务呢?哎呀,那就不行了,因为我们无法直接添加“服务引用”,因为我们无法直接访问这些服务,因为它们根本无法访问。那么,也许我们可以想出一个类似 Silverlight 项目通过 ChannelFactory
消费服务并以这种方式创建代理的方法,所以我尝试了一下,结果抛出了“NotSupportException
”。啊……又撞墙了,像世界上所有的开发者一样固执,我认为一定有办法,只是不知道如何实现,所以,搜索就开始了……
于是我又在网上上下搜索,但一无所获,有一份文档说你需要实现 Clientbase<TChannel>
接口和 IChannel
等。但由于我不太热衷于做所有这些繁琐的工作,我戴上了思考帽,当然也喝了咖啡。
然后,在咖啡因的帮助下,如果我无法为这些服务添加“服务引用”,为什么我不为新创建的 WCF 服务添加“服务引用”呢?我确定我可以轻松地做到这一点,然后这个新创建的服务指向托管在控制台应用程序中的现有 WCF 服务,瞧,它成功了!
所以为了节省我 fellow 开发者的时间,我认为我必须分享它,这就是它。
背景
系统要求:.NET Framework 4.0 VS 2010 和 Windows Phone 7 SDK。
为了演示这一点,我创建了以下内容。
项目
解决方案中总共有 9 个项目
ActualService
ActualServiceForPhone
IPerson
IPersonSL
IPersonSLPhone
ServiceHost
SLClient
SLClient.Web
SLPhoneClient
在我解释每个项目的作用之前,请记住,这篇文章不是关于编码,而是关于通过新服务作为桥梁来绕过消费现有 WCF 服务的技巧或技术。
ActualService
这是实际的服务,它包含了 Person
对象接口的实际实现。
public class Service1 : IService1, IServicePolicy
{
...
}
ActualServiceForPhone
这是 Windows Phone 7 调用底层 WCF 服务“ActualService
”的实际桥接服务。
IPerson
接口类用于服务和客户端,即此接口用于服务级别的实现,并在客户端用作类型定义。
[ServiceContract]
public interface IService1 { ... }
[ServiceContract(Name = "IService1")]
public interface IService1Async { ... }
[DataContract]
public class Person {
[DataMember] ...
}
IPersonSL 和 IPersonSLPhone
这两个类库都与 IPerson
完全相同,根据要求,每种项目类型都需要自己的类库,这意味着 Silverlight 项目需要 Silverlight 类库,Windows Phone 7 则需要自己的类库类型,因此需要这两种类型。请注意,库文件实际上是对 Person.cs 的链接,而不是精确的副本,因为这可以节省更新/维护期间的时间。SL-silverlight,SLPhone-silverlight Windows Phone 7。
ServiceHost
这是我的 WCF 服务的控制台主机。
using (ServiceHost host = new ServiceHost(typeof(Service1),
new Uri[]{ new Uri("https://:60011", UriKind.Absolute) }))
{
...
host.Open();
Console.ReadLine();
host.Close();
...
}
SLClient 和 SLClient.Web
这两个项目是 Silverlight 4.0 的默认模板项目,其中 SLClient
仅包含一个按钮和一个网格,用于反映来自 ActualService
WCF 服务的数据。
SLPhoneClient
这是 Windows Phone 7 Silverlight 项目。选择标准的 Silverlight 应用程序创建模板。此项目还包含一个按钮和一个列表框,用于显示来自 ActualServiceForPhone
的数据。
运行项目
- 下载附加的解决方案 zip 文件。
- 启动 VS 2010 并打开解决方案文件,然后编译所有项目。
- 在控制台以管理员权限启动 ServiceHost(以管理员模式启动 cmd)。
- 将
ActualServiceForPhone
设置为“启动项目”,然后按 F5(要确保服务正在运行,请记住检查端口号)。 - 运行
SLClient
(将“启动项目”切换到此项目,然后按 F5)。 - 同样,要测试 Windows Phone 7,请将
SLPhoneClient
设置为“启动项目”,然后按 F5。
希望大家喜欢这篇文章。编程愉快。
历史
- 2011 年 4 月 18 日:初始发布