在Windows Mobile 6上调用WCF访问PC上的服务(转)
.NET Compact Framework 3.5 默认不支持 WCF 服务模型(此模型可支持托管和调用服务,而无需发送和接收消息的所有探测代码)。但是借助正确的帮助器类,在 ASP.NET Web 服务、WCF 服务及其他 WSDL 兼容服务中使用 Compact WCF 来调用 WebMethods 像调用任何方法一样,都非常容易。
.NET Compact Framework 3.5 PowerToys 附带了一个名为 NetCFSvcUtil.exe 的工具,可以为您生成这些服务代理类。由于 NetCFSvcUtil.exe 没有包括在 Visual Studio 2008 中,因此您需要自行下载 Power Toys for .NET Compact Framework 3.5,网址为 msdn2.microsoft.com/aa497280。
因为 .NET Compact Framework 3.5 附带了可在桌面中找到 WCF 的绑定子集,所以服务必须提供一个使用 .NET Compact Framework 所支持的绑定的端点。您也可以使用 Compact WCF 编写自己的绑定,但这已超出了本文的范围。
现在让我们在桌面上构建一个 .NET Compact Framework 兼容的 WCF 服务,然后编写一个应用程序,使用 NetCFSvcUtil.exe 所生成的代理类来调入该服务。对于服务应用程序,在 Visual Studio 2008 中创建一个新的 WCF 服务网站,并确保“New Web Site”(新网站)对话框右上角的 .NET Framework 3.5 被选中。为简便起见,我们继续执行操作并接受 Visual Studio 2008 模板给出的 WCF 服务而不做任何改动。它会给出自动创建的 GetData 和 GetDataUsingDataContract 方法。
由于 .NET Compact Framework 3.5 不支持 wsHttpBinding,因此需要将 Visual Studio 创建的默认端点改为 basicHttpBinding 或为该类型添加一个新端点。由于利用 WCF 可以很方便地提供多个端点,而且 wsHttpBinding 为那些支持它的应用程序提高了安全性,因此我们将保留它不动并添加一个使用 basicHttpBinding 的新端点。
打开 WCF 服务的 web.config 文件。找到 <endpoint> 标记并添加一个新行,其中包括 basic 地址和 basicHttppBinding 绑定:
在“Solution Explorer”(解决方案资源管理器)中,右键单击 Web 项目的 Service.svc 项目项,然后在“Browser”(浏览器)中单击“View”(查看)来检查您的服务。
<!-- Service Endpoints --> <endpoint address="" binding="wsHttpBinding" contract="IService"/> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> <endpoint address="basic" binding="basicHttpBinding" contract="IService"/>
请注意,BasicHttpBinding 引入了一些对服务功能的限制。例如,它不支持双向服务契约、事务处理和回调。如果试图使用 BasicHttpBinding 端点来提供使用其中任何功能(或一些其他功能)的服务,会收到从 WCF 发出的运行时错误。
在您的服务中还有一个限制,它所带来的局限性要超过只使用 BasicHttpBinding 带来的局限性:即 NetCFSvcUtil.exe 不支持自定义标头。如果服务需要在消息中包括自定义标头,则需要修改由工具生成的代码或编写自己的代理类来添加对这些自定义标头的支持。
现在将一个 .NET Compact Framework 应用程序添加到您的解决方案中。使用“智能设备项目”模板创建一个新项目并将其命名为 NetCFClient。将下列 Compact WCF 程序集添加到您的项目引用中:System.ServiceModel.dll 和 System.Runtime.Serialization.dll。然后在 Form1.cs 设计图面中添加一个按钮,并将其标题设置为 "Call Service"。双击此按钮,创建一个事件处理程序。现在只需要一个代理类即可调用服务。
创建代理类
针对该服务运行 NetCFSvcUtil.exe 工具,生成要包括在设备项目中的代理类(参见图 9)。如果要使生成的源文件进入设备应用程序的源目录,可在此处运行此工具。此工具(在安装后)位于 %PROGRAMFILES%\Microsoft .NET\SDK\CompactFramework\v3.5\bin 目录下,但如果是在 64 位的机器上运行,则查看 Program Files (x86) 目录。
Figure 9 生成代理类
C:\demos\MsdnCFServiceSample\NetCFClient>"\Program Files (x86)\Microsoft .NET\SDK\CompactFramework\v3.5\bin\NetCFSvcUtil.exe"
http://localhost:53222/Service/Service.svc?wsdl
Microsoft (R) .NET Compact Framework Service Model Metadata Tool
[Microsoft (R) Windows (R) Communication Foundation, Version 3.5.0.0]
Copyright (c) Microsoft Corporation. All rights reserved.
Attempting to download metadata from 'http://localhost:53222/Service/Service.svc?wsdl' using WS-Metadata Exchange or DISCO.
Generating files...
C:\demos\MsdnCFServiceSample\NetCFClient\Service.cs
C:\demos\MsdnCFServiceSample\NetCFClient\CFClientBase.cs
C:\demos\MsdnCFServiceSample\NetCFClient>
|
要运行此工具,只需将 URL 传入服务元数据即可(服务必须正在运行)。如果希望此工具生成 Visual Basic® 项目的代理类,可添加 /language:vb。请注意,在命令行传递给此工具的 URL 将作为设备用来联系服务的 URL,因此 http://localhost 可能会生成代理,但设备应用程序会尝试与其自身进行对话而不是联系台式计算机。
还要注意,此工具不会像桌面 svcutil.exe 工具那样生成 output.config 文件。.NET Compact Framework 3.5 不支持通过配置文件对 WCF 进行配置,因此服务的所有端点信息都需要在代码中。ASP.NET 开发服务器不会响应任何设备请求,除非设备或仿真器已插入。我在这里执行的操作是使用 localhost 来生成代理,然后查找在 ServiceClient 类中定义的 EndpointAddress 字段并将 URL 改为使用我的主机名(服务地址)而不是本地主机,以此来修改生成的 Service.cs 文件。代码看上去应类似于:
public static System.ServiceModel.EndpointAddress EndpointAddress =
new System.ServiceModel.EndpointAddress(
"http://mycomputername:53222/Service/Service.svc/
basic");
|
此外,还要注意 URL 的 /basic 后缀。客户端将通过这种方式来指明在所提供的三个端点中该服务要使用哪一个。生成了代理类源文件后,只需在 Visual Studio 中将其添加到设备项目中即可。
使用 WCF 服务
在前面您已经为单个的“调用服务”按钮创建了一个事件处理程序。现在让我们来实现它。该代码看上去类似于从 WCF 桌面应用程序调用 WCF 服务:
void callServiceButton_Click(object sender, EventArgs e) {
ServiceClient client = new ServiceClient();
MessageBox.Show(client.GetData(5));
}
|
部署并运行设备应用程序。单击“调用服务”按钮。片刻后会弹出一个消息框,其中显示“You entered:5”(参见图 10)。
图 10 利用 WCF 服务运行应用程序
如果收到错误消息提示无法访问主机,请尝试插入设备。如果您的设备是仿真器,可在 Visual Studio 中通过“设备仿真器管理器”来插入它。
此工具生成的代理类将方法调用转换到 WCF 消息中,然后使用 .NET Compact Framework 消息传送层进行发送。响应消息随后被反序列化并通过该方法的返回值传回应用程序。
NetCFSvcUtil 工具生成的代码与在完整版本的 WCF 下生成的代码一样,都可以正常运行,此时从 WCF 类衍生的代理类被称为 ClientBase<T>。由于 .NET Compact Framework 3.5 没有附带 ClientBase<T>,因此 NetCFSvcUtil 工具会为必须包括在应用程序中的 CFClientBase<T> 生成代码。尽管此类与在桌面 WCF 中找到的 ClientBase<T> 类所执行的函数相似,但是它们并不完全相同,在将来的版本中可能会改动。
浙公网安备 33010602011771号