做好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);