Elsa Studio
In this topic, we will create a separate ASP.NET Blazor Webassembly ASP.NET Blazor Server app and turn it into an Elsa Studio that connects to the workflow server.
Setup
To setup Elsa Studio, we'll go through the following steps:
Create a New Blazor Webassembly App
Execute the following command in the terminal:
dotnet new blazorwasm-empty -n "ElsaStudioBlazorWasm" -f net7.0Add Elsa Studio Packages
Navigate to the root directory of your project and integrate the following Elsa Studio packages:
cd ElsaStudioBlazorWasm dotnet add package Elsa.Studio dotnet add package Elsa.Studio.Core.BlazorWasm dotnet add package Elsa.Studio.Login.BlazorWasm dotnet add package Elsa.Api.ClientModify Program.cs
Open the Program.cs file and replace its existing content with the code provided below:
Program.cs
using Elsa.Studio.Dashboard.Extensions; using Elsa.Studio.Shell; using Elsa.Studio.Shell.Extensions; using Elsa.Studio.Workflows.Extensions; using Elsa.Studio.Contracts; using Elsa.Studio.Core.BlazorWasm.Extensions; using Elsa.Studio.Extensions; using Elsa.Studio.Login.BlazorWasm.Extensions; using Elsa.Studio.Login.HttpMessageHandlers; using Elsa.Studio.Workflows.Designer.Extensions; using Microsoft.AspNetCore.Components.Web; using Microsoft.AspNetCore.Components.WebAssembly.Hosting; // Build the host. var builder = WebAssemblyHostBuilder.CreateDefault(args); var configuration = builder.Configuration; // Register root components. builder.RootComponents.Add<App>("#app"); builder.RootComponents.Add<HeadOutlet>("head::after"); builder.RootComponents.RegisterCustomElsaStudioElements(); // Register shell services and modules. builder.Services.AddCore(); builder.Services.AddShell(); builder.Services.AddRemoteBackend( elsaClient => elsaClient.AuthenticationHandler = typeof(AuthenticatingApiHttpMessageHandler), options => configuration.GetSection("Backend").Bind(options)); builder.Services.AddLoginModule(); builder.Services.AddDashboardModule(); builder.Services.AddWorkflowsModule(); // Build the application. var app = builder.Build(); // Run each startup task. var startupTaskRunner = app.Services.GetRequiredService<IStartupTaskRunner>(); await startupTaskRunner.RunStartupTasksAsync(); // Run the application. await app.RunAsync();Remove Unnecessary Files
For a cleaner project structure, delete the following directories and files:
wwwroot/css
Pages
App.razor
MainLayout.razor
_Imports.razor
Generate appsettings.json
Within the
wwwroot
directory, create a newappsettings.json
file and populate it with the following content:wwwroot/appsettings.json
{ "Backend": { "Url": "https://localhost:5001/elsa/api" } }Update index.html
To conclude the setup, open the
index.html
file and replace its content with the code showcased below:wwwroot/index.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/> <title>MyApplication</title> <base href="/"/> <link rel="apple-touch-icon" sizes="180x180" href="_content/Elsa.Studio.Shell/apple-touch-icon.png"> <link rel="icon" type="image/png" sizes="32x32" href="_content/Elsa.Studio.Shell/favicon-32x32.png"> <link rel="icon" type="image/png" sizes="16x16" href="_content/Elsa.Studio.Shell/favicon-16x16.png"> <link rel="manifest" href="_content/Elsa.Studio.Shell/site.webmanifest"> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap" rel="stylesheet" /> <link href="https://fonts.googleapis.com/css2?family=Ubuntu:wght@300;400;500;700&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@400;500;600;700&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Grandstander:wght@100&display=swap" rel="stylesheet"> <link href="_content/MudBlazor/MudBlazor.min.css" rel="stylesheet" /> <link href="_content/CodeBeam.MudBlazor.Extensions/MudExtensions.min.css" rel="stylesheet" /> <link href="_content/Radzen.Blazor/css/material-base.css" rel="stylesheet" > <link href="_content/Elsa.Studio.Shell/css/shell.css" rel="stylesheet"> <link href="ElsaStudioBlazorWasm.styles.css" rel="stylesheet"> </head> <body> <div id="app"> <div class="loading-splash mud-container mud-container-maxwidth-false"> <h5 class="mud-typography mud-typography-h5 mud-primary-text my-6">Loading...</h5> </div> </div> <div id="blazor-error-ui"> An unhandled error has occurred. <a href="" class="reload">Reload</a> <a class="dismiss">🗙</a> </div> <script src="_content/BlazorMonaco/jsInterop.js"></script> <script src="_content/BlazorMonaco/lib/monaco-editor/min/vs/loader.js"></script> <script src="_content/BlazorMonaco/lib/monaco-editor/min/vs/editor/editor.main.js"></script> <script src="_content/MudBlazor/MudBlazor.min.js"></script> <script src="_content/CodeBeam.MudBlazor.Extensions/MudExtensions.min.js"></script> <script src="_content/Radzen.Blazor/Radzen.Blazor.js"></script> <script src="_framework/blazor.webassembly.js"></script> </body> </html>
Create a New Blazor Server App
Kickstart your project by generating a new Blazor Server application using the following command:
dotnet new blazorserver-empty -n "ElsaStudioBlazorServer" -f net7.0Add Elsa Studio Packages
Navigate to the root directory of your project and integrate the following Elsa Studio packages:
cd ElsaStudioBlazorServer dotnet add package Elsa.Studio dotnet add package Elsa.Studio.Core.BlazorServer dotnet add package Elsa.Studio.Login.BlazorServer dotnet add package Elsa.Api.ClientModify Program.cs
Open the Program.cs file and replace its existing content with the code provided below:
Program.cs
using Elsa.Studio.Core.BlazorServer.Extensions; using Elsa.Studio.Dashboard.Extensions; using Elsa.Studio.Extensions; using Elsa.Studio.Login.BlazorServer.Extensions; using Elsa.Studio.Login.HttpMessageHandlers; using Elsa.Studio.Shell.Extensions; using Elsa.Studio.Workflows.Extensions; using Elsa.Studio.Workflows.Designer.Extensions; // Build the host. var builder = WebApplication.CreateBuilder(args); var configuration = builder.Configuration; // Register Razor services. builder.Services.AddRazorPages(); builder.Services.AddServerSideBlazor(options => { // Register the root components. options.RootComponents.RegisterCustomElsaStudioElements(); }); // Register shell services and modules. builder.Services.AddCore(); builder.Services.AddShell(options => configuration.GetSection("Shell").Bind(options)); builder.Services.AddRemoteBackend( elsaClient => elsaClient.AuthenticationHandler = typeof(AuthenticatingApiHttpMessageHandler), options => configuration.GetSection("Backend").Bind(options)); builder.Services.AddLoginModule(); builder.Services.AddDashboardModule(); builder.Services.AddWorkflowsModule(); // Configure SignalR. builder.Services.AddSignalR(options => { // Set MaximumReceiveMessageSize to handle large workflows. options.MaximumReceiveMessageSize = 5 * 1024 * 1000; // 5MB }); // Build the application. var app = builder.Build(); // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) { app.UseResponseCompression(); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.MapBlazorHub(); app.MapFallbackToPage("/_Host"); // Run the application. app.Run();Remove Unnecessary Files
For a cleaner project structure, eliminate the following directories and files:
wwwroot/css
Pages/Index.razor
App.razor
MainLayout.razor
Update appsettings.json
Update the
appsettings.json
file with the following content:appsettings.json
{ "Backend": { "Url": "https://localhost:5001/elsa/api" } }Update _Host.cshtml
To conclude the setup, open the
_Host.cshtml
file and replace its content with the code showcased below:Pages/_Host.cshtml
@page "/" @using Elsa.Studio.Shell @using Microsoft.AspNetCore.Components.Web @namespace ElsaStudioBlazorServer.Pages @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"/> <meta name="viewport" content="width=device-width, initial-scale=1.0"/> <base href="~/"/> <link rel="apple-touch-icon" sizes="180x180" href="_content/Elsa.Studio.Shell/apple-touch-icon.png"> <link rel="icon" type="image/png" sizes="32x32" href="_content/Elsa.Studio.Shell/favicon-32x32.png"> <link rel="icon" type="image/png" sizes="16x16" href="_content/Elsa.Studio.Shell/favicon-16x16.png"> <link rel="manifest" href="_content/Elsa.Studio.Shell/site.webmanifest"> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap" rel="stylesheet"/> <link href="https://fonts.googleapis.com/css2?family=Ubuntu:wght@300;400;500;700&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@400;500;600;700&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Grandstander:wght@100&display=swap" rel="stylesheet"> <link href="_content/MudBlazor/MudBlazor.min.css" rel="stylesheet"/> <link href="_content/CodeBeam.MudBlazor.Extensions/MudExtensions.min.css" rel="stylesheet"/> <link href="_content/Radzen.Blazor/css/material-base.css" rel="stylesheet"> <link href="_content/Elsa.Studio.Shell/css/shell.css" rel="stylesheet"> <link href="Elsa.Studio.Host.Server.styles.css" rel="stylesheet"> <component type="typeof(HeadOutlet)" render-mode="ServerPrerendered"/> </head> <body> <component type="typeof(App)" render-mode="ServerPrerendered" /> <div id="blazor-error-ui"> <environment include="Staging,Production"> An error has occurred. This application may no longer respond until reloaded. </environment> <environment include="Development"> An unhandled exception has occurred. See browser dev tools for details. </environment> <a href="" class="reload">Reload</a> <a class="dismiss">🗙</a> </div> <script src="_content/BlazorMonaco/jsInterop.js"></script> <script src="_content/BlazorMonaco/lib/monaco-editor/min/vs/loader.js"></script> <script src="_content/BlazorMonaco/lib/monaco-editor/min/vs/editor/editor.main.js"></script> <script src="_content/MudBlazor/MudBlazor.min.js"></script> <script src="_content/CodeBeam.MudBlazor.Extensions/MudExtensions.min.js"></script> <script src="_content/Radzen.Blazor/Radzen.Blazor.js"></script> <script src="_framework/blazor.server.js"></script> </body> </html>
Launch the Application
To see your application in action, execute the following command:
Your application is now accessible at https://localhost:6001.
Your application is now be accessible at https://localhost:7001.
By default, you can log in using:
Source Code
The source code for this chapter can be found here
The source code for this chapter can be found here