https://a.storyblok.com/f/270183/24370/0b8a2ff5df/blog_asp-net_sms-signalr_1200x600.png

ASP.NET Core MVCとSignalRでSMSメッセージを受信する方法

最終更新日 November 5, 2020

所要時間:4 分

このチュートリアルでは、SMSメッセージを Vonage Messages APIから SMS メッセージを受信し、リアルタイムでブラウザにプッシュする方法を学びます。API サーバーと Web ページには ASP.NET Core MVC を使用し、SMS メッセージをリアルタイムで受信するために SignalR を使用します。

コードへジャンプ

このデモからコードを引っ張ってくるだけなら、すべて GitHub.

前提条件

  • Vonage APIアカウントが必要です。

  • 最新バージョンの .NET Core 3.1 SDK

  • Visual Studio 2019、Visual Studio for Mac、またはVisual Studio Codeのいずれかが必要です。

  • オプション:私は Ngrokを使ってテストしました。

アプリの作成

Visual Studioを開き、"Create a new project "をクリックし、"ASP.NET Core Web Application "を選択し、"Next "をクリックします。アプリケーション名を "ReceiveSmsAspNetCoreMvc "とします。次のページで、"Web Application (Model-View-Controller)" を選択し、"Create" をクリックします。

依存関係のインストール

SignalRを使用しているので、2種類の依存関係を追加する必要があります。まず、NuGetパッケージの依存関係を追加する必要があります。次に、クライアント・パッケージの依存関係を追加する必要があります。

NuGetの依存関係

2つのNuGetパッケージをインストールする必要がある:

Vonage Microsoft.AspNetCore.SignalR.Core

これには複数の方法があるが、ここではdotnet CLIを使うことにする。プロジェクトのプロジェクト・ディレクトリに移動し、以下を実行する:

dotnet add package Vonage dotnet add package Microsoft.AspNetCore.SignalR.Core --version 1.1.0

クライアント側パッケージ

SignalR Client-Sideライブラリに依存しているので、SignalR Client-Sideライブラリも追加する必要がある。

Visual Studioでプロジェクトを右クリックします。 wwwroootに進みます。 Add > Client-Side Library.すると、ライブラリを追加するための小さなダイアログが表示される。このデモでは、以下を使用した。

  • プロバイダーunpkg

  • ライブラリMicrosoft/signalr@latest

  • 特定のファイルを選択します:選択したのは Files/dist/browser/signalr.jsそして Files/dist/browser/signalr.min.js

  • ターゲットの場所wwwroot/js/signalr

フォームに記入すると、次のようになります:

Adding a Client Side library in Visual StudioAdding a Client Side library in Visual Studio

このフォームに記入した後、インストールをクリックすると、必要なファイルが以下の場所にインストールされます。 wwwroot/js/signalr

SMSハブの作成

SignalRの仕組みは、クライアント・ブラウザがHubと呼ばれるものに接続する。Hubは、サーバーから各クライアントにメッセージをプッシュする。一般的にはWebSocketだが、Server-Side-Events(SSE)やLong-Pollingを使うこともできる。サーバーとブラウザークライアントを接続するために、サーバーにHubを作成する必要があります。

プロジェクトの下に Hubs.そのフォルダーの下に、新しいC#ファイル SmsHub.cs.このファイルは大したことをする必要はない。Hubクラスを拡張するクラスを宣言するだけです。このファイルは以下のようにする。

using Microsoft.AspNetCore.SignalR;

namespace ReceiveSmsAspNetCoreMvc.Hubs
{
    public class SmsHub : Hub
    {
    }
}

ミドルウェアの設定

サービスの設定

次に startup.csファイルに入り、SignalRエンドポイントをミドルウェアに追加する必要がある。ミドルウェアを追加することで、SMSハブ・ルートが立ち上がり、ブラウザ・クライアントでSignalRを使えるようになる。それでは startup.csを開いて ConfigureServicesメソッドにたどり着きます。このメソッドに services.AddSignalR();SignalRミドルウェアをサーバーに追加します。これが終わると ConfigureServicesメソッドはこのようになります:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    services.AddSignalR();
}

