WCF(Windows Communication Foundation)是一种在Windows操作系统上实现分布式系统之间通信的技术,是微软推荐的一种服务导向架构(SOA)框架。下面是WCF入门需要掌握的基础知识的完整攻略:
WCF概述
WCF是一种基于消息传输的通信框架,它可以跨越多个计算机、多个操作系统和多个应用程序域进行通信。WCF的核心是服务(Service),WCF服务是运行在WCF宿主中的可执行程序,它们可以实现不同的通信模型,如单向通信、双向通信和回调等。WCF服务可以通过多种协议实现通信,如HTTP、TCP、MSMQ等。
WCF服务模型
WCF服务模型通过一系列公约来描述服务的协定(Contract)、行为(Behavior)和终结点(Endpoint)。服务协定定义了服务的接口和操作,服务行为定义了服务的行为方式,终结点定义了服务在何处可以访问和响应请求。
WCF服务开发
WCF服务开发包括以下步骤:
1. 定义服务协定
2. 实现服务协定
3. 配置服务的终结点
4. 创建WCF服务宿主
WCF服务协定
服务协定是WCF服务的核心,服务协定是一个接口,定义了服务的操作。服务协定分为服务契约和数据契约两种。
服务契约定义了服务的操作方法和参数,通常使用[OperationContract]特性进行标识。
[ServiceContract]
public interface ICalculator
{
[OperationContract]
double Add(double x, double y);
}
数据契约定义了服务操作需要传递的数据类型,通常使用[DataContract]特性进行标识。
[DataContract]
public class Person
{
[DataMember]
public string Name { get; set; }
[DataMember]
public int Age { get; set; }
}
WCF服务实现
服务实现是服务契约的具体实现,服务实现类需要实现服务契约中定义的操作。服务实现类通常使用[ServiceBehavior]特性进行标识,[ServiceBehavior]特性可以添加一些服务行为,如实例管理方式、并发模式等。
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class CalculatorService : ICalculator
{
public double Add(double x, double y)
{
return x + y;
}
}
配置WCF服务终结点
WCF服务终结点是指服务在何处可以被访问以及如何访问服务。WCF服务终结点的配置可以在web.config或app.config文件中完成。
<system.serviceModel>
<services>
<service name="ExampleService">
<endpoint address="http://localhost:8000/example"
binding="basicHttpBinding"
contract="IExampleService" />
</service>
</services>
</system.serviceModel>
上面的配置表示了一个基于HTTP协议、绑定类型为basicHttpBinding的终结点,该终结点的地址为http://localhost:8000/example,该终结点实现的服务契约为IExampleService。
创建WCF服务宿主
WCF服务宿主用于运行WCF服务。WCF服务宿主可以是一个控制台应用程序、Windows服务、IIS应用程序池等。以下为一个简单的控制台应用程序宿主:
using (ServiceHost host = new ServiceHost(typeof(CalculatorService)))
{
host.Open();
Console.WriteLine("Service is running ...");
Console.ReadKey();
}
示例说明1
以下为一个简单的WCF服务示例,该服务实现了一个简单的计算功能,支持计算两个数的加法。
服务契约:
[ServiceContract]
public interface ICalculator
{
[OperationContract]
double Add(double x, double y);
}
服务实现:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class CalculatorService : ICalculator
{
public double Add(double x, double y)
{
return x + y;
}
}
服务端配置:
<system.serviceModel>
<services>
<service name="CalculatorService">
<endpoint address="http://localhost:8000/calculator"
binding="basicHttpBinding"
contract="ICalculator" />
</service>
</services>
</system.serviceModel>
客户端调用:
using (ChannelFactory<ICalculator> factory =
new ChannelFactory<ICalculator>(new BasicHttpBinding(), "http://localhost:8000/calculator"))
{
ICalculator calculator = factory.CreateChannel();
double result = calculator.Add(1.0, 2.0);
Console.WriteLine("1.0 + 2.0 = {0}", result);
Console.ReadKey();
}
示例说明2
以下为一个WCF服务示例,用于向客户端发送消息。服务契约:
[ServiceContract(CallbackContract = typeof(IMessageCallback))]
public interface IMessageService
{
[OperationContract(IsOneWay = true)]
void SendMessage(string message);
}
public interface IMessageCallback
{
[OperationContract(IsOneWay = true)]
void ReceiveMessage(string message);
}
服务实现:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class MessageService : IMessageService
{
private List<IMessageCallback> callbacks = new List<IMessageCallback>();
public void SendMessage(string message)
{
Console.WriteLine("Sending message: {0}", message);
foreach (var callback in callbacks)
{
callback.ReceiveMessage(message);
}
}
public void Subscribe()
{
var callback = OperationContext.Current.GetCallbackChannel<IMessageCallback>();
if (!callbacks.Contains(callback))
{
callbacks.Add(callback);
Console.WriteLine("New client connected.");
}
}
public void Unsubscribe()
{
var callback = OperationContext.Current.GetCallbackChannel<IMessageCallback>();
if (callbacks.Contains(callback))
{
callbacks.Remove(callback);
Console.WriteLine("Client disconnected.");
}
}
}
服务端配置:
<system.serviceModel>
<services>
<service name="MessageService">
<endpoint address=""
binding="wsDualHttpBinding"
contract="IMessageService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/MessageService/" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior>
<callbackDebug />
</behavior>
</endpointBehaviors>
</behaviors>
<extensions>
<behaviorExtensions>
<add name="callbackDebug" type="MessageCallbackEndpointBehavior, MessageService" />
</behaviorExtensions>
</extensions>
</system.serviceModel>
客户端调用:
using (var factory = new DuplexChannelFactory<IMessageService>(
new InstanceContext(new MessageCallback()),
new WSDualHttpBinding(),
new EndpointAddress("http://localhost:8000/MessageService")))
{
IMessageService proxy = factory.CreateChannel();
proxy.Subscribe();
proxy.SendMessage("Hello, world!");
Console.ReadKey();
}
其中,MessageCallback实现了IMessageCallback接口:
public class MessageCallback : IMessageCallback
{
public void ReceiveMessage(string message)
{
Console.WriteLine("Received message: {0}", message);
}
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:WCF入门需要掌握的基础知识 - Python技术站