WCF学习笔记—Overview

SOAService Orientation Attribute 面向服务架构

创建一个简单的基础WCF

WCF服务寄宿的方式:

Self-Hosting

IIS-Hosting

 


其中ClientHosting是控制台程序,ServiceService.InterfaceC#类库项目

其中ClientHostingService.Interface要添加System.Service.Model程序集服务,而且Service要引用Service.InterfaceHosting要添加ServiceService.interface服务

作用:

Service.intrface:是是定义服务的契约ServiceContract

Service:是定义服务类型,要实现Service.interface契约的接口

Hosting:为服务宿主的控制台程序

Client:模拟服务的客户端

Step1:在Service.Interface中创建要定义的服务接口

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

using System.ServiceModel;

 

namespace WcfService.Service.Interface

{

   

    /*Step1:定义契约ServiceContract

     */

    [ServiceContract(Name = "CalculatorService", Namespace = "http://www.artech.com/")]

    public interface ICalculator {

        [OperationContract]

        double Add(double x, double y);

        [OperationContract]

        double Subtract(double x, double y);

        [OperationContract]

        double Multiply(double x, double y);

        [OperationContract]

        double Divide(double x, double y);

    }

}

 

 

 

Step2:在Service中实现接口中的方法

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

using WcfService.Service.Interface;

 

namespace WcfService.Service

{

    public class Class1

    {

    }

 

    /*Step2:创建服务实现契约接口定义的接口

     */

    public class CalculatorService : ICalculator {

        public double Add(double x, double y) 

        {

            return x + y;

        }

 

        public double Subtract(double x, double y)

        {

            return x - y;

        }

 

        public double Multiply(double x, double y)

        {

            return x * y;

        }

 

        public double Divide(double x, double y)

        {

            return x / y;

        }

    }

}

 

 

 

Step3:在控制台中寄宿服务:在Hosting中通过自我寄宿的方式寄宿服务:为服务指定一个宿主的过程(WCF中的Httpopen等的方法要在Administrator权限下才能调用)

整体线索为:Wcf->HostingEndpoint=ABC->Client调用Service

其中指定过程为EndPoint方式= Address+Binding+Contract

Address:地址决定了服务的位置,解决了服务寻址的问题

Binding:实现通信中的所有细节,包括网络传输、消息编码,以及其他实现的功能传输安全、可靠消息、事物等,绑定定义有:BasicHttpBindingWSHttpBindingNetTcpBinding

Contract:对服务操作的抽象,也是对消息交换和消息结构的定义。

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

using System.ServiceModel;

using System.ServiceModel.Description;

 

using WcfService.Service.Interface;

using WcfService.Service;

 

namespace WcfService.Honsting

{

    class Program

    {

        private static string address = "http://127.0.0.1:3721/instrumentationservice";

        static void Main(string[] args)

        {

            /*Step3:开启寄宿服务,指定宿主过程的配置可以代码写也可以写配置文件

             */

              //ServiceHost的添加服务方法

            using (ServiceHost host = new ServiceHost(typeof(CalculatorService)))

            {

                //EndPoint= ABC通信手段

                //host.AddServiceEndpoint(typeof(ICalculator),

                //    new WSHttpBinding(),

                //    "http://127.0.0.1:3721/calculatorservice"

                //);//终结点

 

                //if (host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null)

                //{

                //    ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();

                //    behavior.HttpGetEnabled = true;

                //    behavior.HttpGetUrl = new Uri("http://127.0.0.1:3721/calculatorservice/metadata");//发布地址

                //    host.Description.Behaviors.Add(behavior);

 

                //}

 

                host.Opened += delegate

                {

                    Console.WriteLine("CalculatorService Starting 请按任意键停止服务!");

                };

 

                host.Open();

                Console.Read();

            }

            //ServiceHostBase的添加服务方法

            //ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService);

            //serviceHost.AddServiceEndpoint("Service.Interface.ICalculator",new WSHttpBinding(),"http://127.0.0.1/CalculatorService");

            //serviceHost.AddServiceEndpoint("Service.Interface.ICalculator",new NetTcpBinding(),"http://127.0.0.1/CalculatorService");

            //serviceHost.AddServiceEndpoint("Service.Interface.ICalculator",new BasicHttpBinding(),"http://127.0.0.1/CalculatorService");

            //serviceHost.Open();

          

            //共享终结点地址

            //ServiceHost serviceHost = new ServiceHost(typeof(InstrumentationService));//

            //WSHttpBinding binding = new WSHttpBinding();

            //serviceHost.AddServiceEndpoint(typeof(IEventLogWrite),binding,address);

            //serviceHost.AddServiceEndpoint(typeof(IPerformanceCounterWriter),binding,address);

            //serviceHost.Open();

            //Console.Read();

            //Console.WriteLine("OK");

 

        }

    }

}

 

 

 

<?xml version="1.0" encoding="utf-8"?>