設定

滞在する startup.csでいて Configureメソッドを見つける。このメソッドには app.UseEndpoints関数を引数として取り、その関数の中で SmsHubをパス /smsHub.を呼び出す。 app.UseEndpointsの呼び出しは次のようになる:

app.UseEndpoints(endpoints =>
{
    endpoints.MapHub<SmsHub>("/smsHub");
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
});

SMSコントローラーの構築

ミドルウェアの準備ができたので、VonageからSMSを受け取るメソッドを追加する必要がある。空のMVC Controllerを使います。Controllersフォルダを右クリックし、add -> Controllerと進み、"MVC Controller - Empty "を選択して "Add "をクリックします。 SmsControllerという名前を付けて、もう一度「追加」をクリックします。

SmsHubのコンテキストを注入する

最初に必要なのは SmsControllerを注入する。 HubContextに対して SmsHub.という IHubContextというプロパティを宣言します。 HubContextというプロパティを宣言し SmsControllerコンストラクタを宣言する。 IHubContextを引数として取り、このパラメータを HubContextプロパティに代入します。依存性注入のマジックによって、コントローラは作成時にハブコンテキストを受け取ります。

/// <summary>
/// Allows access to all browser clients subscribed through the /smsHub
/// </summary>
public IHubContext<SmsHub> HubContext { get; set; }

public SmsController(IHubContext<SmsHub> hub)
{
    HubContext = hub;
}

受信SMSハンドラの追加

Hub Context にアクセスできるようになったので、受信 SMS 用の API ルートを追加する必要がある。このルートは、Vonage がアプリケーションに Webhook を送信する際に使用するルートになります。このメソッドはリクエストを受け取り、そこから InboundSms オブジェクトをパースし、アプリケーションに接続されているすべてのクライアントに InboundSmsシグナルを送信します。このメソッドは、MSISDNとメッセージのテキストをユーザーにプッシュする。参考までに、MSISDNはメッセージの発信元の番号である。以下を SmsController.

[HttpPost("webhooks/inbound-sms")]
public async Task<IActionResult> InboundSms()
{
    using (var reader = new StreamReader(Request.Body))
    {
        var json = await reader.ReadToEndAsync();
        var inbound = JsonConvert.DeserializeObject<InboundSms>(json);
        await HubContext.Clients.All.SendAsync("InboundSms", inbound.Msisdn, inbound.Text);
    }
    return NoContent();
}

フロントエンドの構築

ここまでできたら、あとはアプリにフロントエンドを追加するだけだ。そのために、ホーム・ビューを引き継ぐことにする。開く /Vies/Home/Index.cshtmlを開き、ウェルカムテキストを含むdivを削除してください。

