【WCF】创建第一个WCF应用程序


一、什么是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有了宏观的把控。



评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值