diff --git a/eng/Dependencies.props b/eng/Dependencies.props index 2e11857b1b9ad3d9e5131979922da279ade4c487..097673484fcb060759332bf414f23d9712f03a36 100644 --- a/eng/Dependencies.props +++ b/eng/Dependencies.props @@ -23,6 +23,7 @@ and are generated based on the last package release. <LatestPackageReference Include="Microsoft.AspNetCore.Mvc.Razor.Extensions" Version="$(MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion)" /> <LatestPackageReference Include="Microsoft.AspNetCore.Razor.Language" Version="$(MicrosoftAspNetCoreRazorLanguagePackageVersion)" /> <LatestPackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="$(MicrosoftBclAsyncInterfacesPackageVersion)" /> + <LatestPackageReference Include="Microsoft.Azure.SignalR" Version="$(MicrosoftAzureSignalRPackageVersion)" /> <LatestPackageReference Include="Microsoft.CodeAnalysis.Common" Version="$(MicrosoftCodeAnalysisCommonPackageVersion)" /> <LatestPackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="$(MicrosoftCodeAnalysisCSharpWorkspacesPackageVersion)" /> <LatestPackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="$(MicrosoftCodeAnalysisCSharpPackageVersion)" /> diff --git a/eng/Versions.props b/eng/Versions.props index c27a506f3293314ae7a7dbe3fd2772d6e065af40..ff8bc1a52c3d91d56f62feb8d0456bb177175ebe 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -206,6 +206,7 @@ <MicrosoftAzureKeyVaultPackageVersion>2.3.2</MicrosoftAzureKeyVaultPackageVersion> <MicrosoftAzureStorageBlobPackageVersion>10.0.1</MicrosoftAzureStorageBlobPackageVersion> <MicrosoftBuildPackageVersion>15.8.166</MicrosoftBuildPackageVersion> + <MicrosoftAzureSignalRPackageVersion>1.2.0</MicrosoftAzureSignalRPackageVersion> <MicrosoftBuildFrameworkPackageVersion>15.8.166</MicrosoftBuildFrameworkPackageVersion> <MicrosoftBuildLocatorPackageVersion>1.2.6</MicrosoftBuildLocatorPackageVersion> <MicrosoftBuildUtilitiesCorePackageVersion>15.8.166</MicrosoftBuildUtilitiesCorePackageVersion> diff --git a/src/SignalR/perf/benchmarkapps/Crankier/Commands/ServerCommand.cs b/src/SignalR/perf/benchmarkapps/Crankier/Commands/ServerCommand.cs index cb1ef585b6612699c3f3d67a0fb5d8c2bdfbaad6..738d3232fdba22da546ce9cea2de9c2672779713 100644 --- a/src/SignalR/perf/benchmarkapps/Crankier/Commands/ServerCommand.cs +++ b/src/SignalR/perf/benchmarkapps/Crankier/Commands/ServerCommand.cs @@ -11,6 +11,7 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using Microsoft.AspNetCore.SignalR.Crankier.Server; +using System.Collections.Generic; namespace Microsoft.AspNetCore.SignalR.Crankier.Commands { @@ -21,6 +22,7 @@ namespace Microsoft.AspNetCore.SignalR.Crankier.Commands app.Command("server", cmd => { var logLevelOption = cmd.Option("--log <LOG_LEVEL>", "The LogLevel to use.", CommandOptionType.SingleValue); + var azureSignalRConnectionString = cmd.Option("--azure-signalr-connectionstring <CONNECTION_STRING>", "Azure SignalR Connection string to use", CommandOptionType.SingleValue); cmd.OnExecute(() => { @@ -30,18 +32,31 @@ namespace Microsoft.AspNetCore.SignalR.Crankier.Commands { return InvalidArg(logLevelOption); } - return Execute(logLevel); + + if (azureSignalRConnectionString.HasValue() && string.IsNullOrWhiteSpace(azureSignalRConnectionString.Value())) + { + return InvalidArg(azureSignalRConnectionString); + } + + return Execute(logLevel, azureSignalRConnectionString.Value()); }); }); } - private static int Execute(LogLevel logLevel) + private static int Execute(LogLevel logLevel, string azureSignalRConnectionString) { Console.WriteLine($"Process ID: {Process.GetCurrentProcess().Id}"); - var config = new ConfigurationBuilder() - .AddEnvironmentVariables(prefix: "ASPNETCORE_") - .Build(); + var configBuilder = new ConfigurationBuilder() + .AddEnvironmentVariables(prefix: "ASPNETCORE_"); + + if (azureSignalRConnectionString != null) + { + configBuilder.AddInMemoryCollection(new [] { new KeyValuePair<string, string>("Azure:SignalR:ConnectionString", azureSignalRConnectionString) }); + Console.WriteLine("Using Azure SignalR"); + } + + var config = configBuilder.Build(); var host = new WebHostBuilder() .UseConfiguration(config) diff --git a/src/SignalR/perf/benchmarkapps/Crankier/Crankier.csproj b/src/SignalR/perf/benchmarkapps/Crankier/Crankier.csproj index 1bc1e98bd68fb235832c57cb729064089a6e9b77..23ae6b00273362753e41109f822a3db66bace2de 100644 --- a/src/SignalR/perf/benchmarkapps/Crankier/Crankier.csproj +++ b/src/SignalR/perf/benchmarkapps/Crankier/Crankier.csproj @@ -4,6 +4,7 @@ <OutputType>Exe</OutputType> <TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework> <RootNamespace>Microsoft.AspNetCore.SignalR.CranksRevenge</RootNamespace> + <DisableTransitiveFrameworkReferences>true</DisableTransitiveFrameworkReferences> </PropertyGroup> <ItemGroup> @@ -15,6 +16,7 @@ <Reference Include="Microsoft.AspNetCore.SignalR.Protocols.MessagePack" /> <Reference Include="Microsoft.Extensions.Logging.Console" /> <Reference Include="Newtonsoft.Json" /> + <Reference Include="Microsoft.Azure.SignalR" /> </ItemGroup> </Project> diff --git a/src/SignalR/perf/benchmarkapps/Crankier/Readme.md b/src/SignalR/perf/benchmarkapps/Crankier/Readme.md index 7b0a95fbe90af24e94d1fda47ee4cc05563624fb..dc783bcc9e66f1a3aaa63518f84320c549ff296a 100644 --- a/src/SignalR/perf/benchmarkapps/Crankier/Readme.md +++ b/src/SignalR/perf/benchmarkapps/Crankier/Readme.md @@ -14,7 +14,9 @@ The `server` command runs a web host exposing a single SignalR `Hub` endpoint on Usage: server [options] Options: - --log <LOG_LEVEL> The LogLevel to use. + --log <LOG_LEVEL> The LogLevel to use. + --azure-signalr-connectionstring <CONNECTION_STRING> Azure SignalR Connection string to use + ``` Notes: @@ -55,6 +57,12 @@ Run the server: dotnet run -- server ``` +Run the server using Azure SignalR: + +``` +dotnet run -- server --azure-signalr-connectionstring Endpoint=https://your-url.service.signalr.net;AccessKey=yourAccessKey;Version=1.0; +``` + Attempt to make 10,000 connections to the server using WebSockets and 10 workers: ``` diff --git a/src/SignalR/perf/benchmarkapps/Crankier/Server/Startup.cs b/src/SignalR/perf/benchmarkapps/Crankier/Server/Startup.cs index d8d5efc5bf0eb400d3dc745ed025a2b3a301d0aa..6b3154416c863fb70019c9ab8ac881e961633e7d 100644 --- a/src/SignalR/perf/benchmarkapps/Crankier/Server/Startup.cs +++ b/src/SignalR/perf/benchmarkapps/Crankier/Server/Startup.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; @@ -11,15 +12,23 @@ namespace Microsoft.AspNetCore.SignalR.Crankier.Server public class Startup { private readonly IConfiguration _config; + private readonly string _azureSignalrConnectionString; public Startup(IConfiguration configuration) { _config = configuration; + _azureSignalrConnectionString = configuration.GetSection("Azure:SignalR").GetValue<string>("ConnectionString", null); } public void ConfigureServices(IServiceCollection services) { - var signalrBuilder = services.AddSignalR() - .AddMessagePackProtocol(); + var signalrBuilder = services.AddSignalR(); + + if (_azureSignalrConnectionString != null) + { + signalrBuilder.AddAzureSignalR(); + } + + signalrBuilder.AddMessagePackProtocol(); services.AddSingleton<ConnectionCounter>(); @@ -30,10 +39,19 @@ namespace Microsoft.AspNetCore.SignalR.Crankier.Server { app.UseRouting(); - app.UseEndpoints(endpoints => + if (_azureSignalrConnectionString != null) + { + app.UseAzureSignalR(routes => { + routes.MapHub<EchoHub>("/echo"); + }); + } + else { - endpoints.MapHub<EchoHub>("/echo"); - }); + app.UseEndpoints(endpoints => + { + endpoints.MapHub<EchoHub>("/echo"); + }); + } } } }