<configuration>

 

  <system.serviceModel>

    <behaviors>

      <serviceBehaviors>

        <behavior name="metadataBehavior">

          <serviceMetadata httpGetEnabled="true" httpGetUrl="http://127.0.0.1:3721/calculatorservice/metadata"/>

        </behavior>

      </serviceBehaviors>

    </behaviors>

    

    <services>

      <service name="WcfService.Service.CalculatorService" behaviorConfiguration="metadataBehavior">

        <endpoint address="http://127.0.0.1:3721/calculatorservice" binding="wsHttpBinding" 

                  contract="WcfService.Service.Interface.ICalculator">

          

        </endpoint>

      </service>

      

    </services>

  </system.serviceModel>

  

</configuration>

 

 

Step4:在Client中引用Hosting开启的Http服务,然后进行调用即可。

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using Client.CalculatorService;

 

namespace Client

{

    class Program

    {

        static void Main(string[] args)

        {

            /*在客户端中调用服务Hosting开启的HTTP服务

             */

            

           CalculatorServiceClient proxy = new CalculatorServiceClient();

 

           if (proxy != null)

           {

               Console.WriteLine("WCF 服务已开启");

               Console.WriteLine("Add:1+2={0}", proxy.Add(1, 2));

               Console.WriteLine("Dive:1/23={0}", proxy.Divide(1, 23));

               Console.WriteLine("WCF 服务调用完毕");

           }

           else {

               Console.WriteLine("WCF 服务没有开启");

           }

        }

    }

}

 

 

 

运行结果为:

Wcf寄宿服务

 


Client宿主服务

 


Step5:在IIS中寄宿服务

 

根据上面的简单Demo,我们大概知道了上面是Address了,为寄宿服务指定解决了寻址和调用的问题

(先明白清晰主要的通信方式:

URL

HTTPHTTPS

Net.TCP

Net.Pipe

Net.Msmq 

看段代码:

                  using (ServiceHost host = new ServiceHost(typeof(CalculatorService)))

{

                host.AddServiceEndpoint(typeof(ICalculator),

                    new WSHttpBinding(),

                    "http://127.0.0.1:3721/calculatorservice"

                );//终结点

 

                if (host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null)

                {

                    ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();

                    behavior.HttpGetEnabled = true;

                    behavior.HttpGetUrl = new Uri("http://127.0.0.1:3721/calculatorservice/metadata");//发布地址

                    host.Description.Behaviors.Add(behavior);

 

                }

host.Opened += delegate

                {

                    Console.WriteLine("CalculatorService Starting 请按任意键停止服务!");

                };

 

                host.Open();

                Console.Read();

 

}

首先,ServiceHost定义一个host,ServiceHost 有三个重要的属性,AddressBindingContractAddress定性寻址,Binding是绑定类型,Contract是契约。

所以我们还可以这样写上面的寄宿过程:

     ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService);

           serviceHost.AddServiceEndpoint("Service.Interface.ICalculator",new WSHttpBinding(),"http://127.0.0.1/CalculatorService");

           serviceHost.AddServiceEndpoint("Service.Interface.ICalculator",new NetTcpBinding(),"http://127.0.0.1/CalculatorService");

           serviceHost.AddServiceEndpoint("Service.Interface.ICalculator",new BasicHttpBinding(),"http://127.0.0.1/CalculatorService");

           serviceHost.Open();

三种不同的绑定方式。

当然,在代码中写比较TM的复杂难懂,还是写配置文件好点。怎么写呢?自己百度。提示下,怎么写都要写到addressbindingcontract,这是不是废话。

 

继续,明什么是终结点EndPoint地址,也就是刚才说的为Address指定的终结点的地址,它有什么属性呢?看下图,显然一目了然了。

 

 


WCF 通过ServiceHost完成服务的寄宿,而被寄宿的服务通过添加到ServiceHost的终结点暴露出来成为可调用寻址和调用的资源。在ServiceHost的基类ServiceHost定义了4个添加的方法。见下图

 


此外有ServiceHostBase也有5个方法实现将服务添加到寄宿ServiceHost中去。看下图

 


 

 

可能看到这里我们都凌乱了吧,再次回味下那个寄宿过程,这个寄宿过程官方说法就是Endpoint = A+B+C,也就是通过ServiceHost来完成寄宿过程,怎么完成呢?通过ServiceHostBase定义的五个方法。ServiceHost中也有4个方法,你肯定想知道这两个有什么不一样是吧,故名ServiceHostBaseServiceHost 基类,一个父类一个子类,你懂的!然通过那些方法将ABC定义传参,添加到ServiceHost对象中去。

好吧,虽然ServiceHostBaseServiceHost是继承的关系,但是两者在把服务添加到寄宿中的过程的细节是不一样的。来,我们分析下,很简单的:参数不一样,而且主要的差别是:ServiceHost的终结点可以通过它的只读属性Description获取。

当然,聪明的人都看出来了,上面两中方式进行对wcf服务寄宿过程都比较复杂,那么有没别的快捷的方法呢?有!写配置文件,更快点就是直接生成,你只需要写AddreeBinding方式、Contract的服务即可。

对此,你可能每一步都会出错。地址写的寻址失败,绑定的方式又有问题,服务器契约有出错什么的。那怎么知道出错呢?那必须明白些基础原理。接下来了一大堆基础理论,可以不看的,如果你会。

以上实例参考金楠哥的书,本文只是学习笔记。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一毛钱的年代

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值