65.9K
CodeProject 正在变化。 阅读更多。
Home

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

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2011 年 4 月 18 日

CPL

4分钟阅读

viewsIcon

27793

downloadIcon

544

使用Windows Phone 7消费WCF服务

Article.gif

引言

我最近使用 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 个项目

  1. ActualService
  2. ActualServiceForPhone
  3. IPerson
  4. IPersonSL
  5. IPersonSLPhone
  6. ServiceHost
  7. SLClient
  8. SLClient.Web
  9. 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 日:初始发布
© . All rights reserved.