見出し画像

73. 最新のWCF を試す

前回の記事                        次回の記事

はじめに

チュートリアル: Windows Communication Foundation アプリケーション入門 - WCF | Microsoft Learn の記事を読むと、WCF より gRPC? という気もしますが、久しぶりの WCF の最新がどうなっているのかを試したい気持ちが強いので、WCF によるサービス構築、クライアント作成を試みることにします。

サービスコントラクトを作成する

では、早速。
先ずは、チュートリアル: Windows Communication Foundation サービス コントラクトを定義する - WCF | Microsoft Learn の記事を試していきます。

プロジェクトの作成

先ずは、WCFサービスライブラリ用のプロジェクトテンプレートを使って作成するようです。

WCFサービスライブラリプロジェクトの作成

おや?.NET 4.8.1 ですか。。。ずいぶん古いですね。。。一抹の不安

サービスコントラクトの定義

次にサービスコントラクトの定義を行います。サービスコントラクトとは、Web から公開する API セットの定義です。プロジェクト作成時に自動的に作られたファイルの IService.cs と Service.cs を流用します。
これら二つのファイルの名前をまずは変更します。

ファイル名の変更

ファイル名(拡張子は変えない)を変更すると、図の様なダイアログが表示されます。”はい”をクリックすると、対象ファイル内のファイル名と同一の部分を自動的に変更後の名前に合わせて更新してくれます。二つのファイル名を変えて、チュートリアルのサンプルコードに置き換えます。

ICalculator.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace WcfServiceLibraryTest
{
    // メモ: [リファクター] メニューの [名前の変更] コマンドを使用すると、コードと config ファイルの両方で同時にインターフェイス名 "IService1" を変更できます。
    [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
    public interface ICalculator
    {
        [OperationContract]
        double Add(double n1, double n2);
        [OperationContract]
        double Subtract(double n1, double n2);
        [OperationContract]
        double Multiply(double n1, double n2);
        [OperationContract]
        double Divide(double n1, double n2);
    }
}

interface を定義して、ServiceContract 属性をつければ、Web サービスのエンドポイントになり、method に OperationContract 属性をつけると、エンドポイントの operation になります。

CalculatorService.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace WcfServiceLibraryTest
{
    // メモ: [リファクター] メニューの [名前の変更] コマンドを使用すると、コードと config ファイルの両方で同時にクラス名 "Service1" を変更できます。
    public class CalculatorService : ICalculator
    {
        public string GetData(int value)
        {
            return string.Format("You entered: {0}", value);
        }

        public double Add(double n1, double n2)
        {
            double result = n1 + n2;
            Console.WriteLine("Received Add({0},{1})", n1, n2);
            // Code added to write output to the console window.
            Console.WriteLine("Return: {0}", result);
            return result;
        }

        public double Subtract(double n1, double n2)
        {
            double result = n1 - n2;
            Console.WriteLine("Received Subtract({0},{1})", n1, n2);
            Console.WriteLine("Return: {0}", result);
            return result;
        }

        public double Multiply(double n1, double n2)
        {
            double result = n1 * n2;
            Console.WriteLine("Received Multiply({0},{1})", n1, n2);
            Console.WriteLine("Return: {0}", result);
            return result;
        }

        public double Divide(double n1, double n2)
        {
            double result = n1 / n2;
            Console.WriteLine("Received Divide({0},{1})", n1, n2);
            Console.WriteLine("Return: {0}", result);
            return result;
        }

    }
}


サービスコントラクトの実装

チュートリアル: Windows Communication Foundation のサービス コントラクトを実装する - WCF | Microsoft Learn に従って作業します。

元々 Service.cs だったファイルを CalculatorService.cs に名前を変更して内容を以下の様に編集します。

CalculatorService.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace WcfServiceLibraryTest
{
    // メモ: [リファクター] メニューの [名前の変更] コマンドを使用すると、コードと config ファイルの両方で同時にクラス名 "Service1" を変更できます。
    public class CalculatorService : ICalculator
    {
        public string GetData(int value)
        {
            return string.Format("You entered: {0}", value);
        }

        public double Add(double n1, double n2)
        {
            double result = n1 + n2;
            Console.WriteLine("Received Add({0},{1})", n1, n2);
            // Code added to write output to the console window.
            Console.WriteLine("Return: {0}", result);
            return result;
        }

        public double Subtract(double n1, double n2)
        {
            double result = n1 - n2;
            Console.WriteLine("Received Subtract({0},{1})", n1, n2);
            Console.WriteLine("Return: {0}", result);
            return result;
        }

        public double Multiply(double n1, double n2)
        {
            double result = n1 * n2;
            Console.WriteLine("Received Multiply({0},{1})", n1, n2);
            Console.WriteLine("Return: {0}", result);
            return result;
        }

        public double Divide(double n1, double n2)
        {
            double result = n1 / n2;
            Console.WriteLine("Received Divide({0},{1})", n1, n2);
            Console.WriteLine("Return: {0}", result);
            return result;
        }

    }
}

サービスコントラクトとして定義した interface の実装を作れば OK という事です。
次は、App.config です。
行数…そういえば、私の Visual Studio の環境ではテキストエディタの行番号を表示していなかったので、いい機会なので表示するようにしておきます。Visual Studio のメニューで、”ツール”→”オプション”で変更します。

行番号表示設定

さて、app.config を修正するとのことですが、Microsoft Learn のドキュメントと実際に生成されたコードは微妙に違っていました。IService.cs ファイル等の名前を変更したことによる自動修正の影響もあるのですが、リストアップしておくと、

  • 14行目 → CalculatorService になっていた。ファイル名変更のおかげ

  • 22行目 → 実際のファイルの15行目と思われる。ICaluclator になっていた。basicHttpBinding になっていた

  • 17行目 → 23行目と思われる。ポート番号も含め(:8xxxx/Design_Time_Addresses/)と微妙に違うので適宜修正。ここは、Service1になっていたので、CalculatorServiceに変更

結果として、

app.config の修正

こんな風に修正。

ビルド

問題なく成功。よしよし。

WCFサービスを実行する

ここまで作っていたのはライブラリなので、定義・実装したサービスコントラクトをホストするアプリケーションが必要です。
チュートリアル: 基本的な Windows Communication Foundation サービスをホストおよび実行する - WCF | Microsoft Learn に従って作業を進めます。
先ずは、ホストするアプリケーションを作成します。
今回は、C# コンソールアプリを使います。

ここから先は

10,417字 / 13画像

2022年3月にマイクロソフトの中の人から外の人になった Embedded D. George が、現時点で持っている知識に加えて、頻繁に…

この記事が気に入ったらチップで応援してみませんか?