wcf入门笔记一

 

      WCF 是用于构建面向服务的应用程序的框架,服务即一组API,宿主程序(可以使应用程序,也可也是IIS)公开一组API给客户程序调用,WCF主要有三个步骤:

  一、创建服务协定

      创建基本 WCF 服务时,第一项任务是定义协定。协定指定服务支持的操作。可以将操作视为一个 Web 服务方法。通过定义 C++、C# 或 VB
接口可创建协定。接口中的每个方法都对应于特定的服务操作,每个接口都必须应用ServiceContract属性,接口中的每个操作必须应用OperationContract属性。新建一个dll,首先应引用System.ServiceModel.dll,它包含了ServiceContractOperationContract属性及其它一些WCF的一些基本功能。

namespace Microsoft.ServiceModel.Samples
{
    using System.ServiceModel;
    [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
    public interface ICalculator
    {
        [OperationContract]
        int Add(int a, int b);
    }
}

  二、实现服务协定

 1 namespace Microsoft.ServiceModel.Samples
 2 {
 3     
 4     public class CalculatorService : ICalculator
 5     {
 6 
 7         public int Add(int a, int b)
 8         {
 9             return Subtract(a, b) + b;
10         }
11 
12      }
13 }

  三、承载和运行基本的WCF服务
  承载及运行WCF主要有几个步骤:为服务创建宿主程序,建立主机,创建终结点,启用元数据交换,打开服务主机。承载及运行WCF有几种方式,(一)通过应用程序承载;(二)通过IIS来承载。

  (一)利用应用程序作为宿主程序来承载及运行WCF服务

  建立一个控制台程序,添加System.ServiceModel.dll引用,建立服务主机ServiceHost, new ServiceHost(typeof(CalculatorService), new Uri("http://localhost:8000/ServiceModelSamples/Service")),第一参数为服务类型,第二个为主机的基址;接着为主机添加一个终结点,终结点有服务协定Contract+服务绑定Binding+服务地址Address组成,即终结点EndPoint=A+B+C组成;接着打开建立元数据交换,接着打开服务主机。

     

namespace Microsoft.ServiceModel.Samples
{
    using System.ServiceModel;
    using System.ServiceModel.Description;



    public class Program
    {
        public static void Main()
        {
            using(ServiceHost host = new ServiceHost(typeof(CalculatorService),
                new Uri("http://localhost:8000/ServiceModelSamples/Service")))
            {
                try
                {
                    host.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), "CalculatorService");

                    if (host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null)
                    {
                        ServiceMetadataBehavior bh = new ServiceMetadataBehavior();
                        bh.HttpGetEnabled = true;
                        bh.HttpGetUrl = new Uri("metadata",UriKind.Relative);
                        host.Description.Behaviors.Add(bh);
                    }
                    host.Opened += delegate(object sender, EventArgs e)
                    {
                        Console.WriteLine("CalculaorService已经启动,按任意键终止服务!");
                    };//new EventHandler(host_Opened);
                    host.Open();
                    Console.ReadLine();
                    host.Close();
                }
                catch (CommunicationException e)
                {

                    Console.WriteLine(e.Message);
                    host.Abort();
                }
            }
        }

  上面程序可以用配置程序简化,如下App.config:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <configuration>
 3     <system.serviceModel>
 4         <behaviors>
 5             <serviceBehaviors>
 6                 <behavior name="CalculatorServiceBehavior">
 7                     <serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:8000/ServiceModelSamples/Service/metadata" />
 8                 </behavior>
 9             </serviceBehaviors>
10         </behaviors>
11         <services>
12             <service behaviorConfiguration="CalculatorServiceBehavior" name="Microsoft.ServiceModel.Samples.CalculatorService">
13                 <endpoint address="CalculatorService" binding="wsHttpBinding"
14                     bindingConfiguration="" contract="Microsoft.ServiceModel.Samples.ICalculator" />
15                 <host>
16                     <baseAddresses>
17                         <add baseAddress="http://localhost:8000/ServiceModelSamples/Service" />
18                     </baseAddresses>
19                 </host>
20             </service>
21         </services>
22     </system.serviceModel>
23 </configuration>
namespace Microsoft.ServiceModel.Samples.Server1
{
    using System.ServiceModel;
    class Program
    {
        static void Main(string[] args)
        {
            using(ServiceHost host = new ServiceHost(typeof(CalculatorService)))
            {
                host.Opened += delegate
                {
                    Console.WriteLine("CalculaorService已经启动,按任意键终止服务!");
                };
                host.Open();
                Console.Read();
            }
        }
    }
}

       上面的配置程序代码可以用WCF服务配置编辑器来完成,

  (二)利用IIS来承载服务

  新建一个service.svc文件,写入<%@ServiceHost  Service="Microsoft.ServiceModel.Samples.CalculatorService"%>,其中创建主机,指定服务;第二步建立一个web.config文件,配置跟前面的配置文件一致,配置如下:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <configuration>
 3   <system.serviceModel>
 4     <services>
 5       <!-- 注意: 服务名称必须与服务实现的配置名称相匹配。 -->
 6       <service name="Microsoft.ServiceModel.Samples.CalculatorService" behaviorConfiguration="CalculatorServiceBehaviors">
 7         <!-- 添加下列终结点。 -->
 8         <endpoint address="" binding="wsHttpBinding" contract="Microsoft.ServiceModel.Samples.ICalculator" name="CalculatorService" />
 9         <!-- 注意: 服务必须有一个 http 基址以便添加此终结点。 -->
10         <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
11       </service>
12     </services>
13     <behaviors>
14       <serviceBehaviors>
15         <behavior name="CalculatorServiceBehaviors">
16           <!-- 将下列元素添加到服务行为配置中。 -->
17           <serviceMetadata httpGetEnabled="true" />
18         </behavior>
19       </serviceBehaviors>
20     </behaviors>
21   </system.serviceModel>
22     <system.webServer>
23         <directoryBrowse enabled="true" />
24     </system.webServer>
25 </configuration>

   利用IIS承载,生成元数据一个比较容易出错的地方就是,没有办系统盘下的C:\window\temp给IIS_USER用户开放权限,导致不能完成元数据交换。

 四、创建服务程序

  若采用应用程序承载服务,则必须运行应用程序,如上运行控制台程序,若采用IIS,则需启动IIS。建立一个客户端程序,本例建立一个控制台程序Client,有两种方法来建立调用的服务的方法:(一)利用Svcutil.exe来生产一个proxy.cs、App.config文件,(二)利用引入服务引用及对应Appconfig来实现对服务的调用。

  (一)Svcutil.exe

   在visual studio 命令提示中输入:Svcutil  /out:proxy.cs  /config:App.config  http://localhost:8000/ServiceModelSamples/Service

  (二)直接引用服务引用

  

  客服端代码如下:

 1 namespace Client2
 2 {
 3     class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7             Client.CalculatorClient cc = new Client.CalculatorClient();
 8             Console.WriteLine("10+20=" + cc.Add(10, 20).ToString());
 9 
10             Console.ReadLine();
11 
12         }
13     }
14 }

 

 

posted on 2012-12-16 18:55  小指令  阅读(391)  评论(0编辑  收藏  举报

导航