WCF入门需要掌握的基础知识

yizhihongxing

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技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • 简单了解Nginx七层负载均衡的几种调度算法

    简单了解Nginx七层负载均衡的几种调度算法 什么是七层负载均衡? 七层负载均衡是指在 OSI(开放系统互联)网络模型的第七层(应用层)上进行负载均衡,它使用应用层协议(如HTTP)来决定将请求转发到哪个服务器上。相比较传统的四层负载均衡,七层负载均衡能够更加精确地控制流量分配和应用请求的处理。 Nginx七层负载均衡几种调度算法 加权轮询(Weighted…

    人工智能概览 2023年5月25日
    00
  • pytorch 如何实现HWC转CHW

    PyTorch 是一个广泛使用的深度学习框架,实现了大量的深度学习算法和模型,作为一个深度学习从业者,经常需要对图像处理进行相关处理,如将图像从 HWC(height、width、channel)格式转化为 CHW(channel、height、width)格式。下面将提供两种方法实现 HWC 转 CHW。 方法一: 使用 permute() 函数 PyTo…

    人工智能概论 2023年5月25日
    00
  • Python OpenCV基于HSV的颜色分割实现示例

    下面给您讲解一下“Python OpenCV基于HSV的颜色分割实现示例”的完整攻略。 简介 HSV是颜色空间的一种,由色调(Hue)、饱和度(Saturation)和明度(Value)构成。相对与RGB颜色空间,HSV颜色空间更加容易进行颜色分割。本实例使用Python OpenCV实现基于HSV颜色空间的颜色分割。 准备 安装Python和OpenCV、…

    人工智能概论 2023年5月25日
    00
  • 用Python制作检测Linux运行信息的工具的教程

    下面是制作检测Linux运行信息的工具的教程的完整攻略,分为如下几个步骤: 1. 确定监测信息 首先,我们需要确定希望监测的信息,以决定需要获取哪些数据。针对Linux环境,常见的监测信息有:CPU利用率、内存使用率、磁盘空间、网络流量等等。 2. 学习Python操作Linux的API Python可以通过subprocess模块执行Linux命令,从而获…

    人工智能概览 2023年5月25日
    00
  • 深入理解nginx如何实现高性能和可扩展性

    深入理解nginx如何实现高性能和可扩展性 Nginx 是一个高性能、高可靠性的 Web 服务器和反向代理服务器。在处理高并发网络请求时,它可以同时保持较高的稳定性和扩展性。以下是 Nginx 实现高性能和可扩展性的攻略: 1.事件驱动模型 Nginx 使用了事件驱动的模型,在单个进程中处理多个并发连接,从而避免了每个连接都创建一个新进程或线程的模型。这种模…

    人工智能概览 2023年5月25日
    00
  • Java JDBC导致的反序列化攻击原理解析

    首先需要明确的是,JDBC反序列化攻击属于Java反序列化漏洞的一种,是一种利用JDBC反序列化特性来实施攻击的技术手段。这种攻击方式的核心原理是在构造JDBC URL时,通过Java反射的方式调用URLConnection的setURLStreamHandlerFactory方法,将自定义的URLStreamHandlerFactory注册到JVM中。 攻…

    人工智能概览 2023年5月25日
    00
  • Docker Nginx容器和Tomcat容器实现负载均衡与动静分离操作

    下面是实现 Docker Nginx 容器和 Tomcat 容器实现负载均衡与动静分离操作的完整攻略。 1. 确保环境准备就绪 在开始之前,我们需要确保一些环境准备就绪: 已安装 Docker。 在本地创建了 Tomcat 镜像以及 Nginx 镜像。 如果您不熟悉上面的准备工作,请参考 Docker 初学者指南。 2. 编写 Docker Compose …

    人工智能概览 2023年5月25日
    00
  • nginx 基本配置与参数说明详细介绍

    Nginx 基本配置与参数说明详细介绍 什么是 Nginx Nginx 是一款高性能的 Web 服务器软件,也可以作为反向代理、负载均衡器和 HTTP 缓存服务器使用。Nginx 采用事件驱动异步非阻塞模型,可以处理高并发连接。 安装和启动 Nginx 在 Ubuntu 系统中可以使用 apt-get 命令来安装 Nginx: sudo apt-get up…

    人工智能概览 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部