.NET 5 への移行 - WCF をどうすべきか？

こんにちは！

.NET 5 (もしくは2021年にリリースされる .NET 6) へ、移行を検討しているお客様の声をお聞きするようになりました。

その中でも、 Windows Communication Foundation (以下 WCF) をどう取り扱うべきか？についてお話したいと思います。


## .NET 5 でサポート対象外となった WCF

既にご存知の方も多いかと思いますが、.NET 5 は、WCF はサポートされていません。

> Web Forms、Windows Communication Foundation (WCF) サーバー、Windows Workflow を含め、もっと "レガシ" な API のいくつかはサポートされません。これらは、.NET Framework のみに留まることになります。.NET 5 内で同じ機能性を実現したい場合は、これらの API を次のように移植することを検討してください。

> ASP.NET Web Forms => ASP.NET Blazor

> WCF サーバーおよびリモート => gRPC

> Windows Workflow (WF) => Core WF (github.com/UiPath/corewf)


> 以下ページより抜粋

> https://docs.microsoft.com/ja-jp/archive/msdn-magazine/2019/july/csharp-net-reunified-microsoft%E2%80%99s-plans-for-net-5


そのため、現行システムで WCF をご利用している場合は、何かしらの対策が必要となります。

## 移行の選択肢

### 比較表

ざっくりですが、これから紹介する移行先についての比較表です。

| 移行先 | 移行コストの低さ | 信頼性 | 概要 |
| ---- | ---- |---- |---- |
| ASP.NET Core Web API  | ★★★ | ★★★ | MS が支えているテクノロジー |
| gRPC  | ★☆☆ | ★★★ |  Google がメインサポート |
| CoreWCF | ★★☆ | ★☆☆  |  正規版のリリースがまだ、将来性に期待  |

### ASP.NET Core Web API (REST-API)

まずは、ASP.NET Core Web API です。

WCF と同じく Microsoft 社が提供しているテクノロジーであるため、移行コストを低く抑えることができます。

WCF で利用していたパラメータクラスも、ほぼそのまま流用することが出来ます。

例えば、WCF で通信するパラメータクラスは以下のように定義しますが、ASP.NET Core WebAPI で取り扱うパラメータも、WCF と同様にクラス定義で実現でき、また、API として公開するためのメソッドの定義も、WCF とほとんど同じ形式で実装することが出来ます。

#### WCFの場合 

<b>パラメータクラス</b>

```cs

    [DataContract]
    public class CompositeType
    {
        bool boolValue = true;
        string stringValue = "Hello ";

        [DataMember]
        public bool BoolValue
        {
            get { return boolValue; }
            set { boolValue = value; }
        }

        [DataMember]
        public string StringValue
        {
            get { return stringValue; }
            set { stringValue = value; }
        }
    }
```

<b>API の定義</b>

```cs
 public class Service1 : IService1
    {
        public CompositeType GetDataUsingDataContract(CompositeType composite)
        {
            if (composite == null)
            {
                throw new ArgumentNullException("composite");
            }
            if (composite.BoolValue)
            {
                composite.StringValue += "Suffix";
            }
            return composite;
        }
    }
```

#### ASP.NET Core WebAPI の場合 

<b>パラメータクラス</b>

```cs

public class WeatherForecast
{
    public DateTime Date { get; set; }
    public int TemperatureC { get; set; }
    public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
    public string Summary { get; set; }
}

```

<b>API の定義</b>

```cs
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{

    [HttpGet]
    public IEnumerable<WeatherForecast> Get()
    {
        var rng = new Random();
        return Enumerable.Range(1, 5).Select(index => new WeatherForecast
        {
            Date = DateTime.Now.AddDays(index),
            TemperatureC = rng.Next(-20, 55),
            Summary = Summaries[rng.Next(Summaries.Length)]
        })
        .ToArray();
    }

    private static readonly string[] Summaries = new[]
    {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

    private readonly ILogger<WeatherForecastController> _logger;

    public WeatherForecastController(ILogger<WeatherForecastController> logger)
    {
        _logger = logger;
    }

}
```

