WCF学习笔记——1.最基础的WCF



做好3年的c#开发,最近忽然发现居然除了语法之外一个框架都不会用。

刚好赶上一个不着急的项目,可以用来练手。分析了下 WPF、WCF、WF、EF,决定从WCF开始再学一遍.net


不废话了,下面上正文。


1.定义数据契约

using System.Runtime.Serialization;

    [DataContract]
    public class PCInfo
    {
        [DataMember]
        public string UserName { get; set; }
        [DataMember]
        public string CPURate{ get; set; }
        [DataMember]
        public string MemoryUsed { get; set; }
    }
就是在实体类的基础上增加属性标记


2.定义服务契约(接口)
using System.ServiceModel;
using EntityClassLibrary; //实体类库(数据契约)

    [ServiceContract]
    public interface IRenderService
    {
        [OperationContract]
        void SendPCInfo(PCInfo pci);
    }
此处最好单独形成类库,因为Server和Client都需要。

3.定义服务的具体内容

using EntityClassLibrary;

    public class RenderService : IRenderService
    {
        public void SendPCInfo(PCInfo pci)
        {

            string n = pci.UserName;
        }
    }
继承自服务契约,完成服务器端的逻辑。

4.构建宿主

using System;
using System.ServiceModel;
using System.ServiceModel.Channels;

    public class RenderServiceHost:IDisposable
    {
        private ServiceHost _renderHost;

        public const string BaseAddress = "net.tcp://192.168.2.12"; //服务使用的协议及地址
        public const string RenderServiceAddress = "RenderService"; //服务节点
        public static readonly Type ContractType = typeof(RenderAdmin.IRenderService); //使用的服务契约
        public static readonly Type ServiceType = typeof(RenderAdmin.RenderService); //使用的服务
        public static readonly Binding RenderBinding = new NetTcpBinding(); //绑定协议

        protected void ConstructServiceHost()
        {
            _renderHost = new ServiceHost(ServiceType, new Uri[] { new Uri(BaseAddress) });
            _renderHost.AddServiceEndpoint(ContractType, RenderBinding, RenderServiceAddress);
        }

        public ServiceHost Host
        {
            get
            {
                return _renderHost;
            }
        }

        public void Open()
        {
            _renderHost.Open();
        }

        public RenderServiceHost()
        {
            ConstructServiceHost();
        }

        public void Dispose()
        {
            if (_renderHost != null)
                (_renderHost as IDisposable).Dispose();
        }

    }
没啥可说的,看代码就行了

5.启动服务

        RenderServiceHost host = new RenderServiceHost();
        host.Open();
注意不要被自动释放了


6.客户端需要使用与服务器相同的数据契约和服务契约
1、2做成单独的类库,这里直接引用就行了,没必要重复写代码,也能避免手误。

7.服务代理

using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
using EntityClassLibrary;

    public class RenderServiceProxy : ClientBase<IRenderService>, IRenderService
    {
        //硬编码定义绑定
        public static readonly Binding RenderBinding = new NetTcpBinding();
        //硬编码定义地址
        public static readonly EndpointAddress RenderAddress = new EndpointAddress(new Uri("net.tcp://192.168.2.12/RenderService"));
        /// <summary>
        /// 构造方法
        /// </summary>
        public RenderServiceProxy() : base(RenderBinding, RenderAddress) { }
        public void SendPCInfo(PCInfo pci)
        {
            //使用Channel属性对服务进行调用
            try
            {
                Channel.SendPCInfo(pci);
            }
            catch (Exception ex)
            {
  //如果没有成功和服务器通信比方说服务器没开,就会到这里。
                ex.ToString();
            }
        }
    }

8.通过代理访问服务

        RenderServiceProxy proxy = new RenderServiceProxy();
        proxy.SendPCInfo(pci);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值