対象ソフト
以下公式のリアルタイムのWebアプリのチュートリアルで作成したもの
https://docs.microsoft.com/ja-jp/aspnet/core/tutorials/signalr?view=aspnetcore-3.1&tabs=visual-studio-code
これはdotnet new webapp
で作成したWebアプリになります。
ルートパスのView
アプリケーションを起動し、ブラウザからhttp://localhost:xxxx/
にアクセスすると、
/Pages/Index.cshtml
が表示さます。
これはASP.NET Core 2.0 以降、Razor Pages の機構によるもののようです。
Hub、WebSocket周りの関連性
以下コードのendpoints.MapHub<ChatHub>("/chatHub");
部分ですが、
<ChatHub>
はハブのクラスを指定し、
("/chatHub")
でWebSocket接続を待ち受けるURLを指定しています。
// ... 省略
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages(); // Razor Pages有効化
services.AddSignalR();
services.AddSingleton<app>();
}
// ... 省略
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// ... 省略
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
endpoints.MapHub<ChatHub>("/chatHub");
});
}
ルートパスにアクセスした際に表示されるIndex.cshtml
には対応するスクリプトとして
chat.js
が指定されています。
<!-- 省略 -->
<script src="~/js/chat.js"></script>
chat.js
には/chatHub
に対してWebSocketを接続する処理があります。
var connection = new signalR.HubConnectionBuilder().withUrl("/chatHub").build();
// ...省略
connection.start().then(function () {
document.getElementById("sendButton").disabled = false;
}).catch(function (err) {
return console.error(err.toString());
});
MVCの場合
対象のソフトとしては、以下のチュートリアルで作成したものです。
https://docs.microsoft.com/ja-jp/aspnet/core/tutorials/first-mvc-app/start-mvc?view=aspnetcore-3.1&tabs=visual-studio
dotnet new mvc
でプロジェクトを作成しています。
こちらはRazor Pages の機構を使用していない作りになっています。
以下コードのpattern: "{controller=Home}/{action=Index}/{id?}");
でURLパターンを指定していますが、controller=Home
で指定されるHome
は、URLで指定されなかった場合のデフォルト値になります。
action=Index
で指定しているIndex
についても同様にデフォルト値です。
pattern: "{controller}/{action}/{id?}");
でも問題ありません。
その場合、URLとしてはlocalhost:xxxx/Home/Index
のようにアクセスすることになります。
// ...省略
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// ...省略
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
controller=Home
のHome
とは、
Controllersフォルダ以下のHomeController.csになります。
action=Index
のIndex
とは、以下コードのIndex関数になります。
// 省略
public class HomeController : Controller
{
// ...省略
public IActionResult Index()
{
return View();
}
// ...省略
}
また上記コードで実行しているreturn View();
によって、
Views/Home/Index.cshtmlがクライアントに返却されます。
以上によって、localhost:xxxx/
にアクセスした際にViews/Home/Index.cshtmlの内容が表示されます。
以下のようにページを返さないパターンもあります。
public string Index()
{
return "This is my default action...";
}