Windows Communication Foundation (WCF) 是一个用于构建服务式应用程序的框架。使用 WCF,您可以创建用于异步数据交换的服务与客户端,这些服务与客户端可以跨不同的传输协议(如 HTTP, TCP, etc.)和消息格式(如 XML 或 JSON 等)进行通信。
我们来探讨如何使用 WCF 生成一个具有自托管服务的 EXE 应用程序。在本示例中,我们将创建一个简单的服务和客户端,服务和客户端分别用于计算两个整数的和。
**定义 WCF 服务**
1. 打开 Visual Studio,创建一个新的 WCF 项目(基于 .NET Framework)。
2. 在项目中,找到 IService1.cs 文件,重命名为 ICalculatorService.cs。
3. 修改 ICalculatorService.cs,定义您的服务接口,如下所示:
```csharp
using System.ServiceModel;
namespace WcfServiceApplication
{
[ServiceContract]
public interface ICalculatorService
{
[OperationContract]
int Sum(int num1, int num2);
}
}
```
**实现服务**
1. 在项目中,找到 Service1.cs 文件,重命名为 CalculatorService.cs。
2. 修改 CalculatorService.cs,实现 ICalculatorService 接口,如下所示:
```csharp
namespace WcfServiceApplication
{
public class CalculatorService : ICalculatorService
{
public int Sum(int num1, int num2) => num1 + num2;
}
}
```
**创建自托管服务**
1. 在项目中,找到 Program.cs 文件。
2. 修改 Program.cs,通过命名空间 System.ServiceModel 和 System.ServiceModel.Description 引用生成 WCF 服务,并添加以下代码:
```csharp
using System;
using System.ServiceModel;
using System.ServiceModel.Description;
using WcfServiceApplication;
namespace WcfServiceApplication
{
class Program
{
static void Main(string[] args)
{
// 创建一个基于 TCP 绑定的地址
Uri uri = new Uri("net.tcp://localhost:8000/CalculatorService");
ServiceHost host = new ServiceHost(typeof(CalculatorService), uri);
try
{
// 创建终结点
host.AddServiceEndpoint(typeof(ICalculatorService), new NetTcpBinding(), uri);
// 启用元数据交换
ServiceMetadataBehavior metadataBehavior = new ServiceMetadataBehavior();
host.Description.Behaviors.Add(metadataBehavior);
host.AddServiceEndpoint(
typeof(IMetadataExchange),
MetadataExchangeBindings.CreateMexTcpBinding(),
"mex"
);
// 开始托管服务
host.Open();
Console.WriteLine("Service is running.");
// 延迟关闭服务
Console.ReadLine();
host.Close();
}
catch (CommunicationException ex)
{
Console.WriteLine("There was an exception: {0}", ex.Message);
host.Abort();
}
}
}
}
```
3. 改变项目类型为 Console Application。在项目属性(Project > Properties)中选择 "Output Type" 为 "Console Application"。
现在,如果您运行此项目,它将创建并托管一个WCF服务并开始监听在本地 TCP 端口 8000。
为了创建一个客户端来与上述服务进行通信,您将需要生成一个代理类。这可以通过在项目中添加服务引用或使用 SvcUtil.exe 工具来完成,然后在客户端应用程序中使用代理类调用服务端的方法。