此页面有用吗?
您对此内容的反馈非常重要。 请告诉我们您的想法。
更多反馈?
1500 个剩余字符
导出 (0) 打印
全部展开

步骤 4:托管并运行要注册到 Service Bus 的基本 Web 服务

更新时间: 2015年6月

这是创建基本 Service Bus 服务应用程序以及可调用该服务的客户端所需的七个任务中的第四个任务。有关所有六个任务的概述,请参阅 Service Bus 中继消息传送教程。本主题介绍如何运行基本的 Service Bus 服务。

此任务中编写的代码的完整列表将在过程后面的示例中提供。

估计完成时间:10 分钟

  1. 向项目中添加对 Microsoft.ServiceBus.dll 的引用:请参阅使用 NuGet Service Bus 程序包

    note备注
    使用命令行编译器(例如 Csc.exe)时,还必须提供程序集的路径。

  2. 在 Program.cs 中,为 Microsoft.ServiceBus 命名空间添加 using 语句。

    using Microsoft.ServiceBus;
    

    Microsoft.ServiceBus 是包含 API 的命名空间,使用这些 API 可通过编程方式访问 Service Bus 的许多核心功能。你很可能会在所有 Service Bus 应用程序中使用此命名空间。

  3. Main() 方法中,创建两个变量以存储从控制台窗口中读取的服务命名空间和 SAS 密钥。

    Console.Write("Your Service Namespace: ");
    string serviceNamespace = Console.ReadLine();
    Console.Write("Your SAS key: ");
    string sasKey = Console.ReadLine();
    
    
    
    

    稍后将使用 SAS 密钥来访问你的 Service Bus 项目。服务命名空间将作为参数传递给 CreateServiceUri,以创建服务 URI。

  4. 使用 TransportClientEndpointBehavior 对象声明将使用 SAS 密钥作为凭据类型。将以下代码直接添加到在上一步添加的代码之下:

    TransportClientEndpointBehavior sasCredential = new TransportClientEndpointBehavior();
    sasCredential.TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider("RootManageSharedAccessKey", sasKey);
    

  1. 在上一步添加的代码后面,为服务的基址创建一个 Uri 实例。此 URI 指定 Service Bus 方案、服务命名空间和服务接口的路径。

    Uri address = ServiceBusEnvironment.CreateServiceUri("sb", serviceNamespace, "EchoService");
    

    “sb” 是 Service Bus 方案的缩写,表示我们将使用 TCP 协议。以前,将 NetTcpRelayBinding 指定为绑定时,配置文件中也有此类指示。

    就本教程来说,该 URI 为 sb://putServiceNamespaceHere.windows.net/EchoService

  1. 将连接模式设置为 AutoDetect

    ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.AutoDetect;
    

    连接模式描述了服务用来与 Service Bus 通信的协议;可以是 HTTP 或 TCP。使用默认设置 AutoDetect 时,服务将尝试通过 TCP(如果可用)连接到 Service Bus,而如果 TCP 不可用,则通过 HTTP 进行连接。请注意,这不同于服务指定的用于客户端通信的协议。客户端通信协议取决于所用的绑定。例如,服务可以使用 BasicHttpRelayBinding 绑定,该绑定指定其终结点(在 Service Bus 上公开)通过 HTTP 与客户端通信。该服务还可以指定 ConnectivityMode.AutoDetect,以便通过 TCP 与 Service Bus 通信。

  2. 使用之前在本部分中创建的 URI 创建服务主机。

    ServiceHost host = new ServiceHost(typeof(EchoService), address);
    

    该服务主机是可实例化服务的 WCF 对象。在这里,你可以向它传递要创建的服务类型(EchoService 类型),以及要公布服务的地址。

  3. 在 Program.cs 文件的顶部,添加对 System.ServiceModel.DescriptionMicrosoft.ServiceBus.Description 的引用。

    using System.ServiceModel.Description;
    using Microsoft.ServiceBus.Description;
    
  4. 回到 Main(),配置终结点以启用公开访问。

    IEndpointBehavior serviceRegistrySettings = new ServiceRegistrySettings(DiscoveryType.Public);
    

    此步骤告知 Service Bus,可以通过检查你项目的 Service Bus ATOM 源,公开找到你的应用程序。如果将 DiscoveryType 设置为 private,客户端将仍然能够访问服务。不过,在客户端搜索 Service Bus 命名空间时,服务并不会显示。要想显示服务,客户端必须事先了解终结点路径。有关详细信息,请参阅发现并公开 Service Bus 服务

  5. 将服务凭据应用于在 App.config 文件中定义的服务终结点:

    foreach (ServiceEndpoint endpoint in host.Description.Endpoints)
    {
        endpoint.Behaviors.Add(serviceRegistrySettings);
        endpoint.Behaviors.Add(sasCredential);
    }
    

    如上一步所述,你可能已在配置文件中声明了多个服务和终结点。如果是这样,此代码将遍历配置文件,搜索每一个应当应用凭据的终结点。但就本教程来说,配置文件只有一个终结点。

  1. 打开服务。

    host.Open();
    
  2. 通知用户服务正在运行,并说明如何关闭服务。

    Console.WriteLine("Service address: " + address);
    Console.WriteLine("Press [Enter] to exit");
    Console.ReadLine();
    
  3. 完成后,关闭服务主机。

    host.Close();
    
  4. F6 生成项目。

