Azure WCF Relay REST のチュートリアルAzure WCF Relay REST tutorial

このチュートリアルでは、REST ベースのインターフェイスを表示する簡易な Azure Relay ホスト アプリケーションを構築する方法について説明します。This tutorial describes how to build a simple Azure Relay host application that exposes a REST-based interface. REST を使用すると、Web ブラウザーなどの Web クライアントから HTTP 要求を介して Service Bus API にアクセスできるようになります。REST enables a web client, such as a web browser, to access the Service Bus APIs through HTTP requests.

本チュートリアルでは、Windows Communication Foundation (WCF) REST プログラミング モデルを使用して、Azure Relay に REST サービスを構築します。The tutorial uses the Windows Communication Foundation (WCF) REST programming model to construct a REST service on Azure Relay. 詳細については、WCF ドキュメントの「WCF Web HTTP プログラミング モデル」「サービスの設計と実装」 を参照してください。For more information, see WCF REST Programming Model and Designing and Implementing Services in the WCF documentation.

このチュートリアルでは、次の手順を実行します。You take the following steps in this tutorial:

  • Relay 名前空間を作成する。Create a Relay namespace.
  • REST ベースの WCF サービス コントラクトを定義するDefine a REST-based WCF service contract
  • REST ベースの WCF コントラクトを実装するImplement the REST-based WCF contract
  • REST ベースの WCF サービスをホストし、実行するHost and run the REST-based WCF service
  • サービスを実行してテストするRun and test the service

前提条件Prerequisites

このチュートリアルを完了するには、次の前提条件を用意しておく必要があります。To complete this tutorial, you need the following prerequisites:

Relay 名前空間を作成するCreate a Relay namespace

Azure で Relay 機能を使用するには、最初にサービス名前空間を作成する必要があります。To begin using the relay features in Azure, you must first create a service namespace. 名前空間は、アプリケーション内で Azure リソースをアドレス指定するためのスコープ コンテナーを提供します。A namespace provides a scoping container for addressing Azure resources within your application. こちらの手順に従って、Relay 名前空間を作成します。Follow the instructions here to create a Relay namespace.

Azure Relay で使用する REST ベースの WCF サービス コントラクトを定義するDefine a REST-based WCF service contract to use with Azure Relay

WCF REST スタイルのサービスを作成するには、コントラクトを定義する必要があります。When you create a WCF REST-style service, you must define the contract. コントラクトには、ホストがサポートする操作を指定します。The contract specifies what operations the host supports. サービス操作は、Web サービス メソッドと考えることができます。A service operation can be thought of as a web service method. コントラクトを作成するには、C++、C#、または Visual Basic インターフェイスを定義します。Contracts are created by defining a C++, C#, or Visual Basic interface. インターフェイスの各メソッドは、特定のサービス操作に対応しています。Each method in the interface corresponds to a specific service operation. ServiceContractAttribute 属性を各インターフェイスに適用する必要があります。また、OperationContractAttribute 属性を各操作に適用する必要があります。The ServiceContractAttribute attribute must be applied to each interface, and the OperationContractAttribute attribute must be applied to each operation. ServiceContractAttribute があるインターフェイスのメソッドに OperationContractAttribute がない場合、そのメソッドは公開されません。If a method in an interface that has the ServiceContractAttribute does not have the OperationContractAttribute, that method is not exposed. これらのタスクに使用されるコードの例を手順に従って説明します。The code used for these tasks is shown in the example following the procedure.

WCF コントラクトと REST スタイルのコントラクトの主な違いは、REST スタイルの OperationContractAttribute にはプロパティWebGetAttribute がある点です。The primary difference between a WCF contract and a REST-style contract is the addition of a property to the OperationContractAttribute: WebGetAttribute. このプロパティを使用すると、インターフェイス内のメソッドを相手側のインターフェイスのメソッドにマップすることができます。This property enables you to map a method in your interface to a method on the other side of the interface. この例では、WebGetAttribute 属性を使用してメソッドを HTTP GET にリンクします。This example uses the WebGetAttribute attribute to link a method to HTTP GET. その結果、Service Bus は、インターフェイスに送信されたコマンドをより正確に取得および解釈できるようになります。This enables Service Bus to accurately retrieve and interpret commands sent to the interface.