次に、スクリプトのインポートをいくつか追加します。インポートするのは ~/js/sms.js(先ほどインポートしたクライアント・ライブラリである ~/js/signalr/dist/browser/signalr.jsこれは、前にインポートしたクライアント・ライブラリです。この2つのタグを追加すればOKだ。

<a href="http://~/js/signalr/dist/browser/signalr.js">http://~/js/signalr/dist/browser/signalr.js</a>
<a href="http://~/js/sms.js">http://~/js/sms.js</a>

最後に、メッセージを表示するテーブルを追加します。カラムは2つだけ、 From Numberそして Message- と MsisdnTextに対応します。

<h1>Messages</h1>

<table class="table" id="messageList">
    <thead>
        <tr>
            <th>From Number</th>
            <th>Message</th>
        </tr>
    </thead>
    <tbody>

    </tbody>
</table>

SignalRイベントハンドラの追加

最後に必要なのは、イベント・ハンドラを追加することです。 InboundSmsイベントハンドラを追加することです。先ほど参照した sms.jsファイルに追加します。先に進んで sms.jsファイルを /wwwroot/jsディレクトリにファイルを追加してください。このファイルでやるべきことは3つある。

  1. smsHubへのSignalR接続の構築

  2. のイベントハンドラを登録する。 InboundSmsイベントハンドラを登録する。

  3. SignalRの接続を開始します。

この3つをすべて実行するには、次のように sms.jsファイルに追加する。

"use strict";

var connection = new signalR.HubConnectionBuilder().withUrl("/smsHub").build();

connection.on("InboundSms", function (fromNumber, text) {
    var rowHtml =
        '<tr><td>' +
        fromNumber +
        '</td><td>' +
        text +
        '</td></tr>';
    $('#messageList tbody').append(rowHtml);
});

connection.start()
    .then(function () {
        console.log("connection started");
    })
    .catch(function (err) {
        console.log("Error encountered: " + err);
    })

テスト

開発の観点からは、必要なことはこれだけなので、さっそくテストに取りかかろう。このテストを Ngrokを使ってこのデモをテストする。Ngrokを使用すると、アプリに一般にアクセス可能なトンネルを構築できるため、一般にアクセス可能なHTTPエンドポイントをアプリに公開する必要がある場合に便利だ。私のようにIIS Expressでこのデモをテストするのであれば、当社の をご覧いただきたい。をご覧いただきたい。要するに、ngrove を起動するときに --host-headerオプションを追加する必要があるということだ。

Visual Studioでcsprojファイルを右クリックし、プロパティを開きます。そこで、Debugタブをクリックします。便宜上、テスト時にはSSLを有効にするチェックボックスのチェックを外します。アプリのURLとその末尾のポート番号を控えておいてください。

The IIS configuration screenThe IIS configuration screen

ングロックを開始

次に、ngrokを立ち上げる。着信リクエストはアプリのURLからポートを指定し、ホストとポートは着信ホストヘッダを置き換えるようにします。新しいターミナルで以下のコマンドを実行してngrokを起動する(ポート番号はあなたのポートに置き換えてください)。

ngrok http --region=us --host-header="localhost:51835" 51835

このコマンドを実行すると、端末がngrokに乗っ取られる。そのURLにアクセスすると、ローカルサーバーにリクエストを転送するURLが表示されます。このURLは http://randomhash.ngrok.io.私のランダムハッシュは d98024d97b04というわけで、この説明の続きでは、この値をあなたのハッシュ値に置き換えてください。

Running Ngrok to give local access to our applicationRunning Ngrok to give local access to our application

IIS Expressでアプリを起動した後、ngrok URLにナビゲートして、それが一般にアクセス可能であることを確認できる。

ウェブフックの設定

思い出してほしい。 InboundSmsメソッドに SmsController[HttpPost("webhooks/inbound-sms")]これで http://d98024d97b04.ngrok.io/webhooks/inbound-smsへのルートを確立します。テストが始まる前に最後にしなければならないことは、先ほど説明したURLへのSMSメッセージの送信先をVonageに伝えることだ。

これを行うには、${CUSTOMER_DASHBOARD_URL}/settingsに移動しましょう。デフォルトSMS設定]で、[受信メッセージ]フィールドをそのURLに設定し、[HTTPメソッド]を POST-JSON.Save Changes(変更を保存)」をクリックし、テストの準備が整いました。ホームページに移動し、Vonage API バーチャル番号にテストメッセージを送信します。Vonageバーチャル番号がわからない場合は、ダッシュボードのNumbersの下にある ダッシュボードの「Numbers」の下にある.サーバーにメッセージを送った後、アプリに関連付けられたウェブページを見ることで、SMSメッセージがリアルタイムでサーバーに入ってくるのがわかります。

Incoming SMS messages being displayed on the screen in the application we builtIncoming SMS messages being displayed on the screen in the application we built

そして、メッセージを受信し、リアルタイムで表示するために必要なことはそれだけだ!

リソース

  • このデモのコードはすべて GitHub

シェア:

https://a.storyblok.com/f/270183/384x384/73d57fd8eb/stevelorello.png
Steve Lorelloヴォネージの卒業生

スティーブは、かつてVonageチームの一員でした。彼はVonageで.NET開発者アドボケートを務め、フルスタックかつ多言語対応のソフトウェアエンジニアであり、AI/MLの専門家でもありました。