一、什么是WCF:
Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,也可以说是一套软件开发包。WCF合并了Web服务、.net Remoting、消息队列和Enterprise Services的功能并集成在Visual Studio中。WCF专门用于面向服务开发。
WCF的最终目标是通过进程或不同的系统、通过本地网络或是通过Internet收发客户和服务之间的消息。并为服务提供直接的支持。托管、安全、事务管理、离线对立等等。
椭圆里面是若干服务器,会通过internet传输,服务都会提供一个对外的接口。
二、WebService和WCf的区别
(1)Web Service:严格来说是行业标准,也就是Web Service 规范,也称作WS-*规范,既不是框架,也不是技术。
(2)WCF:WCF 是一个分布式应用的开发框架,属于特定的技术,或者平台。既不是标准也不是规范。
(3)WCF 是一套框架,用来创建各种服务。其中包括创建 Web服务(采用 basicHttpBinding绑定的服务就是一个Web 服务)。
三、新建一个项目
有两个默认的,一个是接口,一个是类文件,在接口上面有【ServiceContract】,在上面定义非常的灵活。便于以后的重构。【PerationContract】操作契约。【DataContact】数据契约。下面的类继承接口。直接将两个文件删除即可。
(1)首先创建一个类库
(2)添加引用,找到ServiceModel,点击添加
(3)将自动生成的类文件删除,然后添加一个接口,命名为IHelloService代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ServiceModel;
namespace HelloService
{
/// <summary>
/// //定义服务契约
/// </summary>
[ServiceContract]
public interface IHelloService
{
//添加操作契约,如果不添加的话访问这个服务访问不到sayHello方法
/// <summary>
/// 服务操作
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
[OperationContract]
string SayHello(string name);
}
}
(4)添加实现接口的类HelloService,定义SayHello方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ServiceModel;
namespace HelloService
{
public class HelloService:IHelloService
{
/// <summary>
/// 打招呼
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public string SayHello(string name)
{
return name + ":你好!";
}
}
}
(5)创建宿主程序。地址+绑定+契约=终结点。选择iis作为宿主,必须是http,作为通信协议绑定,如果使用自定义的必须根据绑定协议。 创建一个控制台应用程序,命名为HelloServiceHost
(6)添加ServiceModel引用,和HelloService引用。并在Program类文件中写入
(7)编写Program类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ServiceModel;
using System.ServiceModel.Channels;
namespace HelloServiceHost
{
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;
public ServiceHost Myhost
{
get { return _myhost; }
}
/// <summary>
/// 定义一个基地址
/// </summary>
public const string BaseAddress = "net.pipe://localhost";
/// <summary>
/// 可选地址
/// </summary>
public const string HelloServiceAddress = "Hello";
//3、服务契约实现类型
public static readonly Type ServiceType = typeof(HelloService.HelloService);//必须引用HelloService
//服务契约接口
public static readonly Type ContractType = typeof(HelloService.IHelloService);
/// <summary>
///4、定义一个服务绑定
/// </summary>
public static readonly Binding hellobinding = new NetNamedPipeBinding();
/// <summary>
/// 5、构造服务对象
/// </summary>
protected void CreateHelloServiceHost()
{
//创建服务对象
_myhost = new ServiceHost(ServiceType, new Uri[] { new Uri(BaseAddress) });
//6、添加终结点
_myhost.AddServiceEndpoint(ContractType,hellobinding,HelloServiceAddress);
}
/// <summary>
/// 7、打开服务方法
/// </summary>
public void open()
{
Console.WriteLine("开始启动服务···");
_myhost.Open();
Console.WriteLine("服务已经启动···");
}
/// <summary>
/// 8、创建构造方法
/// </summary>
public MyHelloHost()
{
CreateHelloServiceHost();
}
/// <summary>
/// 关闭服务后,销毁服务宿主实例对象
/// </summary>
public void Dispose()
{
if (_myhost!=null)
{
(_myhost as IDisposable).Dispose();
}
}
}
}
(8)运行结果
创建客户端:
(1)继续创建控制台应用程序命名为HelloService(记得添加引用),编写代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ServiceModel;
using HelloService;
using System.ServiceModel.Channels;
namespace HelloClient
{
class Program
{
static void Main(string[] args)
{
using (HelloProxy proxy = new HelloProxy())
{
//利用代理调用服务
Console.WriteLine(proxy.Say("帅哥"));
Console.Read();
}
}
//硬编码定义服务契约
[ServiceContract]
interface IService
{
//服务操作
[OperationContract]
String Say(String name);
}
/// <summary>
/// 客户端代理类;ClientBase 是用于创建可调用服务的客户端对象,是一种泛型,里面要包括服务端的接口;IService 接口要实现客户端创建的硬编码定义服务企业的接口。
/// </summary>
class HelloProxy : ClientBase<IHelloService>, IService
{
/// <summary>
/// 硬编码定义绑定
/// </summary>
public static readonly Binding HelloBinding = new NetNamedPipeBinding();
//硬编码定义地址
public static readonly EndpointAddress HelloAddress = new EndpointAddress(new Uri("net.pipe://localhost/Hello"));
/// <summary>
/// 构造方法
/// </summary>
public HelloProxy() : base(HelloBinding, HelloAddress) { }
//调用服务端方法
public String Say(String name)
{
//使用Channel属性对服务进行调用,获取
return Channel.SayHello(name);
}
}
}
}
(2)打开HelloServiceHost的exe文件。在bin文件中。然后运行HelloClien中exe文件,结果:
文件格式:
小结:
刚开始接触WCF,对里面的东西理解的还不是很深刻,但是通过这个例子让我对WCF有了宏观的把控。