インターフェイスを使用してコントラクトを作成するにはTo create a contract with an interface

  1. 管理者として Visual Studio を開きます。 [スタート] メニューの[Visual Studio] を右クリックし、 [管理者として実行] をクリックします。Open Visual Studio as an administrator: right-click the program in the Start menu, and then click Run as administrator.

  2. 新しいコンソール アプリケーション プロジェクトを作成します。Create a new console application project. [ファイル] メニューをクリックし、 [新規作成][プロジェクト] の順に選択します。Click the File menu and select New, then select Project. [新しいプロジェクト] ダイアログ ボックスで [Visual C#] をクリックします。 [コンソール アプリケーション] テンプレートを選択し、「ImageListener」と名前を付けます。In the New Project dialog box, click Visual C#, select the Console Application template, and name it ImageListener. 既定の [場所] を使用します。Use the default Location. [OK] をクリックしてプロジェクトを作成します。Click OK to create the project.

  3. C# プロジェクトの場合、Program.cs ファイルが作成されます。For a C# project, Visual Studio creates a Program.cs file. このクラスには、空の Main() メソッドが含まれています。このメソッドは、コンソール アプリケーション プロジェクトを正常にビルドするために必要です。This class contains an empty Main() method, required for a console application project to build correctly.

  4. Service Bus NuGet パッケージをインストールして、Service Bus と System.ServiceModel.dll への参照をプロジェクトに追加します。Add references to Service Bus and System.ServiceModel.dll to the project by installing the Service Bus NuGet package. WCF の System.ServiceModel と Service Bus ライブラリへの参照が、このパッケージによって自動的に追加されます。This package automatically adds references to the Service Bus libraries, as well as the WCF System.ServiceModel. ソリューション エクスプローラーで ImageListener プロジェクトを右クリックし、 [NuGet パッケージの管理] をクリックします。In Solution Explorer, right-click the ImageListener project, and then click Manage NuGet Packages. [参照] タブをクリックして、Microsoft Azure Service Bus を検索します。Click the Browse tab, then search for Microsoft Azure Service Bus. [インストール] をクリックして、使用条件に同意します。Click Install, and accept the terms of use.

  5. System.ServiceModel.Web.dll への参照をプロジェクトに明示的に追加する必要があります。You must explicitly add a reference to System.ServiceModel.Web.dll to the project:

    a.a. ソリューション エクスプローラーでプロジェクト フォルダーの [参照] フォルダーを右クリックし、 [参照の追加] をクリックします。In Solution Explorer, right-click the References folder under the project folder and then click Add Reference.

    b.b. [参照の追加] ダイアログ ボックスで、左側にある [フレームワーク] タブをクリックし、 [検索] ボックスに、「System.ServiceModel.Web」と入力します。In the Add Reference dialog box, click the Framework tab on the left-hand side and in the Search box, type System.ServiceModel.Web. [System.ServiceModel.Web] チェック ボックスをオンにし、 [OK] をクリックします。Select the System.ServiceModel.Web check box, then click OK.

  6. Program.cs ファイルの先頭に次の using ステートメントを追加します。Add the following using statements at the top of the Program.cs file.

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

    System.ServiceModel は、WCF の基本機能にプログラムでアクセスできる名前空間です。System.ServiceModel is the namespace that enables programmatic access to basic features of WCF. WCF Relay は、サービス コントラクトの定義に WCF の多くのオブジェクトと属性を使用します。WCF Relay uses many of the objects and attributes of WCF to define service contracts. ほとんどの Relay アプリケーションで、この名前空間を使用します。You use this namespace in most of your relay applications. 同様に、System.ServiceModel.Channels はチャネルの定義に役立ちます。チャネルは、Azure Relay とクライアント Web ブラウザーとの通信を経由するオブジェクトです。Similarly, System.ServiceModel.Channels helps define the channel, which is the object through which you communicate with Azure Relay and the client web browser. 最後に、System.ServiceModel.Web には、Web ベースのアプリケーションを作成できる型が含まれています。Finally, System.ServiceModel.Web contains the types that enable you to create web-based applications.

  7. ImageListener名前空間の名前を Microsoft.ServiceBus.Samples に変更します。Rename the ImageListener namespace to Microsoft.ServiceBus.Samples.

    namespace Microsoft.ServiceBus.Samples
    {
        ...
    
  8. 名前空間の宣言の左中かっこの直後に、IImageContract という新しいインターフェイスを定義し、値が https://samples.microsoft.com/ServiceModel/Relay/ServiceContractAttribute 属性をインターフェイスに適用します。Directly after the opening curly brace of the namespace declaration, define a new interface named IImageContract and apply the ServiceContractAttribute attribute to the interface with a value of https://samples.microsoft.com/ServiceModel/Relay/. この名前空間の値は、コードのスコープ全体で使用する名前空間とは異なります。The namespace value differs from the namespace that you use throughout the scope of your code. この名前空間の値は、このコントラクトの一意の識別子として使用されます。値にはバージョン情報が含まれています。The namespace value is used as a unique identifier for this contract, and should have version information. 詳細については、「サービスのバージョン管理」を参照してください。For more information, see Service Versioning. 名前空間を明示的に指定すると、既定の名前空間値がコントラクト名に追加されなくなります。Specifying the namespace explicitly prevents the default namespace value from being added to the contract name.

    [ServiceContract(Name = "ImageContract", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/RESTTutorial1")]
    public interface IImageContract
    {
    }
    
  9. IImageContract インターフェイス内で、IImageContract コントラクトがインターフェイスで公開している単一操作のメソッドを宣言し、パブリック Service Bus コントラクトの一部として公開するメソッドに OperationContractAttribute 属性を適用します。Within the IImageContract interface, declare a method for the single operation the IImageContract contract exposes in the interface and apply the OperationContractAttribute attribute to the method that you want to expose as part of the public Service Bus contract.

    public interface IImageContract
    {
        [OperationContract]
        Stream GetImage();
    }
    
  10. OperationContract 属性に、WebGet 値を追加します。In the OperationContract attribute, add the WebGet value.

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

    この追加により、リレー サービスから HTTP GET 要求を GetImage にルーティングし、GetImage の戻り値を HTTP GETRESPONSE 応答に変換できるようになります。Doing so enables the relay service to route HTTP GET requests to GetImage, and to translate the return values of GetImage into an HTTP GETRESPONSE reply. このチュートリアルの後半で、Web ブラウザーを使用してこのメソッドにアクセスし、ブラウザーに画像を表示します。Later in the tutorial, you will use a web browser to access this method, and to display the image in the browser.

  11. IImageContract 定義の直後に、IImageContract インターフェイスと IClientChannel インターフェイスの両方から継承するチャネルを宣言します。Directly after the IImageContract definition, declare a channel that inherits from both the IImageContract and IClientChannel interfaces.

    public interface IImageChannel : IImageContract, IClientChannel { }
    

    チャネルは、サービスとクライアントが相互に情報を渡すときに経由する WCF オブジェクトです。A channel is the WCF object through which the service and client pass information to each other. 後で、ホスト アプリケーションでチャネルを作成します。Later, you create the channel in your host application. Azure Relay は、ブラウザーからの HTTP GET 要求を GetImage 実装に渡すために、このチャネルを使用します。Azure Relay then uses this channel to pass the HTTP GET requests from the browser to your GetImage implementation. また、GetImage の戻り値を取得して、クライアント ブラウザーの HTTP GETRESPONSE に変換するためにも、このチャネルを使用します。The relay also uses the channel to take the GetImage return value and translate it into an HTTP GETRESPONSE for the client browser.

  12. [ビルド] メニューの [ソリューションのビルド] をクリックして、ここまでの作業に問題がないことを確認します。From the Build menu, click Build Solution to confirm the accuracy of your work so far.

Example

次のコードに、WCF Relay コントラクトを定義する基本的なインターフェイスを示します。The following code shows a basic interface that defines a WCF Relay contract.

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 = "https://samples.microsoft.com/ServiceModel/Relay/")]
    public interface IImageContract
    {
        [OperationContract, WebGet]
        Stream GetImage();
    }

    public interface IImageChannel : IImageContract, IClientChannel { }

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

REST ベースの WCF サービス コントラクトを実装するImplement the REST-based WCF service contract

REST スタイルの WCF Relay サービスを作成するには、まずコントラクトを作成する必要があります。コントラクトは、インターフェイスを使用して定義します。Creating a REST-style WCF Relay service requires that you first create the contract, which is defined by using an interface. 次の手順はインターフェイスの実装です。The next step is to implement the interface. ユーザー定義の IImageContract インターフェイスを実装する ImageService というクラスを作成します。This involves creating a class named ImageService that implements the user-defined IImageContract interface. コントラクトを実装したら、App.config ファイルを使用してインターフェイスを構成します。After you implement the contract, you then configure the interface using an App.config file. 構成ファイルには、サービス名、コントラクト名、リレー サービスとの通信に使用するプロトコルの種類など、アプリケーションに必要な情報が含まれています。The configuration file contains necessary information for the application, such as the name of the service, the name of the contract, and the type of protocol that is used to communicate with the relay service. 以下の手順では、これらのタスクに使用するコード例を示します。The code used for these tasks is provided in the example following the procedure.

これまでの手順と同様に、REST スタイルのコントラクトと基本の WCF Relay コントラクトの実装にはほとんど違いがありません。As with the previous steps, there is very little difference between implementing a REST-style contract and a WCF Relay contract.

REST スタイルの Service Bus コントラクトを実装するにはTo implement a REST-style Service Bus contract

  1. IImageContract インターフェイスの定義の直後に、ImageService という新しいクラスを作成します。Create a new class named ImageService directly after the definition of the IImageContract interface. ImageService クラスで IImageContract インターフェイスを実装します。The ImageService class implements the IImageContract interface.

    class ImageService : IImageContract
    {
    }
    

    他のインターフェイス実装と同様に、別のファイルに指定した定義を実装することができます。Similar to other interface implementations, you can implement the definition in a different file. ただし、このチュートリアルでは、インターフェイス定義や Main() メソッドと同じファイルで実装します。However, for this tutorial, the implementation appears in the same file as the interface definition and Main() method.

  2. ServiceBehaviorAttribute 属性を IImageService クラスに適用して、クラスが WCF コントラクトの実装であることを示します。Apply the ServiceBehaviorAttribute attribute to the IImageService class to indicate that the class is an implementation of a WCF contract.

    [ServiceBehavior(Name = "ImageService", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")]
    class ImageService : IImageContract
    {
    }
    

    既に説明したように、この名前空間は従来の名前空間ではありません。As mentioned previously, this namespace is not a traditional namespace. この名前空間は、コントラクトを特定する WCF アーキテクチャの一部です。Instead, it is part of the WCF architecture that identifies the contract. 詳細については、WCF ドキュメントの記事「データ コントラクト名」を参照してください。For more information, see the Data Contract Names article in the WCF documentation.

  3. .jpg 画像をプロジェクトに追加します。Add a .jpg image to your project.

    これは、サービスが受信側ブラウザーに表示する画像です。This is a picture that the service displays in the receiving browser. プロジェクトを右クリックし、 [追加] をクリックします。Right-click your project, then click Add. [既存の項目] をクリックします。Then click Existing Item. [既存項目の追加] ダイアログ ボックスで、使用する .jpg を参照して選択し、 [追加] をクリックします。Use the Add Existing Item dialog box to browse to an appropriate .jpg, and then click Add.

    ファイルを追加するときに、 [ファイル名:] フィールドの横にあるドロップダウン リストで [すべてのファイル] が選択されていることを確認します。When adding the file, make sure that All Files is selected in the drop-down list next to the File name: field. 以降、このチュートリアルでは、画像名が "image.jpg" という前提で説明します。The rest of this tutorial assumes that the name of the image is "image.jpg". 別のファイルを使用する場合は、画像のファイル名を変更するか、ファイル名に合わせてコードを変更する必要があります。If you have a different file, you must rename the image, or change your code to compensate.

  4. 実行中のサービスから画像ファイルを検出できるようにするには、ソリューション エクスプローラーで画像ファイルを右クリックし、 [プロパティ] をクリックします。To make sure that the running service can find the image file, in Solution Explorer right-click the image file, then click Properties. [プロパティ] ウィンドウの [出力ディレクトリにコピー][新しい場合はコピーする] に設定します。In the Properties pane, set Copy to Output Directory to Copy if newer.

  5. System.Drawing.dll アセンブリへの参照をプロジェクトに追加し、次の関連する using ステートメントも追加します。Add a reference to the System.Drawing.dll assembly to the project, and also add the following associated using statements.

    using System.Drawing;
    using System.Drawing.Imaging;
    using Microsoft.ServiceBus;
    using Microsoft.ServiceBus.Web;
    
  6. ビットマップを読み込む次のコンストラクターを ImageService クラスに追加し、クライアント ブラウザーに送信する準備をします。In the ImageService class, add the following constructor that loads the bitmap and prepares to send it to the client browser.

    class ImageService : IImageContract
    {
        const string imageFileName = "image.jpg";
    
        Image bitmap;
    
        public ImageService()
        {
            this.bitmap = Image.FromFile(imageFileName);
        }
    }
    
  7. 前のコードの直後に、次のように、画像を含む HTTP メッセージを返す GetImage メソッドを ImageService クラスに追加します。Directly after the previous code, add the following GetImage method in the ImageService class to return an HTTP message that contains the image.

    public Stream GetImage()
    {
        MemoryStream stream = new MemoryStream();
        this.bitmap.Save(stream, ImageFormat.Jpeg);
    
        stream.Position = 0;
        WebOperationContext.Current.OutgoingResponse.ContentType = "image/jpeg";
    
        return stream;
    }
    

    この実装では、MemoryStream を使用して画像を取得し、ブラウザーにストリーミングする準備をします。This implementation uses MemoryStream to retrieve the image and prepare it for streaming to the browser. ゼロ位置からストリーミングを開始し、ストリーム コンテンツを jpeg 形式と宣言し、情報をストリーミングします。It starts the stream position at zero, declares the stream content as a jpeg, and streams the information.

  8. [ビルド] メニューの [ソリューションのビルド] をクリックします。From the Build menu, click Build Solution.

Service Bus で Web サービスを実行するための構成を定義するにはTo define the configuration for running the web service on Service Bus

  1. ソリューション エクスプローラーで、App.config をダブルクリックして、Visual Studio エディターでそのファイルを開きます。In Solution Explorer, double-click App.config to open it in the Visual Studio editor.

    App.config ファイルには、サービス名、エンドポイント (つまり、クライアントとホストの相互通信用に Azure Relay が公開している場所)、バインド (通信に使用するプロトコルの種類) が記載されています。The App.config file includes the service name, endpoint (that is, the location Azure Relay exposes for clients and hosts to communicate with each other), and binding (the type of protocol that is used to communicate). 主な違いは、構成されているサービス エンドポイントが WebHttpRelayBinding バインドを参照している点です。The main difference here is that the configured service endpoint refers to a WebHttpRelayBinding binding.

  2. <system.serviceModel> XML 要素は 1 つ以上のサービスを定義する WCF 要素です。The <system.serviceModel> XML element is a WCF element that defines one or more services. この要素は、サービス名とエンドポイントの定義に使用されます。Here, it is used to define the service name and endpoint. <system.serviceModel> 要素の下 (ただし、<system.serviceModel> 内) に、次の内容の <bindings> 要素を追加します。At the bottom of the <system.serviceModel> element (but still within <system.serviceModel>), add a <bindings> element that has the following content. ここでアプリケーションに使用するバインドを定義します。This defines the bindings used in the application. 複数のバインドを定義できますが、このチュートリアルで定義するバインドは 1 つのみです。You can define multiple bindings, but for this tutorial you are defining only one.

    <bindings>
        <!-- Application Binding -->
        <webHttpRelayBinding>
            <binding name="default">
                <security relayClientAuthenticationType="None" />
            </binding>
        </webHttpRelayBinding>
    </bindings>
    

    上記のコードでは、relayClientAuthenticationTypeNone に設定して、WCF Relay の WebHttpRelayBinding バインドを定義しています。The previous code defines a WCF Relay WebHttpRelayBinding binding with relayClientAuthenticationType set to None. この設定は、このバインドを使用するエンドポイントは、クライアントの資格情報を必要としないことを示します。This setting indicates that an endpoint using this binding does not require a client credential.

  3. <bindings> 要素の後に、<services> 要素を追加します。After the <bindings> element, add a <services> element. バインドと同様に、1 つの構成ファイルで複数のサービスを定義できます。Similar to the bindings, you can define multiple services in a single configuration file. ただし、このチュートリアルで定義するサービスは 1 つのみです。However, for this tutorial, you define only one.

    <services>
        <!-- Application Service -->
        <service name="Microsoft.ServiceBus.Samples.ImageService"
             behaviorConfiguration="default">
            <endpoint name="RelayEndpoint"
                    contract="Microsoft.ServiceBus.Samples.IImageContract"
                    binding="webHttpRelayBinding"
                    bindingConfiguration="default"
                    behaviorConfiguration="sbTokenProvider"
                    address="" />
        </service>
    </services>
    

    この手順では、以前に定義した既定の webHttpRelayBinding を使用するサービスを構成します。This step configures a service that uses the previously defined default webHttpRelayBinding. また、既定の sbTokenProvider を使用します。この値は次の手順で定義します。It also uses the default sbTokenProvider, which is defined in the next step.

  4. <services> 要素の後に、次の内容の <behaviors> 要素を作成します。このとき、"SAS_KEY" キーを、以前に Azure Portal から取得した Shared Access Signature (SAS) に置き換えます。After the <services> element, create a <behaviors> element with the following content, replacing "SAS_KEY" with the Shared Access Signature (SAS) key you previously obtained from the Azure portal.

    <behaviors>
        <endpointBehaviors>
            <behavior name="sbTokenProvider">
                <transportClientEndpointBehavior>
                    <tokenProvider>
                        <sharedAccessSignature keyName="RootManageSharedAccessKey" key="YOUR_SAS_KEY" />
                    </tokenProvider>
                </transportClientEndpointBehavior>
            </behavior>
            </endpointBehaviors>
            <serviceBehaviors>
                <behavior name="default">
                    <serviceDebug httpHelpPageEnabled="false" httpsHelpPageEnabled="false" />
                </behavior>
            </serviceBehaviors>
    </behaviors>
    
  5. 引き続き App.config 内で、<appSettings> 要素内の接続文字列の値全体を、前の手順でポータルから取得した接続文字列に置き換えます。Still in App.config, in the <appSettings> element, replace the entire connection string value with the connection string you previously obtained from the portal.

    <appSettings>
       <!-- Service Bus specific app settings for messaging connections -->
       <add key="Microsoft.ServiceBus.ConnectionString"
           value="Endpoint=sb://yourNamespace.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=YOUR_SAS_KEY"/>
    </appSettings>
    
  6. [ビルド] メニューの [ソリューションのビルド] をクリックしてソリューション全体をビルドします。From the Build menu, click Build Solution to build the entire solution.

Example

次のコードは、WebHttpRelayBinding バインドを使用して Service Bus で実行する REST ベース サービスのコントラクトとサービスの実装を示しています。The following code shows the contract and service implementation for a REST-based service that is running on Service Bus using the WebHttpRelayBinding binding.

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;
using System.Drawing;
using System.Drawing.Imaging;
using Microsoft.ServiceBus;
using Microsoft.ServiceBus.Web;

namespace Microsoft.ServiceBus.Samples
{


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

    public interface IImageChannel : IImageContract, IClientChannel { }

    [ServiceBehavior(Name = "ImageService", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")]
    class ImageService : IImageContract
    {
        const string imageFileName = "image.jpg";

        Image bitmap;

        public ImageService()
        {
            this.bitmap = Image.FromFile(imageFileName);
        }

        public Stream GetImage()
        {
            MemoryStream stream = new MemoryStream();
            this.bitmap.Save(stream, ImageFormat.Jpeg);

            stream.Position = 0;
            WebOperationContext.Current.OutgoingResponse.ContentType = "image/jpeg";

            return stream;
        }
    }

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

次の例は、サービスに関連付けられている App.config ファイルです。The following example shows the App.config file associated with the service.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2"/>
    </startup>
    <system.serviceModel>
        <extensions>
            <!-- In this extension section we are introducing all known service bus extensions. User can remove the ones they don't need. -->
            <behaviorExtensions>
                <add name="connectionStatusBehavior"
                    type="Microsoft.ServiceBus.Configuration.ConnectionStatusElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add name="transportClientEndpointBehavior"
                    type="Microsoft.ServiceBus.Configuration.TransportClientEndpointBehaviorElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add name="serviceRegistrySettings"
                    type="Microsoft.ServiceBus.Configuration.ServiceRegistrySettingsElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
            </behaviorExtensions>
            <bindingElementExtensions>
                <add name="netMessagingTransport"
                    type="Microsoft.ServiceBus.Messaging.Configuration.NetMessagingTransportExtensionElement, Microsoft.ServiceBus,  Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add name="tcpRelayTransport"
                    type="Microsoft.ServiceBus.Configuration.TcpRelayTransportElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add name="httpRelayTransport"
                    type="Microsoft.ServiceBus.Configuration.HttpRelayTransportElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add name="httpsRelayTransport"
                    type="Microsoft.ServiceBus.Configuration.HttpsRelayTransportElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add name="onewayRelayTransport"
                    type="Microsoft.ServiceBus.Configuration.RelayedOnewayTransportElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
            </bindingElementExtensions>
            <bindingExtensions>
                <add name="basicHttpRelayBinding"
                    type="Microsoft.ServiceBus.Configuration.BasicHttpRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add name="webHttpRelayBinding"
                    type="Microsoft.ServiceBus.Configuration.WebHttpRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add name="ws2007HttpRelayBinding"
                    type="Microsoft.ServiceBus.Configuration.WS2007HttpRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add name="netTcpRelayBinding"
                    type="Microsoft.ServiceBus.Configuration.NetTcpRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add name="netOnewayRelayBinding"
                    type="Microsoft.ServiceBus.Configuration.NetOnewayRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add name="netEventRelayBinding"
                    type="Microsoft.ServiceBus.Configuration.NetEventRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add name="netMessagingBinding"
                    type="Microsoft.ServiceBus.Messaging.Configuration.NetMessagingBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
            </bindingExtensions>
        </extensions>
      <bindings>
        <!-- Application Binding -->
        <webHttpRelayBinding>
          <binding name="default">
            <security relayClientAuthenticationType="None" />
          </binding>
        </webHttpRelayBinding>
      </bindings>
      <services>
        <!-- Application Service -->
        <service name="Microsoft.ServiceBus.Samples.ImageService"
             behaviorConfiguration="default">
          <endpoint name="RelayEndpoint"
                  contract="Microsoft.ServiceBus.Samples.IImageContract"
                  binding="webHttpRelayBinding"
                  bindingConfiguration="default"
                  behaviorConfiguration="sbTokenProvider"
                  address="" />
        </service>
      </services>
      <behaviors>
        <endpointBehaviors>
          <behavior name="sbTokenProvider">
            <transportClientEndpointBehavior>
              <tokenProvider>
                <sharedAccessSignature keyName="RootManageSharedAccessKey" key="YOUR_SAS_KEY" />
              </tokenProvider>
            </transportClientEndpointBehavior>
          </behavior>
        </endpointBehaviors>
        <serviceBehaviors>
          <behavior name="default">
            <serviceDebug httpHelpPageEnabled="false" httpsHelpPageEnabled="false" />
          </behavior>
        </serviceBehaviors>
      </behaviors>
    </system.serviceModel>
    <appSettings>
        <!-- Service Bus specific app settings for messaging connections -->
        <add key="Microsoft.ServiceBus.ConnectionString"
            value="Endpoint=sb://yourNamespace.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=YOUR_SAS_KEY>"/>
    </appSettings>
</configuration>

Azure Relay を使用する REST ベースの WCF サービスをホストするHost the REST-based WCF service to use Azure Relay

この手順では、WCF Relay でコンソール アプリケーションを使用して、Web サービスを実行する方法について説明します。This step describes how to run a web service using a console application with WCF Relay. この手順で作成するコードの詳細については、手順に従って例を使用して説明します。A complete listing of the code written in this step is provided in the example following the procedure.

サービスのベース アドレスを作成するにはTo create a base address for the service

  1. Main() 関数の宣言で、プロジェクトの名前空間を格納する変数を作成します。In the Main() function declaration, create a variable to store the namespace of your project. yourNamespace は、前に作成した Relay 名前空間の名前に置き換えてください。Make sure to replace yourNamespace with the name of the Relay namespace you created previously.

    string serviceNamespace = "yourNamespace";
    

    Service Bus は、名前空間の名前を使用して一意の URI を作成します。Service Bus uses the name of your namespace to create a unique URI.

  2. 名前空間に基づくサービスのベース アドレスの Uri インスタンスを作成します。Create a Uri instance for the base address of the service that is based on the namespace.

    Uri address = ServiceBusEnvironment.CreateServiceUri("https", serviceNamespace, "Image");
    

Web サービス ホストを作成および構成するにはTo create and configure the web service host

  • このセクションで作成した URI アドレスを使用して、Web サービス ホストを作成します。Create the web service host, using the URI address created earlier in this section.

    WebServiceHost host = new WebServiceHost(typeof(ImageService), address);
    

    サービス ホストは、ホスト アプリケーションをインスタンス化する WCF オブジェクトです。The service host is the WCF object that instantiates the host application. この例では、作成するホストの種類 (ImageService) と、ホスト アプリケーションを公開するアドレスを渡します。This example passes it the type of host you want to create (an ImageService), and also the address at which you want to expose the host application.

Web サービス ホストを実行するにはTo run the web service host

  1. サービスを開きます。Open the service.

    host.Open();
    

    サービスが実行されます。The service is now running.

  2. サービスが実行中であることと、サービスの停止方法を示すメッセージが表示されます。Display a message indicating that the service is running, and how to stop the service.

    Console.WriteLine("Copy the following address into a browser to see the image: ");
    Console.WriteLine(address + "GetImage");
    Console.WriteLine();
    Console.WriteLine("Press [Enter] to exit");
    Console.ReadLine();
    
  3. 完了したら、サービス ホストを閉じます。When finished, close the service host.

    host.Close();
    

Example

次の例では、チュートリアルの前の手順で説明したサービス コントラクトと実装が含まれています。ここでは、コンソール アプリケーションでサービスをホストします。The following example includes the service contract and implementation from previous steps in the tutorial and hosts the service in a console application. 次のコードをコンパイルして、ImageListener.exe という実行可能ファイルを作成します。Compile the following code into an executable named ImageListener.exe.

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;
using System.Drawing;
using System.Drawing.Imaging;
using Microsoft.ServiceBus;
using Microsoft.ServiceBus.Web;

namespace Microsoft.ServiceBus.Samples
{

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

    public interface IImageChannel : IImageContract, IClientChannel { }

    [ServiceBehavior(Name = "ImageService", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")]
    class ImageService : IImageContract
    {
        const string imageFileName = "image.jpg";

        Image bitmap;

        public ImageService()
        {
            this.bitmap = Image.FromFile(imageFileName);
        }

        public Stream GetImage()
        {
            MemoryStream stream = new MemoryStream();
            this.bitmap.Save(stream, ImageFormat.Jpeg);

            stream.Position = 0;
            WebOperationContext.Current.OutgoingResponse.ContentType = "image/jpeg";

            return stream;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            string serviceNamespace = "InsertServiceNamespaceHere";
            Uri address = ServiceBusEnvironment.CreateServiceUri("https", serviceNamespace, "Image");

            WebServiceHost host = new WebServiceHost(typeof(ImageService), address);
            host.Open();

            Console.WriteLine("Copy the following address into a browser to see the image: ");
            Console.WriteLine(address + "GetImage");
            Console.WriteLine();
            Console.WriteLine("Press [Enter] to exit");
            Console.ReadLine();

            host.Close();
        }
    }
}

サービスを実行してテストするRun and test the service

ソリューションをビルドしたら、次の手順でアプリケーションを実行します。After building the solution, do the following to run the application:

  1. F5 キーを押すか、実行可能ファイルの場所 (ImageListener\bin\Debug\ImageListener.exe) を参照し、サービスを実行します。Press F5, or browse to the executable file location (ImageListener\bin\Debug\ImageListener.exe), to run the service. 次の手順を実行するために必要なため、アプリケーションを実行したままにします。Keep the app running, as it's required to perform the next step.
  2. コマンド プロンプトのアドレスをコピーし、ブラウザーに貼り付けて画像を確認します。Copy and paste the address from the command prompt into a browser to see the image.
  3. 完了したら、コマンド プロンプト ウィンドウで Enter キーを押して、アプリを閉じます。When you are finished, press Enter in the command prompt window to close the app.

次の手順Next steps

ここでは、Azure Relay サービスを使用するアプリケーションを構築しました。詳細については、次の記事を参照してください。Now that you've built an application that uses the Azure Relay service, see the following articles to learn more: