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

Windows Communcation Foundation - 简单示例,一步一步

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.61/5 (16投票s)

2009年2月20日

CPOL

4分钟阅读

viewsIcon

67511

downloadIcon

1248

本文演示了一个使用 Windows Communication Foundation (WCF) 的非常基本的客户端/服务器设计示例,可以说最简单的例子。

引言

Windows Communication Foundation (WCF) 是 .NET Framework 3.* 的一个组成部分。它增强了开发人员构建分布式应用程序和服务的生产力。WCF 最好的部分是底层机制和服务功能是松散耦合的,因此可以配置单个服务通过不同的协议或机制使用。WCF 统一了早期技术,如 WSE、Remoting、ASMX 和 MSMQ 等。因此,开发人员不需要使用不同的技术,而只需使用一个编程模型。

本文演示了一个使用 Windows Communication Foundation (WCF) 的非常基本的客户端/服务器设计示例,或者更确切地说,是最简单的例子。首先,我们将讨论如何从头开始制作 WCF 服务并将其托管在应用程序中,然后我们将创建一个客户端(使用者),它调用服务方法。所以,让我们开始吧。

先决条件

您需要的第一件事是 .NET framework 3.*,特别是 3.5 SP1,您可以从 Microsoft 下载中心下载。好的,接下来是 IDE。如果您没有 Visual Studio,可以使用免费下载和使用的 express edition(s)。特别是,我刚刚下载了 Visual C# 2008 Express Edition,这看起来很酷。

vcsharpIDE.JPG

准备,开始!

服务 (服务器端)

首先,我们需要创建一个服务,为此,我将创建一个新项目,即名为 RegistrationService 的类库,如下所示。我们没有使用 Visual Studio 2008 中可用的 WCF 服务模板,因此我们可以看到 WCF 项目所需的程序集,并从头开始进行。

projectType.PNG

现在我们需要添加一个引用,System.ServiceModel,这是 WCF 所需的主要 DLL。

reference.JPG

接下来我们需要创建一个服务契约。现在,将契约视为将要公开的服务的接口。该接口需要在其上有一些必要的属性,如下所示

[ServiceContract(Namespace="http://adil.com/RegistrationService/2009")]
public interface IRegistrationService
{
    [OperationContract]
    string RegisterName(string name);
}

请注意,该接口具有 ServiceContractAttribute ,它是强制性的,并指示接口定义了 WCF 应用程序中的服务契约。namespace 参数是可选的,用于定义服务的唯一命名空间,默认设置为 http://tempuri.org。另请注意,OperationContractAttribute 标记在需要向客户端公开的方法上。ServiceContractAttribute 也可以应用于类,但最好使用单独的接口作为契约。

接下来,我们将添加一个名为 RegistrationService.cs 的类,它将实现此接口。

public class  RegistrationService: IRegistrationService
{
    public string RegisterName(string name)
    {
        return string.Format("Registered Name : " + name);
    }
}

好的,到目前为止,我们的服务已经准备好了。我们有一个要公开的契约,并且我们有一个实现该契约的类。现在我们需要一个宿主应用程序(可执行文件)。每个服务都需要托管在 IIS 或 WinApp 或 Window Service 等上。所以,对于这个例子,我们将创建一个控制台应用程序来托管我们的注册服务。

serviceHost.JPG

此外,您还需要将 System.ServiceModel 引用添加到此宿主(可执行)应用程序中。宿主应用程序需要定义 WCF 的 ABC,即

  • A-> 地址 (服务将托管的地址)
  • B-> 绑定 (现在,将其视为底层协议,如 HTTP、TCP 等)
  • C-> 契约 (服务的接口)

我们将创建一个 Host 类来托管此 RegistrationService。

public class Host
{
    ServiceHost host;
    public void StartService()
    {
        try

        {
            host = new ServiceHost(typeof(RegistrationService));
            host.AddServiceEndpoint(typeof(IRegistrationService),
                new BasicHttpBinding(),
                "https://:8000/RegistrationService");
            host.Open();
            Console.WriteLine("Service Started Successfully");
            Console.ReadLine();
        }
        catch (System.Exception exception)
        {
            Console.WriteLine("Unable to start service \n " + exception.Message);
        }
    }
    public void StopService()
    {
        if (host != null)
            host.Close();
    }
}

请注意,该行

host.AddServiceEndpoint(typeof(IRegistrationService),
    new BasicHttpBinding(),
    "https://:8000/RegistrationService");

基本上添加了一个端点,服务将托管在该端点,定义了契约类型,即 IRegistrationService、底层协议,即 BasicHttpBinding 和地址。让我们按 F5 并运行它。

serviceStarted.JPG

这就是关于服务的全部内容。

客户端

客户端需要服务的代理,通常是服务的 ABC。对于代理,我们将在客户端复制服务的契约,并使用 WCF 的 ChannelFactory 类创建代理。此外,将契约类型、绑定和端点地址传递给 ChannelFactory 构造函数。请考虑下面的代码片段

[ServiceContract(Namespace = "http://adil.com/RegistrationService/2009")]
public interface IRegistrationService
{
    [OperationContract]
    string RegisterName(string name);
}

class Program
{
    static void Main(string[] args)
    {
        IRegistrationService proxy = ChannelFactory<IRegistrationService>.CreateChannel
            (new BasicHttpBinding(), new EndpointAddress(
                "https://:8000/RegistrationService"));
        Console.WriteLine("\nCalling Service...\n");
        Console.WriteLine(proxy.RegisterName("Adil"));

        Console.ReadLine();

    }
}

就是这样。让我们按 F5,

callingRegService.JPG

结论

我们刚刚使用 WCF 创建了一个简单的客户端/服务器应用程序。请注意,这是一个非常简单的示例,其中客户端和服务器都知道地址、契约和绑定。在实际场景中,服务信息使用 WSDL(Web 服务描述语言)向客户端公开。

© . All rights reserved.