知りたいこと
Azure SignalR Serviceのマニュアルを見ると、Functionsを接続する場合はサーバレスモードのSignalRを使ってね、と読める。下記が両立するのかを知りたい
- WebアプリとFunctionsでSignalRを共用したい
- Webアプリ側は通常のハブプログラミングモデルを使いたい
やったこと
Functionsのコード
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Microsoft.Azure.WebJobs.Extensions.SignalRService;
namespace FunctionApp1
{
public static class Function1
{
//メッセージ送信
[FunctionName("Function1")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
[SignalR(HubName = "chatsamplehub")] IAsyncCollector<SignalRMessage> signalRMessages,
ILogger log)
{
//メッセージを送信 お試しのため内容は固定値
await signalRMessages.AddAsync(
new SignalRMessage
{
Target = "BroadcastMessage",
Arguments = new[] { "name", "message" }
}
);
string responseMessage = "done";
return new OkObjectResult(responseMessage);
}
//ネゴシエート
[FunctionName("negotiate")]
public static SignalRConnectionInfo Negotiate(
[HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequest req,
[SignalRConnectionInfo(HubName = "chatsamplehub")] SignalRConnectionInfo connectionInfo)
{
return connectionInfo;
}
}
}
結果
ネゴシエート
メッセージ送信
ほかのクライアントでメッセージをちゃんと受信できている→OK
わかったこと考えたこと
デフォルトモードのSignalRにFunctionsから接続し、メッセージを送ることができた
→Webアプリがサーバ側としてSignalRに継続して接続している場合は、デフォルトモードのSignalRが使えるが、サーバ接続がない場合は、サーバレスモードを使わないといけない、ということかもしれない。