代码改变世界

WCF 第一章 基础 使用代码生成WCF服务

2011-06-22 21:01  DanielWise  阅读(2732)  评论(0编辑  收藏  举报

完成一个WCF服务,你要完成一个.NET 类然后使用System.ServiceModel 属性来修饰这个类。System.ServiceModel 命名空间与.NET 3.0 一起安装而且包含了大多数WCF实现。当代码编译时,CLR(公共语言运行库)解释这些属性,使用运行时代码取代它们。对于.NET来说属性并不是新事物; 在.NET 1.0 时它们已经存在了。WCF,就像.NET 1.0,1.1和2.0 中的ASMX,当写服务时使用属性来提高我们的生产力。

  列表1.1 中显示了寄宿在控制台应用程序的WCF服务的完整代码。在这个例子中,我们做了以下工作。

      定义契约。写一个.NET 类做一些有用的工作然后使用WCF属性修饰它。[ServiceContract]属性标识一个类为契约。在标准WSDL(网络服务描述语言)里,[ServiceContract]定义portType. [OperationContract]属性定义可以在类中通过服务接口反射调用的方法。同时定义了这些类的方法中使用的来往消息。WSDL描述,[OperationContract]定义了操作和消息。在1.1到1.3列表中使用一个仅有一个叫GetPrice方法的名为StockService 的类。

注意
这本书中的例子使用非常简单的接口,通常接收返回一个单独的字符串或数字。实际应用中,你的服务操作很可能接收返回复杂的类型。线上通信将会更“臃肿”而不是“健谈”,降低了网络传输和回复能力。这需要在每次调用时传输更多信息,需要复杂的输入和返回值类型。

  定义一个终结点。在终结点定义中,我们将通过使用ServiceHost.AddServiceEndpoint 方法确定一个地址,绑定和契约.地址是空的,意味着终结点的地址和基地址或者服务的相同。绑定类型是basicHttpBinding,与使用WS-I BP 1.1 协议构建的XML Web Services 兼容,可以互操作。WS-I 或Web Services, 是几大主要的系统厂商合作的结果,包括微软,IBM,BEA,Oracle以及其他一些组织,定义了共同协议层次。WS-I 不是定义了标准;它提供了指导以及工具去确认软件是否符合现存标准,比如HTTP 和XML.

  在一个进程中寄宿服务以便于它可以监听新来的请求。在1.1到1.3列表中使用ServiceHost 类在控制台应用程序中寄宿服务。服务在http://localhost:8000/EssentialWCF 处监听。

列表 1.1 完全使用代码实现服务

using System;
using System.ServiceModel;

namespace EssentialWCF
{
    [ServiceContract]
    public interface IStockService
    {
        [OperationContract]
        double GetPrice(string ticker);
    }

    public class StockService : IStockService
    {
        public double GetPrice(string ticker)
        {
            return 94.85;
        }
    }

    public class service
    {
        public static void Main()
        {
            ServiceHost serviceHost = new ServiceHost(typeof(StockService),
                new Uri("http://localhost:8000/EssentialWCF"));
            serviceHost.AddServiceEndpoint(
                typeof(IStockService),
                new BasicHttpBinding(),
                "");
            serviceHost.Open();

            Console.WriteLine("Press <Enter> to terminate.\r\n");   
            Console.ReadLine();
            serviceHost.Close();
        }
    }
}