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

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日

相关文章

  • MongoDB中的bson介绍和使用实例

    什么是bson? BSON是Binary JSON的缩写,是MongoDB中的一种二进制存储格式,是一种轻便的数据交换格式。BSON的数据结构和JSON类似,但是它支持更多的数据类型,包括日期、二进制数据、正则表达式以及长整型等等。BSON在MongoDB中作为文档的存储格式和数据传输格式使用,可以封装和传输复杂的数据结构。 bson的基本格式 BSON的基…

    人工智能概论 2023年5月25日
    00
  • SpringCloud与Consul集成实现负载均衡功能

    这里是Spring Cloud与Consul集成实现负载均衡的完整攻略。 简介 Spring Cloud是一个用于开发分布式应用的框架,它基于Spring Boot构建,可以快速构建和部署微服务。Consul是一个开源的服务发现和配置管理系统,可以帮助我们在大规模分布式系统中管理服务。Spring Cloud与Consul集成可以实现服务发现和负载均衡的功能…

    人工智能概览 2023年5月25日
    00
  • nodejs+mongodb aggregate级联查询操作示例

    让我们来详细讲解一下“nodejs+mongodb aggregate级联查询操作示例”的完整攻略。 什么是 MongoDB Aggregate? MongoDB Aggregate 是 MongoDB 数据库中的一种强大的数据聚合方法,它允许我们对集合中的文档进行多级数据处理和转换,从而提供更复杂、更灵活的查询和数据处理方式。 通过 MongoDB Agg…

    人工智能概论 2023年5月25日
    00
  • django创建最简单HTML页面跳转方法

    下面是详细的攻略: 确认Django环境已经搭建 在使用Django创建HTML页面跳转之前,需要确保Django环境已经搭建成功。 第一步:创建Django项目 创建Django项目,使用命令行工具,执行以下命令: django-admin startproject projectname 其中,projectname为你的项目名称。 第二步: 创建Dja…

    人工智能概论 2023年5月25日
    00
  • 解决pytorch 保存模型遇到的问题

    针对解决PyTorch保存模型遇到的问题,下面是完整的攻略: 问题描述 在PyTorch中,我们通常使用torch.save()函数来保存训练好的模型,但在实际使用过程中,也会遇到各种各样的问题,如无法读取、无法保存等。接下来我们就来一一解决这些问题。 解决方案 1. 无法读取模型 在加载已经保存好的模型时,有些时候我们可能会遇到RuntimeError: …

    人工智能概论 2023年5月25日
    00
  • Django模型验证器介绍与源码分析

    Django模型验证器介绍与源码分析 Django 是一个高度模块化的 Web 应用框架,其模型层是 Django 中最重要的一部分。模型验证器是 Django 模型层的一项功能,用来验证模型实例的有效性,包括验证模型的字段是否符合规范,是否符合业务逻辑等。本文将详细介绍 Django 模型验证器的用法,以及它的源码分析。 模型验证器的用法 在 Django…

    人工智能概论 2023年5月25日
    00
  • 详解如何通过Python实现批量数据提取

    下面是详解如何通过Python实现批量数据提取的完整攻略: 1. 确认数据提取源 首先,需要确定数据提取的源头,即数据来源。可能的数据源包括网站上的HTML页面、API接口、数据库或文件等。 2. 安装必要的Python库 批量数据提取通常需要使用Python的第三方库来简化开发工作。根据不同的数据源类型,需要选择不同的库。比较常用的库有: 对于HTML页面…

    人工智能概论 2023年5月25日
    00
  • SpringCloud中使用Sentinel实现限流的实战

    当我们使用SpringCloud架构体系进行微服务开发时,对于服务的限流问题,我们可以使用Sentinel进行实现。Sentinel是一种轻量级的流量控制框架,它可以提供实时的指标统计和对短路、降级、限流等流量控制方式的支持。下面是使用Sentinel实现SpringCloud项目中的限流策略的攻略。 步骤1:引入Sentinel依赖 在pom.xml文件中…

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