跨网络调用 WCF 服务






3.92/5 (9投票s)
本文介绍如何在远程计算机上调用 WCF 服务
引言
本文重点介绍如何在网络中利用 WCF 服务。调用同一台机器上的 WCF 服务非常简单,但当您想通过网络访问它时,事情会变得复杂,并且需要遵循一些步骤才能实现。
在此演示中,我还将向您展示如何传输大量数据。我不会深入探讨安全和数据传输等问题的细节。
本文的目的是让读者对调用 WCF 服务在网络上传输大量数据(考虑图像、文件等)所需的步骤有一个基本了解。
开始
需要两台机器,一台用于部署 WCF 服务,另一台作为客户端。不要忘记以管理员模式运行 Visual Studio,因为 WCF 服务的部署需要管理员权限。
第一步 – 部署 WCF 服务
如果您对 WCF 一无所知,我强烈建议您参考 MSDN 上关于 WCF 服务的文档。
创建一个新的 WCF 服务应用程序项目。
所有 WCF 服务代码都位于 IService1.cs 文件中。服务接口提供了三种方法。我使用 Byte 来展示此示例也可以用于图像。
namespace WcfService
{
[ServiceContract]
public interface IService1
{
[OperationContract]
void setValue(Byte bval);
[OperationContract]
Byte getValue(int index);
[OperationContract]
int lengthOfVal();
}
}
Service1.cs 类继承了 IService1
接口,并提供了 IService1
接口中声明的方法的关联功能。它还包含一个 static
数据成员,即字节列表。
namespace WcfService
{
[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]
public class Service1 : IService1
{
static List<Byte> byteList = new List<Byte>();
public void setValue(Byte bval)
{
byteList.Add(bval);
}
public Byte getValue(int index)
{
return byteList[index];
}
public int lengthOfVal()
{
return byteList.Count;
}
}
}
如您所见,我使用了 AddressFilterMode
,它用于将传入的消息路由到正确的终结点。如果您遇到以下错误,通常会使用此项:
The message with To 'http://……./Service1.svc' cannot be processed at the receiver,
due to an AddressFilter mismatch at the EndpointDispatcher.
Check that the sender and receiver's EndpointAddresses agree.
Web.config 文件是 WCF 服务应用程序的主要设置和配置文件。如您所见,我使用了 <service>
标签,它指定了 WcfService
应用程序,该应用程序具有 <endpoint>
标签,这是与服务建立连接点所必需的。
出于演示目的,我使用了 basicHttpBinding
而不是 wsHttpBinding
。 Basichttpbinding
提供的安全选项比 wsHttpBinding
少,因此不推荐使用。有关 WCF 中绑定的更多信息,请参阅 MSDN。
<baseAddress>
标签指定了 WCF 服务的位置。在 localhost 的位置使用您要在其上部署此服务的计算机的 IP 地址。还需要 <behaviors>
标签,它描述了 <serviceBehavior>
。
<?xml version="1.0"?>
<configuration>
<system.serviceModel>
<services>
<service name="WcfService.Service1" behaviorConfiguration="serviceBehavior">
<endpoint address="" binding="basicHttpBinding" contract="WcfService.IService1"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
<host>
<baseAddresses>
<add baseAddress="http://{Enter IP Address}/WcfService/Service1.svc"/>
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="serviceBehavior">
<serviceMetadata httpGetEnabled="True"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
<system.webServer>
<directoryBrowse enabled="true"/>
</system.webServer>
<system.web>
<compilation debug="true"/>
</system.web>
</configuration>
确保您的系统已安装 IIS。如果没有,请转到“程序”、“打开或关闭 Windows 功能”,然后选择 IIS 来安装 IIS 的所有功能。另外,请确保您在“打开或关闭 Windows 功能”中选择 Microsoft .NET Framework,以启用 HTTP 功能。
尽管如此,IIS 仍未完全安装,如果您尝试使用 IIS 部署任何服务,它将不会成功并显示以下错误:

为此,请以管理员身份运行命令提示符。转到 C:\Windows\Microsoft.NET\Framework64\v4.0\(v4.0 或您机器上安装的任何版本),然后运行命令“aspnet_regiis.exe –i
”。这将成功安装 ASP.NET,您现在可以部署服务了。
现在右键单击您的项目,然后转到“属性”,再单击“Web”。选择“使用本地 IIS Web 服务器”,然后单击“创建虚拟目录”按钮。
现在尝试运行项目,看看浏览器是否打开并显示已部署的 WCF 服务,客户端已准备好使用。关闭部署了服务的计算机上的防火墙(不推荐,仅为演示目的,因此请使用其他类型的绑定)。
第二步 – 通过远程客户端调用 WCF 服务
您可以部署多个客户端并使用它们来访问 WCF 服务。但是,这涉及到线程和同步问题,因为在一般情况下,多个客户端会访问相同的服务功能。
在这里,我使用了两个客户端,它们分别访问 get
和 set
功能,并且都部署在同一台机器上。
创建一个新的 C# 控制台应用程序。右键单击项目,然后单击“添加服务引用”。在“地址”文本框中,输入 WcfService
的地址。(例如:http://{IP 地址}/WcfService/Service1.svc?wsdl)。这将向客户端项目添加 app.config 文件。
生成代理需要两个文件。服务实用工具用于生成这些代理。它通常位于 C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin。运行以下命令生成代理文件:
Svcutil.exe http://{IP Address}/WcfService/Service1.svc?wsdl
这将创建两个文件:Service1.cs 和 output.config。将 output.config 文件中的内容复制到 app.config 文件中,并将 Service1.cs 文件添加到客户端项目中。现在您的客户端已准备好与 Web 服务进行通信。
WcfClient
项目用于设置 WcfService
的数据成员。
namespace WcfClient
{
class Program
{
static void Main(string[] args)
{
Service1Client client = new Service1Client();
client.Open();
for (long i = 0; i < 20000; ++i)
{
client.setValue((Byte)i);
}
client.Close();
Console.WriteLine("Press Enter");
Console.Read();
}
}
}
创建一个客户端并使用 setter 方法来设置服务上的字节列表数据成员。我在这里传输 20 KB 的数据到服务。一般的 PNG 图像约为 200 KB。您可以逐字节传输到服务,从而可以将整个文件传输到服务器。
运行项目直到数据完全传输到服务。
现在,通过在同一项目中选择“新建 C# 控制台应用程序”来创建另一个客户端。WcfClientRead
用于访问服务上的数据。将这两个代理文件添加到此项目中,就像在 WcfClient
中一样。
namespace WcfClientRead
{
class Program
{
static void Main(string[] args)
{
Service1Client client = new Service1Client();
int length = client.lengthOfVal();
for (int i = 0; i < length; ++i)
{
Console.WriteLine(client.getValue(i));
}
client.Close();
Console.WriteLine("Press Enter");
Console.Read();
}
}
}
这将把字节列表数据成员的值打印到控制台。
结论
因此,您看到了远程客户端如何能够跨网络访问 WCF 服务。需要记住的基本要点是使用正确的绑定、Web.config 文件中的服务行为,并确保 IIS 在计算机上正确安装。
历史
- 2011 年 5 月 14 日:首次发布