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






4.61/5 (16投票s)
本文演示了一个使用 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,这看起来很酷。
准备,开始!
服务 (服务器端)
首先,我们需要创建一个服务,为此,我将创建一个新项目,即名为 RegistrationService
的类库,如下所示。我们没有使用 Visual Studio 2008 中可用的 WCF 服务模板,因此我们可以看到 WCF 项目所需的程序集,并从头开始进行。
现在我们需要添加一个引用,System.ServiceModel
,这是 WCF 所需的主要 DLL。
接下来我们需要创建一个服务契约。现在,将契约视为将要公开的服务的接口。该接口需要在其上有一些必要的属性,如下所示
[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 等上。所以,对于这个例子,我们将创建一个控制台应用程序来托管我们的注册服务。
此外,您还需要将 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 并运行它。
这就是关于服务的全部内容。
客户端
客户端需要服务的代理,通常是服务的 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,
结论
我们刚刚使用 WCF 创建了一个简单的客户端/服务器应用程序。请注意,这是一个非常简单的示例,其中客户端和服务器都知道地址、契约和绑定。在实际场景中,服务信息使用 WSDL(Web 服务描述语言)向客户端公开。