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

跨网络调用 WCF 服务

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.92/5 (9投票s)

2011年5月14日

CPOL

5分钟阅读

viewsIcon

98867

downloadIcon

5248

本文介绍如何在远程计算机上调用 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.csoutput.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 日:首次发布
跨网络调用 WCF 服务 - CodeProject - 代码之家
© . All rights reserved.