【WCF】WCF框架创建

27 篇文章 0 订阅
6 篇文章 0 订阅

代码创建

Service

接口

       创建服务组件之前,需要先引用System.ServiceModel,下面的所有代码都需要引用。

    [ServiceContract]
    public interface IHelloService
    {
        /// <summary>
        /// 服务操作
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        [OperationContract]//仅这样的标识才能将方法放入service
        string SayHello(string name);
    }

实现类

    public class HelloService : IHelloService
    {
        /// <summary>
        /// 打招呼
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public string SayHello(string name)
        {
            return name+"说:您好!";
        }
    }

ServiceHost配置

    class Program
    {
        static void Main(string[] args)
        {
            using (MyHelloHost Host = new MyHelloHost())
            {
                Host.Open();
                Console.Read();
            }
        }
    }

    public class MyHelloHost : IDisposable
    {
        /// <summary>
        /// 定义一个服务对象
        /// </summary>
        private ServiceHost _myhost;

        /// <summary>
        /// 定义一个基地址
        /// </summary>
        public const string BaseAddress = "net.pipe://localhost";

        /// <summary>
        /// 可选地址
        /// </summary>
        public const string HelloServiceAddress = "Hello";

        //服务契约实现类型
        public static readonly Type ServiceType = typeof(HelloService.HelloService);//需要先添加引用
       //服务契约接口
       public static readonly Type ContractType = typeof(HelloService.IHelloService);

        /// <summary>
        /// 服务定义一个绑定
        /// </summary>
        public static readonly Binding hellobinding = new NetNamedPipeBinding();

        /// <summary>
        /// 构造服务对象
        /// </summary>
        protected void CreateHelloServiceHost()
        {
            //创建服务对象
            _myhost = new ServiceHost(ServiceType, new Uri[] { new Uri(BaseAddress)});
            //添加终节点
            _myhost.AddServiceEndpoint(ContractType, hellobinding, HelloServiceAddress);
        }

        //封装服务对象
        public ServiceHost Myhost
        {
            get { return _myhost; }
        }

        /// <summary>
        /// 打开服务方法
        /// </summary>
        public void Open()
        {
            Console.WriteLine("开始启动服务……");
            _myhost.Open();
            Console.WriteLine("服务已经启动……");
        }

        /// <summary>
        /// 构造方法
        /// </summary>
        public MyHelloHost()
        {
            CreateHelloServiceHost();
        }

        /// <summary>
        /// 销毁服务宿主对象实例
        /// </summary>
        public void Dispose()
        {
            if (_myhost != null)
            {
                (_myhost as IDisposable).Dispose();
            }
        }
    }

Client客户端

        使用之前需要先引入不再同一个项目中的服务

    class Program
    {
        static void Main(string[] args)
        {
            using (HelloProxy proxy = new HelloProxy())
            {
                //利用代理调用服务
                Console.WriteLine(proxy.Say("张三"));
                Console.ReadKey();
            }
        }
    }

    //硬编码定义服务契约
    [ServiceContract]
    interface IService
    {
        //服务操作
        [OperationContract]
        String Say(String name);
    }

    /// <summary>
    /// 客户端代理类型   :ClientBase<IHelloService>创建客户端对象
    /// </summary>
    class HelloProxy :ClientBase<IHelloService>,IService
    {
        //硬编码定义绑定
        public static readonly Binding HelloBinding = new NetNamedPipeBinding();
        //硬编码定义地址
        public static readonly EndpointAddress HelloAddress = new EndpointAddress(new Uri("net.pipe://localhost/Hello"));//uri必须与服务端中的匹配,才能访问服务端内容,详情见HelloServiceHost/Program.cs

        /// <summary>
        /// 构造方法
        /// </summary>
        public HelloProxy() : base(HelloBinding, HelloAddress) { }
        public string Say(string name)
        {
            //使用channel属性对服务进行调用
            return Channel.SayHello(name);
        }
    }

配置文件创建

        通过配置文件创建WCF项目,只是将上面的ServiceHost中的代码通过配置文件配置,及使用配置文件替换ServiceHost手动编码。其它没有变动。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
  <system.serviceModel>
    <services>
      <service name="WinformHello.HelloService" behaviorConfiguration="TestBehavior"><!--name不能私自设定,是服务端文件路径;behaviorConfiguration必须与下方的behavior相匹配-->
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8080/Hello"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="basicHttpBinding" contract="WCF_ServiceDemo.IHelloService"></endpoint><!--contract必须是服务协议文件路径-->
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="TestBehavior"><!--名字可随意,但是上方的behaviorConfiguration必须与之相对应-->
          <serviceMetadata httpGetEnabled="true"/><!--true为允许我们访问当前WCF里面的服务-->
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>


        在配置时,无论是手动还是配置文件,都需要注意,确定使用的传输协议,以及URI服务端和客户端要保持一致,才能成功。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值