### gRPC

Google 社が開発した新しい通信技術です。

https://docs.microsoft.com/ja-jp/aspnet/core/tutorials/grpc/grpc-start?view=aspnetcore-5.0&tabs=visual-studio

Microsoft でもサポートされている通信技術であり、Visual Studio からテンプレートを選択することで、簡単に作成することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48623/926caf4d-e6fb-09d8-2ca2-8c8051a0cd15.png)


WCF と比較すると、パラメータ定義の方法が大きく異なり、 .proto ファイルというファイルでパラメータを定義します。
つまり、WCF からの移行の場合、全てのパラメータを再定義する必要があります。
そのため、ASP.NET Core Web API と比較すると、コストが多く掛かります。

<b>パラメータ定義</b>

```javascript
syntax = "proto3";

option csharp_namespace = "GrpcService1";

package greet;

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply);
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings.
message HelloReply {
  string message = 1;
}

```


<b>API の定義</b>

```cs
public class GreeterService : Greeter.GreeterBase
{
    private readonly ILogger<GreeterService> _logger;
    public GreeterService(ILogger<GreeterService> logger)
    {
        _logger = logger;
    }

    public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
    {
        return Task.FromResult(new HelloReply
        {
            Message = "Hello " + request.Name
        });
    }
}
```



### CoreWCF

最後の選択肢としては、 WCF を .NET 5 でも取り扱う事が出来るように出来る Core WCF というライブラリです。

注意点としては、正式リリースが未だされておらず (v0.2.1が最新 - 2021年8月時点)、まだ実際に導入するべきタイミングではありません。


> WCF サーバーのサポートが行われないことは、一部の人にとって間違いなく残念なことです。しかし、Microsoft では最近、MIT オープン ソース ライセンス下でソフトウェアをリリースすることを決定しました。このソフトウェアはコミュニティの管理下に入ることになります (github.com/CoreWCF/CoreWCF を参照)。.NET Framework を独立してリリースするにはまだ行うべき作業がたくさんありますが、その間にも、クライアント側の WCF API は利用可能です (github.com/dotnet/wcf を参照)。


> 以下ページより抜粋

> https://docs.microsoft.com/ja-jp/archive/msdn-magazine/2019/july/csharp-net-reunified-microsoft%E2%80%99s-plans-for-net-5



今後、開発が進み、現行の WCF と同様の使い方ができる可能性はありますが、現段階では、あまり推奨できる選択肢ではありません。

https://github.com/CoreWCF/CoreWCF

## まとめ

それぞれの移行先を、あらためてまとめると以下のようになります。

・ASP.NET Core Web API .. 移行コストをかなり抑えることが出来る、使い慣れたマイクロソフトテクノロジーで開発できる

・gRPC ... 移行時に伴いコストは増えるが、最新の通信技術を採用したい場合におすすめ

・CoreWCF ... まだまだ移行計画が先であり、正式リリース後にタイミングがあえば検討の余地あり

また、今後も WCF を包括する .NET Framework のサポートは継続して行われますので、今すぐに移行する必要はありませんが、いずれ対応すべきタイミングが訪れます。

その際に、慌てて対応を行うよりは、早めに計画し、準備を進めていきたいですね。

弊社では、このような技術的なご相談なども受け付けておりますので、ご興味がある方は<a href="https://jp.infragistics.com/about-us/contact-us#contactform" target="_blank">こちら</a>からお気軽にご相談ください。



## 技術サポート・無料オンライン相談会をご利用ください

インフラジスティックスのUI製品は多くの機能を備えているためドキュメントの情報量も多く、なかなかお探しの情報に辿り着けない場合もあります。そういった際はお気軽に技術サポートや、製品導入支援担当との無料オンライン相談会をご予約いただくことで検証時間を節約可能ですので、ぜひご活用ください。<br>
<a href="https://jp.infragistics.com/support/dev-support" target="_blank">技術サポートへの問い合わせ方法を確認する</a><br>
<a href="https://jp.infragistics.com/free-consultation" target="_blank">無料オンライン相談会を予約する</a>