示例

以下示例包括教程中上一步的服务约定和实现,并将服务托管在控制台应用程序中。将以下代码编译到名为 EchoService.exe 的可执行文件中。

using System;
using System.ServiceModel;
using System.ServiceModel.Description;
using Microsoft.ServiceBus;
using Microsoft.ServiceBus.Description;

namespace Microsoft.ServiceBus.Samples
{
    [ServiceContract(Name = "IEchoContract", Namespace = "http://samples.microsoft.com/ServiceModel/Relay/")]

    public interface IEchoContract
    {
        [OperationContract]
        String Echo(string text);
    }

    public interface IEchoChannel : IEchoContract, IClientChannel { };

    [ServiceBehavior(Name = "EchoService", Namespace = "http://samples.microsoft.com/ServiceModel/Relay/")]

    class EchoService : IEchoContract
    {
        public string Echo(string text)
        {
            Console.WriteLine("Echoing: {0}", text);
            return text;
        }
    }

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

            ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.AutoDetect;

            
            
            Console.Write("Your Service Namespace: ");
            string serviceNamespace = Console.ReadLine();
            Console.Write("Your SAS key: ");
            string sasKey = Console.ReadLine();







           // Create the credentials object for the endpoint.
            TransportClientEndpointBehavior sasCredential = new TransportClientEndpointBehavior();
            sasCredential.TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider("RootManageSharedAccessKey", sasKey);



            // Create the service URI based on the service namespace.
            Uri address = ServiceBusEnvironment.CreateServiceUri("sb", serviceNamespace, "EchoService");

            // Create the service host reading the configuration.
            ServiceHost host = new ServiceHost(typeof(EchoService), address);

            // Create the ServiceRegistrySettings behavior for the endpoint.
            IEndpointBehavior serviceRegistrySettings = new ServiceRegistrySettings(DiscoveryType.Public);

            // Add the Service Bus credentials to all endpoints specified in configuration.
            foreach (ServiceEndpoint endpoint in host.Description.Endpoints)
            {
                endpoint.Behaviors.Add(serviceRegistrySettings);
                endpoint.Behaviors.Add(sasCredential);
            }
            
            // Open the service.
            host.Open();

            Console.WriteLine("Service address: " + address);
            Console.WriteLine("Press [Enter] to exit");
            Console.ReadLine();

            // Close the service.
            host.Close();
        }
    }
}

创建接口后,请继续执行步骤 5:为服务约定创建 WCF 客户端以实现该接口。

Microsoft 正在进行一项网上调查,以了解您对 MSDN 网站的意见。 如果您选择参加,我们将会在您离开 MSDN 网站时向您显示该网上调查。

是否要参加?
显示:
© 2015 Microsoft