导出 (0) 打印
全部展开

步骤 2:定义基于 REST 的 WCF 服务约定以用于 Service Bus

更新时间: 2015年3月

这是创建基本 REST 样式的 Service Bus 服务所需要执行的四个任务中的第二个任务。有关所有四个任务的概述,请参阅 Service Bus REST 教程

与其他 Service Bus 服务一样,创建 REST 样式的服务时,必须定义约定。约定指定主机支持的操作。服务操作可以看作是 Web 服务方法。约定通过定义 C++、C# 或 Visual Basic 接口来创建。接口中的每个方法都对应一个特定的服务操作。必须将 ServiceContractAttribute 属性应用于每个接口,且必须将 OperationContractAttribute 属性应用到每个操作。如果具有 ServiceContractAttribute 的接口中的方法没有 OperationContractAttribute,则该方法是不公开的。该过程后面的示例中显示了这些任务所用的代码。

基本 Service Bus 约定和 REST 样式的约定的主要区别在于是否向 OperationContractAttribute 添加一个属性:WebGetAttribute。此属性允许你将接口中的方法映射到该接口另一侧的方法。在此示例中,我们使用 WebGetAttribute 将一个方法链接到 HTTP GET。这将使 Service Bus 可以准确地检索并解释发送到接口的命令。

预计完成时间:10 分钟。

  1. 以管理员身份打开“Visual Studio”,方法是在“开始”菜单中右键单击该程序,然后选择“以管理员身份运行”。

  2. 创建新的控制台应用程序项目。单击“文件”菜单,选择“新建”,然后单击“项目”。在“新建项目”对话框中,选择“Visual C#”(如果不显示“Visual C#”,则在“其他语言”下方查看),再选择“控制台应用程序”模板,然后将其命名为 ImageListener。使用默认“位置”。单击“确定”以创建项目。

  3. 对于 C# 项目,Visual Studio 会创建名为 Program.cs 的文件。此类将包含名为 Main() 的空方法。需要此方法才能正确生成控制台应用程序项目。因此,你可以将其安全地留在项目中。

  4. 在项目中添加对 System.ServiceModel.dll 的引用:

    1. 在“解决方案资源管理器”中,右键单击项目文件夹下的“引用”文件夹,然后单击“添加引用”。

    2. 在“添加引用”对话框中选择“.NET”选项卡并向下滚动,看到 System.ServiceModel 后将其选中。然后,单击“确定”。然后单击“确定”

    note备注
    使用命令行编译器(例如 Csc.exe)时,还必须提供程序集的路径。例如,默认情况下,在运行 的计算机上,路径为:Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation。

  5. 重复上述步骤以添加对 System.ServiceModel.Web.dll 程序集的引用。

  6. System.ServiceModelSystem.ServiceModel.ChannelsSystem.ServiceModel.WebSystem.IO 命名空间添加 using 语句。

    using System.ServiceModel;
    using System.ServiceModel.Channels;
    using System.ServiceModel.Web;
    using System.IO;
    
    

    System.ServiceModel 是让你可以通过编程方式访问 Windows Communication Foundation (WCF) 基本功能的命名空间。Service Bus 使用 WCF 的许多对象和特性来定义服务约定。你将在大多数 Service Bus 应用程序中使用此命名空间。同样,System.ServiceModel.Channels 可帮助定义通道,通道是用来与 Service Bus 和客户端 Web 浏览器通信的对象。最后,System.ServiceModel.Web 包含的类型可用于创建基于 Web 的应用程序。

  7. 从 Visual Studio 重命名默认为 Microsoft.ServiceBus.Samples 的程序的命名空间。

    namespace Microsoft.ServiceBus.Samples
    {
    ...
    
    
  8. 在完成命名空间声明后,紧接着定义一个名为 IImageContract 的新接口,然后将 ServiceContractAttribute 属性应用于该接口,其值为 http://samples.microsoft.com/ServiceModel/Relay/。该命名空间值不同于你在整个代码范围内使用的命名空间。该命名空间值将用作此约定的唯一标识符,并应有版本控制信息。有关详细信息,请参阅 TechNet 上的服务版本控制。显式指定命名空间可防止将默认的命名空间值添加到约定名称中。

    [ServiceContract(Name = "ImageContract", Namespace = "http://samples.microsoft.com/ServiceModel/Relay/RESTTutorial1")]
    public interface IImageContract
    {
    }
    
    
  9. IImageContract 接口中,为 IImageContract 约定在接口中公开的单个操作声明一个方法,然后将 OperationContractAttribute 属性应用到你希望将其作为公共 Service Bus 约定的一部分进行公开的方法中。

    public interface IImageContract
    {
        [OperationContract]
        Stream GetImage();
    }
    
  10. 紧接在 OperationContract 属性后面,应用 WebGet 属性。

    
    public interface IImageContract
    {
        [OperationContract, WebGet]
        Stream GetImage();
    }
    

    这样做可以让 Service Bus 将 HTTP GET 请求路由到 GetImage,并将 GetImage 的返回值转换为 HTTP GETRESPONSE 答复。稍后在本教程中,你将使用 Web 浏览器访问此方法,并将在浏览器中显示图像。

  11. IImageContract 定义的正下方,声明从 IImageContractIClientChannel 接口继承的通道:

    [ServiceContract(Name = "IImageContract", Namespace = "http://samples.microsoft.com/ServiceModel/Relay/")]
    public interface IImageContract
    {
        [OperationContract, WebGet]
        Stream GetImage();
    }
    
    public interface IImageChannel : IImageContract, IClientChannel { }
    

    通道是服务和客户端用来互相传递信息的 WCF 对象。稍后,你将在主机应用程序中创建通道。然后 Service Bus 将使用该通道将浏览器的 HTTP GET 请求传递到你的 GetImage 实现。Service Bus 还使用该通道获取 GetImage 返回值并将其转换为客户端浏览器的 HTTP GETRESPONSE。

  12. 在“生成”菜单中,单击“生成解决方案”以确认工作的准确性。

示例

以下代码示例显示了一个用于定义 Service Bus 约定的基本接口。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Web;
using System.IO;

namespace Microsoft.ServiceBus.Samples
{

    [ServiceContract(Name = "IImageContract", Namespace = "http://samples.microsoft.com/ServiceModel/Relay/")]
    public interface IImageContract
    {
        [OperationContract, WebGet]
        Stream GetImage();
    }

    public interface IImageChannel : IImageContract, IClientChannel { }

    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

创建接口后,请继续执行步骤 3:实现基于 REST 的 WCF 服务约定以使用 Service Bus以实现该接口。

另请参阅

显示:
© 2015 Microsoft