• WCF 请求答复模式


    本文主要介绍如何使用请求答复模式

    在这里插入图片描述

     一、Service端

    1、定义一个接口,并且添加一个ServiceContract特性,并且在方法上天上一个OperationContract特性

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Runtime.Serialization;
    5. using System.ServiceModel;
    6. using System.Text;
    7. namespace Mytest
    8. {
    9. // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口“IFlyService”。
    10. [ServiceContract]
    11. public interface IFlyService
    12. {
    13. [OperationContract]
    14. string Fly();
    15. }
    16. }

    2、定义一个实现类,继承于第一步的IFlyService接口

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Runtime.Serialization;
    5. using System.ServiceModel;
    6. using System.Text;
    7. namespace Mytest
    8. {
    9. // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“FlyService ”。
    10. public class FlyService : IFlyService
    11. {
    12. public string Fly()
    13. {
    14. return "You can fly";
    15. }
    16. }
    17. }

    3、定义配置文件,其中contract为接口,name为接口实现类

    1. <?xml version="1.0" encoding="utf-8" ?>
    2. <configuration>
    3. <startup>
    4. <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
    5. </startup>
    6. <system.serviceModel>
    7. <behaviors>
    8. <serviceBehaviors>
    9. <behavior name="">
    10. <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
    11. <serviceDebug includeExceptionDetailInFaults="false" />
    12. </behavior>
    13. </serviceBehaviors>
    14. </behaviors>
    15. <services>
    16. <service name="Mytest.FlyService">
    17. <endpoint address="" binding="basicHttpBinding" contract="Mytest.IFlyService">
    18. <identity>
    19. <dns value="localhost" />
    20. </identity>
    21. </endpoint>
    22. <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    23. <host>
    24. <baseAddresses>
    25. <add baseAddress="http://localhost:8733/Design_Time_Addresses/Mytest/Service1/" />
    26. </baseAddresses>
    27. </host>
    28. </service>
    29. </services>
    30. </system.serviceModel>
    31. </configuration>

    4、开启服务(宿主可以为控制台程序,IIS或Winform,当前选择Console控制台程序)

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.ServiceModel;
    5. using System.Text;
    6. using System.Threading.Tasks;
    7. namespace Mytest
    8. {
    9. class Program
    10. {
    11. static void Main(string[] args)
    12. {
    13. ServiceHost host = new ServiceHost(typeof(FlyService));
    14. host.Open();
    15. Console.WriteLine("服务启动成功");
    16. Console.ReadLine();
    17. }
    18. }
    19. }

    二、客户端

    1、添加服务引用

     2、请求服务

    1. using ConsoleApp1.ServiceReference1;
    2. using System;
    3. using System.Collections.Generic;
    4. using System.Linq;
    5. using System.Text;
    6. using System.Threading.Tasks;
    7. namespace ConsoleApp1
    8. {
    9. class Program
    10. {
    11. static void Main(string[] args)
    12. {
    13. FlyServiceClient client = new FlyServiceClient();
    14. string result = client.Fly();
    15. Console.WriteLine(result);
    16. Console.ReadLine();
    17. }
    18. }
    19. }

    运行结果如图

    当前为basicHttpBinding通信模式可以改为netTcpBinding并且修改address

    1. <endpoint address="net.tcp://localhost/my/service" binding="netTcpBinding" contract="Mytest.IFlyService">
    2. <identity>
    3. <dns value="localhost" />
    4. </identity>
    5. </endpoint>

    更新服务引用即可

    三、MSMQ

     MSMQ(容量受硬盘大小限制)将客户端与service切开了,客户端只要将消息发送到消息队列即可,服务端自动获取消息

    1、更改通信方式

    1. <endpoint address="net.msmq://localhost/my/service" binding="netMsmqBinding" contract="Mytest.IFlyService">
    2. <identity>
    3. <dns value="localhost" />
    4. </identity>
    5. </endpoint>

    2、如果没有安装消息队列,首先安装windows功能,流程如下

    控制面板-》windows功能-》MSMQ服务器

    3、去找MSMQ:在计算机管理面板找到MSMQ,在MSMQ新建一个队列

    4、必须为单工访问

     a)服务必须为返回Void

     b)IsOneWay = true

    5、修改配置文件中安全性--改为None,并添加到endpoint节点 bindingConfiguration="mybinding"

    1. <bindings>
    2. <netMsmqBinding>
    3. <binding name="mybinding">
    4. <security mode="None"></security>
    5. </binding>
    6. </netMsmqBinding>
    7. </bindings>

    6、MSMQ模式不支持端口号访问,所以address 不允许出现端口号 

    7、客户端删除配置重新更新

    可以总结为basicHttpBinding适合.net与其他平台通信(如java等),netTcpBinding适合两个.net程序跨机器访问,MSMQ适合构建离线访问

    四、上述方式都是同步调用,下面说一下异步调用方式

    1、配置服务引用改为-》生成异步操作

     2、

    1. using ConsoleApp1.ServiceReference1;
    2. using System;
    3. using System.Collections.Generic;
    4. using System.Linq;
    5. using System.Text;
    6. using System.Threading.Tasks;
    7. namespace ConsoleApp1
    8. {
    9. class Program
    10. {
    11. static void Main(string[] args)
    12. {
    13. FlyServiceClient client = new FlyServiceClient();
    14. client.BeginFly((obj) =>
    15. {
    16. var myclient = (FlyServiceClient)obj.AsyncState;
    17. myclient.EndFly(obj);
    18. }, client);
    19. //string result = client.Fly();
    20. /// Console.WriteLine(result);
    21. Console.ReadLine();
    22. }
    23. }
    24. }

  • 相关阅读:
    Vue的学习 —— <vue组件>
    Redis基础数据结构及其使用
    S2B2C供应链系统将引领商业模式!S2B2C供应链电商系统实现订单管理数智化
    SQL Server 2022 安装步骤——SQL Server设置身份验证教程
    数智化招标采购系统智能创新化应用功能详解
    常用hooks用法总结
    力扣(LeetCode)2731. 移动机器人(C++)
    测试C语言static关键字的作用
    Linux -开机、重启和用户登录注销
    企业AI大模型服务——轻量化部署
  • 原文地址:https://blog.csdn.net/fsdad/article/details/126907306