wcf服务契约继承

Posted 听哥哥的话

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了wcf服务契约继承相关的知识,希望对你有一定的参考价值。

a. 服务端
1.契约 使用了继承
using System;
using System.ServiceModel;

namespace WCF.Chapter2.InheritanceReworked.Host
{
    [ServiceContract]
    public interface IHuman
    {
        [OperationContract]
        string HumanSay();
    }

    [ServiceContract]
    public interface IMan : IHuman
    {
        [OperationContract]
        string ManSay();
    }

    [ServiceContract]
    public interface IWoman : IHuman
    {
        [OperationContract]
        string WomanSay();
    }
}
2.服务实现 实现了自己的具体的接口
using System;
using System.ServiceModel;

namespace WCF.Chapter2.InheritanceReworked.Host
{
    public class ManService : IMan
    {
        public string HumanSay()
        {
            return " 我是人,我会思考!";
        }

        public string ManSay()
        {
            return "我是男人,我力气比较大!";
        }
    }

    public class WomanService : IWoman
    {
        public string HumanSay()
        {
            return " 我是人,我会思考!";
        }

        public string WomanSay()
        {
            return "我是女人,我爱漂亮!";
        }
    }
}

3.服务终结点配置
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="WCF.Chapter2.InheritanceReworked.Host.ManService" behaviorConfiguration="MEX">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8000"/>
          </baseAddresses>
        </host>
        <endpoint address="http://localhost:8001/Man" binding="basicHttpBinding" contract="WCF.Chapter2.InheritanceReworked.Host.IMan"></endpoint>
      </service>
      
      <service name="WCF.Chapter2.InheritanceReworked.Host.WomanService" behaviorConfiguration="MEX">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:9000"/>
          </baseAddresses>
        </host>
        <endpoint address="net.tcp://localhost:9001/Woman" binding="netTcpBinding" contract="WCF.Chapter2.InheritanceReworked.Host.IWoman"></endpoint>
      </service>
    </services>
    
    <behaviors>
      <serviceBehaviors>
        <behavior name="MEX">
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>
4.服务寄宿开启
using System;
using System.ServiceModel;

namespace WCF.Chapter2.InheritanceReworked.Host
{
    class Program
    {
        static void Main(string[] args)
        {
            using (ServiceHost hostMan = new ServiceHost(typeof(ManService)))
            {
                hostMan.Opened += delegate
                {
                    Console.WriteLine("Man服务已开启...");
                };
                hostMan.Open();

                using (ServiceHost hostWoman = new ServiceHost(typeof(WomanService)))
                {
                    hostWoman.Opened += delegate
                    {
                        Console.WriteLine("Woman服务已开启...");
                    };
                    hostWoman.Open();

                    Console.ReadLine();
                }
                Console.WriteLine("Woman服务已关闭...");

                Console.ReadLine();
            }
            Console.WriteLine("Man服务已关闭...");
        }
    }
}

b. 客户端
1.客户端等效契约 除了命名空间不一样其他的都一样
using System;
using System.ServiceModel;

namespace WCF.Chapter2.InheritanceReworked.Client
{
    [ServiceContract]
    public interface IHuman
    {
        [OperationContract]
        string HumanSay();
    }

    [ServiceContract]
    public interface IMan : IHuman
    {
        [OperationContract]
        string ManSay();
    }

    [ServiceContract]
    public interface IWoman : IHuman
    {
        [OperationContract]
        string WomanSay();
    }
}
2.人类代理 男人和女人在服务端都实现了他,所以既可以是男人代表人,也可以是女人去代表人
using System;
using System.ServiceModel;

namespace WCF.Chapter2.InheritanceReworked.Client
{
    public class HumanProxy : ClientBase<IHuman>, IHuman
    {
        public HumanProxy()
        { }

        public HumanProxy(string configurationName) :
            base(configurationName)
        { }

        public string HumanSay()
        {
            return base.Channel.HumanSay();
        }

    }
}
3.由2的结论这里给出终结点配置
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <client>
      <endpoint name="human_man" address="http://localhost:8001/Man" binding="basicHttpBinding" contract="WCF.Chapter2.InheritanceReworked.Client.IHuman"></endpoint>
      <endpoint name="man" address="http://localhost:8001/Man" binding="basicHttpBinding" contract="WCF.Chapter2.InheritanceReworked.Client.IMan"></endpoint>
      <endpoint name="human_woman" address="net.tcp://localhost:9001/Woman" binding="netTcpBinding" contract="WCF.Chapter2.InheritanceReworked.Client.IHuman"></endpoint>
      <endpoint name="woman" address="net.tcp://localhost:9001/Woman" binding="netTcpBinding" contract="WCF.Chapter2.InheritanceReworked.Client.IWoman"></endpoint>
    </client>
  </system.serviceModel>
</configuration>
3.manProxy
using System;
using System.ServiceModel;

namespace WCF.Chapter2.InheritanceReworked.Client
{
    public class ManProxy : ClientBase<IMan>, IMan
    {
        public ManProxy()
        { }

        public ManProxy(string configurationName) :
            base(configurationName)
        { }

        public string HumanSay()
        {
            return base.Channel.HumanSay();
        }

        public string ManSay()
        {
            return base.Channel.ManSay();
        }
    }
}
4.womenproxy
using System;
using System.ServiceModel;

namespace WCF.Chapter2.InheritanceReworked.Client
{
    public class WomanProxy : ClientBase<IWoman>, IWoman
    {
        public WomanProxy()
        { }

        public WomanProxy(string configurationName) :
            base(configurationName)
        { }

        public string HumanSay()
        {
            return base.Channel.HumanSay();
        }

        public string WomanSay()
        {
            return base.Channel.WomanSay();
        }

    }
}

5.客户端调用代理
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WCF.Chapter2.InheritanceReworked.Client
{
    class Program
    {
        static void Main(string[] args)
        {
            using (HumanProxy humanProxy_man = new HumanProxy("human_man"))
            {
                Console.WriteLine("humanProxy_man:");
                Console.WriteLine(humanProxy_man.HumanSay());
                Console.WriteLine("");
            }

            using (HumanProxy humanProxy_woman = new HumanProxy("human_woman"))
            {
                Console.WriteLine("humanProxy_woman:");
                Console.WriteLine(humanProxy_woman.HumanSay());
                Console.WriteLine("");
            }

            using (ManProxy manProxy = new ManProxy("man"))
            {
                Console.WriteLine("manProxy_human:");
                Console.WriteLine(manProxy.HumanSay());
                Console.WriteLine("");

                Console.WriteLine("manProxy_man:");
                Console.WriteLine(manProxy.ManSay());
                Console.WriteLine("");
            }

            using (WomanProxy womanProxy = new WomanProxy("woman"))
            {
                Console.WriteLine("womanProxy_human:");
                Console.WriteLine(womanProxy.HumanSay());
                Console.WriteLine();

                Console.WriteLine("womanProxy_woman:");
                Console.WriteLine(womanProxy.WomanSay());
                Console.WriteLine();
            }

            Console.ReadLine();
        }
    }
}

 

以上是关于wcf服务契约继承的主要内容,如果未能解决你的问题,请参考以下文章

Protobuf-net.Grpc 服务契约继承

如何使用故障契约和 jquery ajax 处理 wcf 错误

WCF - WCF基本概念和简单WCF服务端创建

wcf服务契约的重载

WCF技术剖析之十八:消息契约(Message Contract)和基于消息契约的序列化

C# WCF之用接口创建服务契约部署及客户端连接