├── SP.jpg
├── SignalP.Tests
├── SignalP.Tests.csproj
├── obj
│ ├── SignalP.Tests.csproj.nuget.g.targets
│ ├── project.nuget.cache
│ ├── SignalP.Tests.csproj.nuget.g.props
│ ├── SignalP.Tests.csproj.nuget.dgspec.json
│ └── project.assets.json
└── SignalPMiddlewareTests.cs
├── SignalP.sln
├── SignalP.csproj
├── README.md
├── .gitignore
└── SignalPCore.cs
/SP.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ethan0007/SignalP/main/SP.jpg
--------------------------------------------------------------------------------
/SignalP.Tests/SignalP.Tests.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | net9.0
5 | enable
6 | enable
7 | false
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/SignalP.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Version 17
4 | VisualStudioVersion = 17.12.35527.113 d17.12
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SignalP", "SignalP.csproj", "{70B76836-867A-4FDA-8CF6-29CE87DC90A5}"
7 | EndProject
8 | Global
9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
10 | Debug|Any CPU = Debug|Any CPU
11 | Release|Any CPU = Release|Any CPU
12 | EndGlobalSection
13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
14 | {70B76836-867A-4FDA-8CF6-29CE87DC90A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
15 | {70B76836-867A-4FDA-8CF6-29CE87DC90A5}.Debug|Any CPU.Build.0 = Debug|Any CPU
16 | {70B76836-867A-4FDA-8CF6-29CE87DC90A5}.Release|Any CPU.ActiveCfg = Release|Any CPU
17 | {70B76836-867A-4FDA-8CF6-29CE87DC90A5}.Release|Any CPU.Build.0 = Release|Any CPU
18 | EndGlobalSection
19 | GlobalSection(SolutionProperties) = preSolution
20 | HideSolutionNode = FALSE
21 | EndGlobalSection
22 | EndGlobal
23 |
--------------------------------------------------------------------------------
/SignalP.Tests/obj/SignalP.Tests.csproj.nuget.g.targets:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/SignalP.Tests/obj/project.nuget.cache:
--------------------------------------------------------------------------------
1 | {
2 | "version": 2,
3 | "dgSpecHash": "9EcdBr/w7h4=",
4 | "success": true,
5 | "projectFilePath": "D:\\RePoint_Solutions\\SignalP\\SignalP\\SignalP\\SignalP.Tests\\SignalP.Tests.csproj",
6 | "expectedPackageFiles": [
7 | "C:\\Users\\Joever Monceda\\.nuget\\packages\\coverlet.collector\\6.0.2\\coverlet.collector.6.0.2.nupkg.sha512",
8 | "C:\\Users\\Joever Monceda\\.nuget\\packages\\microsoft.aspnetcore.testhost\\9.0.9\\microsoft.aspnetcore.testhost.9.0.9.nupkg.sha512",
9 | "C:\\Users\\Joever Monceda\\.nuget\\packages\\microsoft.codecoverage\\17.11.1\\microsoft.codecoverage.17.11.1.nupkg.sha512",
10 | "C:\\Users\\Joever Monceda\\.nuget\\packages\\microsoft.net.test.sdk\\17.11.1\\microsoft.net.test.sdk.17.11.1.nupkg.sha512",
11 | "C:\\Users\\Joever Monceda\\.nuget\\packages\\microsoft.testplatform.objectmodel\\17.11.1\\microsoft.testplatform.objectmodel.17.11.1.nupkg.sha512",
12 | "C:\\Users\\Joever Monceda\\.nuget\\packages\\microsoft.testplatform.testhost\\17.11.1\\microsoft.testplatform.testhost.17.11.1.nupkg.sha512",
13 | "C:\\Users\\Joever Monceda\\.nuget\\packages\\newtonsoft.json\\13.0.1\\newtonsoft.json.13.0.1.nupkg.sha512",
14 | "C:\\Users\\Joever Monceda\\.nuget\\packages\\system.reflection.metadata\\1.6.0\\system.reflection.metadata.1.6.0.nupkg.sha512",
15 | "C:\\Users\\Joever Monceda\\.nuget\\packages\\xunit\\2.9.2\\xunit.2.9.2.nupkg.sha512",
16 | "C:\\Users\\Joever Monceda\\.nuget\\packages\\xunit.abstractions\\2.0.3\\xunit.abstractions.2.0.3.nupkg.sha512",
17 | "C:\\Users\\Joever Monceda\\.nuget\\packages\\xunit.analyzers\\1.16.0\\xunit.analyzers.1.16.0.nupkg.sha512",
18 | "C:\\Users\\Joever Monceda\\.nuget\\packages\\xunit.assert\\2.9.2\\xunit.assert.2.9.2.nupkg.sha512",
19 | "C:\\Users\\Joever Monceda\\.nuget\\packages\\xunit.core\\2.9.2\\xunit.core.2.9.2.nupkg.sha512",
20 | "C:\\Users\\Joever Monceda\\.nuget\\packages\\xunit.extensibility.core\\2.9.2\\xunit.extensibility.core.2.9.2.nupkg.sha512",
21 | "C:\\Users\\Joever Monceda\\.nuget\\packages\\xunit.extensibility.execution\\2.9.2\\xunit.extensibility.execution.2.9.2.nupkg.sha512",
22 | "C:\\Users\\Joever Monceda\\.nuget\\packages\\xunit.runner.visualstudio\\2.8.2\\xunit.runner.visualstudio.2.8.2.nupkg.sha512"
23 | ],
24 | "logs": []
25 | }
--------------------------------------------------------------------------------
/SignalP.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | net8.0
5 | enable
6 | enable
7 | true
8 | true
9 | SignalP
10 | 1.0.0
11 | JOEVER E. MONCEDA
12 | SignalP — Lightweight WebSocket Middleware for .NET
13 | websocket signalr middleware
14 | SP.jpg
15 | MIT
16 | README.md
17 |
18 | - Initial release of SignalP 🚀
19 | - WebSocket-based lightweight real-time communication middleware
20 | - Supports groups, broadcast, and targeted messaging
21 | - DI-ready for ASP.NET Core controllers
22 | - Added SendToAllAsync, SendToConnectionAsync, and group management methods
23 |
24 | true
25 | false
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 | PreserveNewest
50 |
51 |
52 |
53 |
54 |
--------------------------------------------------------------------------------
/SignalP.Tests/obj/SignalP.Tests.csproj.nuget.g.props:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | True
5 | NuGet
6 | $(MSBuildThisFileDirectory)project.assets.json
7 | $(UserProfile)\.nuget\packages\
8 | C:\Users\Joever Monceda\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages;C:\Program Files\dotnet\sdk\NuGetFallbackFolder
9 | PackageReference
10 | 6.12.2
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 | C:\Users\Joever Monceda\.nuget\packages\xunit.analyzers\1.16.0
26 |
27 |
--------------------------------------------------------------------------------
/SignalP.Tests/obj/SignalP.Tests.csproj.nuget.dgspec.json:
--------------------------------------------------------------------------------
1 | {
2 | "format": 1,
3 | "restore": {
4 | "D:\\RePoint_Solutions\\SignalP\\SignalP\\SignalP\\SignalP.Tests\\SignalP.Tests.csproj": {}
5 | },
6 | "projects": {
7 | "D:\\RePoint_Solutions\\SignalP\\SignalP\\SignalP\\SignalP.Tests\\SignalP.Tests.csproj": {
8 | "version": "1.0.0",
9 | "restore": {
10 | "projectUniqueName": "D:\\RePoint_Solutions\\SignalP\\SignalP\\SignalP\\SignalP.Tests\\SignalP.Tests.csproj",
11 | "projectName": "SignalP.Tests",
12 | "projectPath": "D:\\RePoint_Solutions\\SignalP\\SignalP\\SignalP\\SignalP.Tests\\SignalP.Tests.csproj",
13 | "packagesPath": "C:\\Users\\Joever Monceda\\.nuget\\packages\\",
14 | "outputPath": "D:\\RePoint_Solutions\\SignalP\\SignalP\\SignalP\\SignalP.Tests\\obj\\",
15 | "projectStyle": "PackageReference",
16 | "fallbackFolders": [
17 | "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages",
18 | "C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder"
19 | ],
20 | "configFilePaths": [
21 | "C:\\Users\\Joever Monceda\\AppData\\Roaming\\NuGet\\NuGet.Config",
22 | "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
23 | "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
24 | ],
25 | "originalTargetFrameworks": [
26 | "net9.0"
27 | ],
28 | "sources": {
29 | "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
30 | "https://api.nuget.org/v3/index.json": {}
31 | },
32 | "frameworks": {
33 | "net9.0": {
34 | "targetAlias": "net9.0",
35 | "projectReferences": {}
36 | }
37 | },
38 | "warningProperties": {
39 | "warnAsError": [
40 | "NU1605"
41 | ]
42 | },
43 | "restoreAuditProperties": {
44 | "enableAudit": "true",
45 | "auditLevel": "low",
46 | "auditMode": "direct"
47 | },
48 | "SdkAnalysisLevel": "9.0.100"
49 | },
50 | "frameworks": {
51 | "net9.0": {
52 | "targetAlias": "net9.0",
53 | "dependencies": {
54 | "Microsoft.AspNetCore.TestHost": {
55 | "target": "Package",
56 | "version": "[9.0.9, )"
57 | },
58 | "Microsoft.NET.Test.Sdk": {
59 | "target": "Package",
60 | "version": "[17.11.1, )"
61 | },
62 | "coverlet.collector": {
63 | "target": "Package",
64 | "version": "[6.0.2, )"
65 | },
66 | "xunit": {
67 | "target": "Package",
68 | "version": "[2.9.2, )"
69 | },
70 | "xunit.runner.visualstudio": {
71 | "target": "Package",
72 | "version": "[2.8.2, )"
73 | }
74 | },
75 | "imports": [
76 | "net461",
77 | "net462",
78 | "net47",
79 | "net471",
80 | "net472",
81 | "net48",
82 | "net481"
83 | ],
84 | "assetTargetFallback": true,
85 | "warn": true,
86 | "frameworkReferences": {
87 | "Microsoft.NETCore.App": {
88 | "privateAssets": "all"
89 | }
90 | },
91 | "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.101/PortableRuntimeIdentifierGraph.json"
92 | }
93 | }
94 | }
95 | }
96 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | [](https://github.com/Ethan0007/SignalP)
2 | [](https://github.com/Ethan0007/SignalP)
3 |
4 | 🧩 SignalP — Lightweight WebSocket Middleware for .NET
5 | SignalP is a minimal, developer-friendly alternative to SignalR — built on pure WebSockets for real-time communication in .NET applications.
6 | > Sometimes, you don’t need a full framework — just a socket that works.
7 |
8 | 🚀 Features
9 | 🔹 Simple WebSocket-based middleware
10 | 🔹 Automatic connection & disconnection handling
11 | 🔹 Built-in broadcast, private, and group messaging
12 | 🔹 Native WebSocket client support (no SDK required)
13 | 🔹 ASP.NET Core integration with Dependency Injection
14 | 🔹 Perfect for IoT dashboards, chat, admin tools, and internal systems
15 |
16 | 🛠️ Installation
17 | Add the package (when published):
18 | ```
19 | dotnet add package SignalP
20 | ```
21 | Or include the source in your project.
22 |
23 | ⚙️ Setup
24 | ```
25 | Program.cs
26 | using SignalP;
27 | var builder = WebApplication.CreateBuilder(args);
28 |
29 | builder.Services.AddControllers();
30 | builder.Services.AddSignalP(); // Register SignalP middleware
31 | var app = builder.Build();
32 |
33 | app.UseHttpsRedirection();
34 | app.UseWebSockets(); //Must enable WebSockets
35 | app.UseSignalP(opts =>
36 | {
37 | opts.Path = "/signalp"; // WebSocket endpoint
38 | });
39 |
40 | app.MapControllers();
41 | app.Run();
42 | ```
43 | 💬 Client Example (Browser)
44 | ```
45 | const ws = new WebSocket("wss://yourapp.azurewebsites.net/signal?user=JHPoint");
46 | ws.onopen = () => console.log("✅ Connected");
47 | ws.onmessage = (msg) => console.log("📩 Message:", msg.data);
48 | ws.onclose = () => console.log("❌ Disconnected");
49 |
50 | function broadcast(payload) {
51 | ws.send(JSON.stringify({ type: "broadcast", payload }));
52 | }
53 |
54 | broadcast("Hello from browser!");
55 | ```
56 | 🧠 Message Structure
57 | ```
58 | SignalP uses a simple JSON message format:
59 | {
60 | "type": "broadcast",
61 | "payload": "Hello, world!",
62 | "target": "optionalConnectionId"
63 | }
64 | ```
65 |
66 | Supported types
67 | - broadcast — sends to all clients
68 | - private — sends to a specific connection
69 | - group — sends to clients in a named group
70 |
71 | 🆚 SignalP vs SignalR vs Raw WebSocket
72 | | Feature | Raw WebSocket | SignalP | SignalR |
73 | | ------------------- | ---------------- | ------------------------- | -------------------------------- |
74 | | Transport | WebSocket only | WebSocket only | WebSocket, SSE, Long Polling |
75 | | Client | Native WS | Native WS | Requires SDK |
76 | | Connection Handling | Manual | Auto IDs & events | Managed framework |
77 | | Message Routing | Manual | Broadcast, Private, Group | Hubs & Groups built-in |
78 | | Scale-Out | Manual (Redis) | Manual (Redis optional) | Built-in (Azure SignalR Service) |
79 | | Complexity | High | Low | Moderate |
80 | | Ideal For | Custom protocols | Dashboards, Chat, IoT, Admin | Enterprise, Chat, Collaboration |
81 |
82 | 🧩 Using SignalP in Controllers
83 | You can inject and use SignalPService in your controllers:
84 | ```
85 | [ApiController]
86 | [Route("api/[controller]")]
87 | public class NotifyController : ControllerBase
88 | {
89 | private readonly SignalPService _signalP;
90 |
91 | public NotifyController(SignalPService signalP)
92 | {
93 | _signalP = signalP;
94 | }
95 | [HttpPost("send")]
96 | public async Task SendMessage([FromBody] string message)
97 | {
98 | await _signalP.SendToAllAsync(new { type = "broadcast", payload = message });
99 | await _signalP.SendToConnectionAsync("abc123", new { payload = "Hello JH!" });
100 | await _signalP.SendToGroupAsync("admins", new { payload = "New dashboard alerts!" });
101 | await _signalP.AddToGroupAsync("abc123", "admins");
102 | await _signalP.RemoveFromGroupAsync("abc123", "admins");
103 | if (_signalP.TryGetConnectionInfo("abc123", out var info))
104 | {
105 | Console.WriteLine($"User {info.User} connected at {info.User}");
106 | }
107 | return Ok();
108 | }
109 | }
110 | ```
111 | ⚡ Running in Azure
112 | 1. Go to App Service → Configuration → General Settings
113 | 2. Set WebSockets = On
114 | 3. Deploy and connect to
115 | ```
116 | wss://yourapp.azurewebsites.net/signal
117 | ```
118 | No Azure SignalR Service required.
119 |
120 | 🧰 Future Plans
121 | 🔸 JWT-based authentication
122 | 🔸 Redis Pub/Sub scale-out
123 | 🔸 Automatic reconnection support
124 | 🔸 Group persistence
125 |
126 | 🧑💻 Author
127 | Joever Monceda
128 | Founder & CEO, Repoint Solutions Inc.
129 | # License
130 | [](https://opensource.org/licenses/MIT)
131 | Copyright (c) 2025 [Joever Monceda](https://github.com/Ethan0007)
132 | Linkedin: [Joever Monceda](https://www.linkedin.com/in/joever-monceda-55242779/)
133 | Medium: [Joever Monceda](https://medium.com/@joever.monceda/new-net-core-vuejs-vuex-router-webpack-starter-kit-e94b6fdb7481)
134 | Twitter [@_EthanHunt07](https://twitter.com/_EthanHunt07)
135 | Facebook: [Ethan Hunt](https://www.facebook.com/nethan.hound.3/)
136 |
--------------------------------------------------------------------------------
/SignalP.Tests/SignalPMiddlewareTests.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Net.WebSockets;
3 | using System.Text.Json;
4 | using System.Threading;
5 | using System.Threading.Tasks;
6 | using Microsoft.AspNetCore.Builder;
7 | using Microsoft.AspNetCore.Hosting;
8 | using Microsoft.AspNetCore.TestHost;
9 | using Microsoft.Extensions.DependencyInjection;
10 | using Microsoft.Extensions.Logging;
11 | using SignalP;
12 | using Xunit;
13 | /*
14 | OWNER: JOEVER E MONCEDA
15 | */
16 | namespace SignalP.Tests
17 | {
18 | public class SignalPMiddlewareTests
19 | {
20 | private TestServer CreateServer()
21 | {
22 | var builder = new WebHostBuilder()
23 | .ConfigureServices(services =>
24 | {
25 | services.AddLogging();
26 | services.AddSignalP();
27 | })
28 | .Configure(app =>
29 | {
30 | app.UseSignalP(options =>
31 | {
32 | options.Path = "/ws";
33 | });
34 | });
35 |
36 | return new TestServer(builder);
37 | }
38 |
39 | [Fact]
40 | public async Task Middleware_Establishes_WebSocket_Connection()
41 | {
42 | using var server = CreateServer();
43 | var client = server.CreateWebSocketClient();
44 |
45 | using var ws = await client.ConnectAsync(new Uri("ws://localhost/ws?user=testuser"), CancellationToken.None);
46 |
47 | Assert.Equal(WebSocketState.Open, ws.State);
48 |
49 | var buffer = new byte[1024];
50 | var result = await ws.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None);
51 | var json = JsonDocument.Parse(buffer.AsMemory(0, result.Count));
52 |
53 | Assert.True(json.RootElement.TryGetProperty("type", out var typeProp));
54 | Assert.Equal("connected", typeProp.GetString());
55 | Assert.True(json.RootElement.TryGetProperty("connectionId", out _));
56 | }
57 |
58 | [Fact]
59 | public async Task JoinGroup_SendsJoinedConfirmation()
60 | {
61 | using var server = CreateServer();
62 | var client = server.CreateWebSocketClient();
63 |
64 | using var ws = await client.ConnectAsync(new Uri("ws://localhost/ws?user=testuser"), CancellationToken.None);
65 | var buffer = new byte[1024];
66 | var result = await ws.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None);
67 |
68 | var joinMsg = JsonSerializer.Serialize(new { type = "join", target = "testgroup" });
69 | var bytes = System.Text.Encoding.UTF8.GetBytes(joinMsg);
70 | await ws.SendAsync(bytes, WebSocketMessageType.Text, true, CancellationToken.None);
71 |
72 | result = await ws.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None);
73 | var json = JsonDocument.Parse(buffer.AsMemory(0, result.Count));
74 |
75 | Assert.True(json.RootElement.TryGetProperty("type", out var typeProp));
76 | Assert.Equal("joined", typeProp.GetString());
77 | Assert.True(json.RootElement.TryGetProperty("group", out var groupProp));
78 | Assert.Equal("testgroup", groupProp.GetString());
79 | }
80 |
81 | [Fact]
82 | public async Task LeaveGroup_SendsLeftConfirmation()
83 | {
84 | using var server = CreateServer();
85 | var client = server.CreateWebSocketClient();
86 |
87 | using var ws = await client.ConnectAsync(new Uri("ws://localhost/ws?user=testuser"), CancellationToken.None);
88 | var buffer = new byte[1024];
89 | var result = await ws.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None);
90 |
91 | var leaveMsg = JsonSerializer.Serialize(new { type = "leave", target = "testgroup" });
92 | var bytes = System.Text.Encoding.UTF8.GetBytes(leaveMsg);
93 | await ws.SendAsync(bytes, WebSocketMessageType.Text, true, CancellationToken.None);
94 |
95 | result = await ws.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None);
96 | var json = JsonDocument.Parse(buffer.AsMemory(0, result.Count));
97 |
98 | Assert.True(json.RootElement.TryGetProperty("type", out var typeProp));
99 | Assert.Equal("left", typeProp.GetString());
100 | Assert.True(json.RootElement.TryGetProperty("group", out var groupProp));
101 | Assert.Equal("testgroup", groupProp.GetString());
102 | }
103 |
104 | [Fact]
105 | public async Task SendPrivateMessage_SendsMessageToTargetConnection()
106 | {
107 | using var server = CreateServer();
108 | var client = server.CreateWebSocketClient();
109 | using var senderWs = await client.ConnectAsync(new Uri("ws://localhost/ws?user=sender"), CancellationToken.None);
110 | var buffer = new byte[1024];
111 | var result = await senderWs.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None);
112 | var connectedJson = JsonDocument.Parse(buffer.AsMemory(0, result.Count));
113 | var senderId = connectedJson.RootElement.GetProperty("connectionId").GetString();
114 |
115 | using var targetWs = await client.ConnectAsync(new Uri("ws://localhost/ws?user=target"), CancellationToken.None);
116 | result = await targetWs.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None);
117 | var targetConnectedJson = JsonDocument.Parse(buffer.AsMemory(0, result.Count));
118 | var targetId = targetConnectedJson.RootElement.GetProperty("connectionId").GetString();
119 |
120 | var privateMsg = JsonSerializer.Serialize(new
121 | {
122 | type = "private",
123 | target = targetId,
124 | payload = new { text = "hello" }
125 | });
126 | var bytes = System.Text.Encoding.UTF8.GetBytes(privateMsg);
127 | await senderWs.SendAsync(bytes, WebSocketMessageType.Text, true, CancellationToken.None);
128 |
129 | result = await targetWs.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None);
130 | var json = JsonDocument.Parse(buffer.AsMemory(0, result.Count));
131 |
132 | Assert.True(json.RootElement.TryGetProperty("type", out var typeProp));
133 | Assert.Equal("message", typeProp.GetString());
134 | Assert.True(json.RootElement.TryGetProperty("from", out var fromProp));
135 | Assert.Equal(senderId, fromProp.GetString());
136 | Assert.True(json.RootElement.TryGetProperty("payload", out var payloadProp));
137 | Assert.Equal("hello", payloadProp.GetProperty("text").GetString());
138 | }
139 |
140 | [Fact]
141 | public async Task UnknownTypeMessage_ReturnsError()
142 | {
143 | using var server = CreateServer();
144 | var client = server.CreateWebSocketClient();
145 |
146 | using var ws = await client.ConnectAsync(new Uri("ws://localhost/ws?user=testuser"), CancellationToken.None);
147 |
148 | var buffer = new byte[1024];
149 | var result = await ws.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None);
150 |
151 | var unknownMsg = JsonSerializer.Serialize(new { type = "unknown_type" });
152 | var bytes = System.Text.Encoding.UTF8.GetBytes(unknownMsg);
153 | await ws.SendAsync(bytes, WebSocketMessageType.Text, true, CancellationToken.None);
154 |
155 | result = await ws.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None);
156 | var json = JsonDocument.Parse(buffer.AsMemory(0, result.Count));
157 |
158 | Assert.True(json.RootElement.TryGetProperty("type", out var typeProp));
159 | Assert.Equal("error", typeProp.GetString());
160 |
161 | Assert.True(json.RootElement.TryGetProperty("message", out var msgProp));
162 | Assert.Equal("Unknown type", msgProp.GetString());
163 | }
164 | }
165 | }
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 | ##
4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
5 |
6 | # User-specific files
7 | *.rsuser
8 | *.suo
9 | *.user
10 | *.userosscache
11 | *.sln.docstates
12 |
13 | # User-specific files (MonoDevelop/Xamarin Studio)
14 | *.userprefs
15 |
16 | # Mono auto generated files
17 | mono_crash.*
18 |
19 | # Build results
20 | [Dd]ebug/
21 | [Dd]ebugPublic/
22 | [Rr]elease/
23 | [Rr]eleases/
24 | x64/
25 | x86/
26 | [Ww][Ii][Nn]32/
27 | [Aa][Rr][Mm]/
28 | [Aa][Rr][Mm]64/
29 | bld/
30 | [Bb]in/
31 | [Oo]bj/
32 | [Oo]ut/
33 | [Ll]og/
34 | [Ll]ogs/
35 |
36 | # Visual Studio 2015/2017 cache/options directory
37 | .vs/
38 | # Uncomment if you have tasks that create the project's static files in wwwroot
39 | #wwwroot/
40 |
41 | # Visual Studio 2017 auto generated files
42 | Generated\ Files/
43 |
44 | # MSTest test Results
45 | [Tt]est[Rr]esult*/
46 | [Bb]uild[Ll]og.*
47 |
48 | # NUnit
49 | *.VisualState.xml
50 | TestResult.xml
51 | nunit-*.xml
52 |
53 | # Build Results of an ATL Project
54 | [Dd]ebugPS/
55 | [Rr]eleasePS/
56 | dlldata.c
57 |
58 | # Benchmark Results
59 | BenchmarkDotNet.Artifacts/
60 |
61 | # .NET Core
62 | project.lock.json
63 | project.fragment.lock.json
64 | artifacts/
65 |
66 | # ASP.NET Scaffolding
67 | ScaffoldingReadMe.txt
68 |
69 | # StyleCop
70 | StyleCopReport.xml
71 |
72 | # Files built by Visual Studio
73 | *_i.c
74 | *_p.c
75 | *_h.h
76 | *.ilk
77 | *.meta
78 | *.obj
79 | *.iobj
80 | *.pch
81 | *.pdb
82 | *.ipdb
83 | *.pgc
84 | *.pgd
85 | *.rsp
86 | *.sbr
87 | *.tlb
88 | *.tli
89 | *.tlh
90 | *.tmp
91 | *.tmp_proj
92 | *_wpftmp.csproj
93 | *.log
94 | *.vspscc
95 | *.vssscc
96 | .builds
97 | *.pidb
98 | *.svclog
99 | *.scc
100 |
101 | # Chutzpah Test files
102 | _Chutzpah*
103 |
104 | # Visual C++ cache files
105 | ipch/
106 | *.aps
107 | *.ncb
108 | *.opendb
109 | *.opensdf
110 | *.sdf
111 | *.cachefile
112 | *.VC.db
113 | *.VC.VC.opendb
114 |
115 | # Visual Studio profiler
116 | *.psess
117 | *.vsp
118 | *.vspx
119 | *.sap
120 |
121 | # Visual Studio Trace Files
122 | *.e2e
123 |
124 | # TFS 2012 Local Workspace
125 | $tf/
126 |
127 | # Guidance Automation Toolkit
128 | *.gpState
129 |
130 | # ReSharper is a .NET coding add-in
131 | _ReSharper*/
132 | *.[Rr]e[Ss]harper
133 | *.DotSettings.user
134 |
135 | # TeamCity is a build add-in
136 | _TeamCity*
137 |
138 | # DotCover is a Code Coverage Tool
139 | *.dotCover
140 |
141 | # AxoCover is a Code Coverage Tool
142 | .axoCover/*
143 | !.axoCover/settings.json
144 |
145 | # Coverlet is a free, cross platform Code Coverage Tool
146 | coverage*.json
147 | coverage*.xml
148 | coverage*.info
149 |
150 | # Visual Studio code coverage results
151 | *.coverage
152 | *.coveragexml
153 |
154 | # NCrunch
155 | _NCrunch_*
156 | .*crunch*.local.xml
157 | nCrunchTemp_*
158 |
159 | # MightyMoose
160 | *.mm.*
161 | AutoTest.Net/
162 |
163 | # Web workbench (sass)
164 | .sass-cache/
165 |
166 | # Installshield output folder
167 | [Ee]xpress/
168 |
169 | # DocProject is a documentation generator add-in
170 | DocProject/buildhelp/
171 | DocProject/Help/*.HxT
172 | DocProject/Help/*.HxC
173 | DocProject/Help/*.hhc
174 | DocProject/Help/*.hhk
175 | DocProject/Help/*.hhp
176 | DocProject/Help/Html2
177 | DocProject/Help/html
178 |
179 | # Click-Once directory
180 | publish/
181 |
182 | # Publish Web Output
183 | *.[Pp]ublish.xml
184 | *.azurePubxml
185 | # Note: Comment the next line if you want to checkin your web deploy settings,
186 | # but database connection strings (with potential passwords) will be unencrypted
187 | *.pubxml
188 | *.publishproj
189 |
190 | # Microsoft Azure Web App publish settings. Comment the next line if you want to
191 | # checkin your Azure Web App publish settings, but sensitive information contained
192 | # in these scripts will be unencrypted
193 | PublishScripts/
194 |
195 | # NuGet Packages
196 | *.nupkg
197 | # NuGet Symbol Packages
198 | *.snupkg
199 | # The packages folder can be ignored because of Package Restore
200 | **/[Pp]ackages/*
201 | # except build/, which is used as an MSBuild target.
202 | !**/[Pp]ackages/build/
203 | # Uncomment if necessary however generally it will be regenerated when needed
204 | #!**/[Pp]ackages/repositories.config
205 | # NuGet v3's project.json files produces more ignorable files
206 | *.nuget.props
207 | *.nuget.targets
208 |
209 | # Microsoft Azure Build Output
210 | csx/
211 | *.build.csdef
212 |
213 | # Microsoft Azure Emulator
214 | ecf/
215 | rcf/
216 |
217 | # Windows Store app package directories and files
218 | AppPackages/
219 | BundleArtifacts/
220 | Package.StoreAssociation.xml
221 | _pkginfo.txt
222 | *.appx
223 | *.appxbundle
224 | *.appxupload
225 |
226 | # Visual Studio cache files
227 | # files ending in .cache can be ignored
228 | *.[Cc]ache
229 | # but keep track of directories ending in .cache
230 | !?*.[Cc]ache/
231 |
232 | # Others
233 | ClientBin/
234 | ~$*
235 | *~
236 | *.dbmdl
237 | *.dbproj.schemaview
238 | *.jfm
239 | *.pfx
240 | *.publishsettings
241 | orleans.codegen.cs
242 |
243 | # Including strong name files can present a security risk
244 | # (https://github.com/github/gitignore/pull/2483#issue-259490424)
245 | #*.snk
246 |
247 | # Since there are multiple workflows, uncomment next line to ignore bower_components
248 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
249 | #bower_components/
250 |
251 | # RIA/Silverlight projects
252 | Generated_Code/
253 |
254 | # Backup & report files from converting an old project file
255 | # to a newer Visual Studio version. Backup files are not needed,
256 | # because we have git ;-)
257 | _UpgradeReport_Files/
258 | Backup*/
259 | UpgradeLog*.XML
260 | UpgradeLog*.htm
261 | ServiceFabricBackup/
262 | *.rptproj.bak
263 |
264 | # SQL Server files
265 | *.mdf
266 | *.ldf
267 | *.ndf
268 |
269 | # Business Intelligence projects
270 | *.rdl.data
271 | *.bim.layout
272 | *.bim_*.settings
273 | *.rptproj.rsuser
274 | *- [Bb]ackup.rdl
275 | *- [Bb]ackup ([0-9]).rdl
276 | *- [Bb]ackup ([0-9][0-9]).rdl
277 |
278 | # Microsoft Fakes
279 | FakesAssemblies/
280 |
281 | # GhostDoc plugin setting file
282 | *.GhostDoc.xml
283 |
284 | # Node.js Tools for Visual Studio
285 | .ntvs_analysis.dat
286 | node_modules/
287 |
288 | # Visual Studio 6 build log
289 | *.plg
290 |
291 | # Visual Studio 6 workspace options file
292 | *.opt
293 |
294 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
295 | *.vbw
296 |
297 | # Visual Studio LightSwitch build output
298 | **/*.HTMLClient/GeneratedArtifacts
299 | **/*.DesktopClient/GeneratedArtifacts
300 | **/*.DesktopClient/ModelManifest.xml
301 | **/*.Server/GeneratedArtifacts
302 | **/*.Server/ModelManifest.xml
303 | _Pvt_Extensions
304 |
305 | # Paket dependency manager
306 | .paket/paket.exe
307 | paket-files/
308 |
309 | # FAKE - F# Make
310 | .fake/
311 |
312 | # CodeRush personal settings
313 | .cr/personal
314 |
315 | # Python Tools for Visual Studio (PTVS)
316 | __pycache__/
317 | *.pyc
318 |
319 | # Cake - Uncomment if you are using it
320 | # tools/**
321 | # !tools/packages.config
322 |
323 | # Tabs Studio
324 | *.tss
325 |
326 | # Telerik's JustMock configuration file
327 | *.jmconfig
328 |
329 | # BizTalk build output
330 | *.btp.cs
331 | *.btm.cs
332 | *.odx.cs
333 | *.xsd.cs
334 |
335 | # OpenCover UI analysis results
336 | OpenCover/
337 |
338 | # Azure Stream Analytics local run output
339 | ASALocalRun/
340 |
341 | # MSBuild Binary and Structured Log
342 | *.binlog
343 |
344 | # NVidia Nsight GPU debugger configuration file
345 | *.nvuser
346 |
347 | # MFractors (Xamarin productivity tool) working folder
348 | .mfractor/
349 |
350 | # Local History for Visual Studio
351 | .localhistory/
352 |
353 | # BeatPulse healthcheck temp database
354 | healthchecksdb
355 |
356 | # Backup folder for Package Reference Convert tool in Visual Studio 2017
357 | MigrationBackup/
358 |
359 | # Ionide (cross platform F# VS Code tools) working folder
360 | .ionide/
361 |
362 | # Fody - auto-generated XML schema
363 | FodyWeavers.xsd
--------------------------------------------------------------------------------
/SignalPCore.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Concurrent;
2 | using System.Net.WebSockets;
3 | using System.Text.Json;
4 | using Microsoft.AspNetCore.Builder;
5 | using Microsoft.AspNetCore.Http;
6 | using Microsoft.Extensions.DependencyInjection;
7 | using Microsoft.Extensions.Logging;
8 | /*
9 | OWNER: JOEVER E MONCEDA
10 | */
11 | namespace SignalP
12 | {
13 | public class SignalPOptions
14 | {
15 | public string Path { get; set; }
16 | public int ReceiveBufferSize { get; set; } = 4 * 1024;
17 | public TimeSpan KeepAliveInterval { get; set; } = TimeSpan.FromSeconds(30);
18 | }
19 |
20 | public interface ISignalP
21 | {
22 | Task SendToAllAsync(object payload, CancellationToken ct = default);
23 | Task SendToConnectionAsync(string connectionId, object payload, CancellationToken ct = default);
24 | Task SendToGroupAsync(string groupName, object payload, CancellationToken ct = default);
25 | Task AddToGroupAsync(string connectionId, string groupName);
26 | Task RemoveFromGroupAsync(string connectionId, string groupName);
27 | bool TryGetConnectionInfo(string connectionId, out ConnectionInfo? info);
28 | }
29 |
30 | public record ConnectionInfo(string ConnectionId, string? User, HttpContext Context);
31 |
32 | internal class WebSocketConnection
33 | {
34 | public WebSocket Socket { get; }
35 | public ConnectionInfo Info { get; }
36 |
37 | public WebSocketConnection(WebSocket socket, ConnectionInfo info)
38 | {
39 | Socket = socket;
40 | Info = info;
41 | }
42 | }
43 |
44 | public class SignalPService : ISignalP, IDisposable
45 | {
46 | private readonly ConcurrentDictionary _connections = new();
47 | private readonly ConcurrentDictionary> _groups = new();
48 | private readonly JsonSerializerOptions _jsonOptions = new() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };
49 | private readonly ILogger? _logger;
50 |
51 | public SignalPService(ILogger? logger = null)
52 | {
53 | _logger = logger;
54 | }
55 |
56 | internal bool TryRegister(string connectionId, WebSocketConnection conn) =>
57 | _connections.TryAdd(connectionId, conn);
58 |
59 | internal bool TryRemove(string connectionId)
60 | {
61 | _connections.TryRemove(connectionId, out _);
62 | foreach (var group in _groups.Values)
63 | group.TryRemove(connectionId, out _);
64 | return true;
65 | }
66 |
67 | internal bool TryGetConnection(string connectionId, out WebSocketConnection? conn)
68 | {
69 | if (_connections.TryGetValue(connectionId, out var existing))
70 | {
71 | conn = existing;
72 | return true;
73 | }
74 | conn = null;
75 | return false;
76 | }
77 |
78 | public bool TryGetConnectionInfo(string connectionId, out ConnectionInfo? info)
79 | {
80 | if (_connections.TryGetValue(connectionId, out var conn))
81 | {
82 | info = conn.Info;
83 | return true;
84 | }
85 | info = null;
86 | return false;
87 | }
88 |
89 | private async Task SendJsonAsync(WebSocket socket, object payload, CancellationToken ct)
90 | {
91 | var bytes = JsonSerializer.SerializeToUtf8Bytes(payload, _jsonOptions);
92 | await socket.SendAsync(bytes, WebSocketMessageType.Text, true, ct);
93 | }
94 |
95 | public async Task SendToAllAsync(object payload, CancellationToken ct = default)
96 | {
97 | foreach (var conn in _connections.Values)
98 | {
99 | if (conn.Socket.State == WebSocketState.Open)
100 | {
101 | try { await SendJsonAsync(conn.Socket, payload, ct); }
102 | catch (Exception ex) { _logger?.LogDebug(ex, "Failed to send to {id}", conn.Info.ConnectionId); }
103 | }
104 | }
105 | }
106 |
107 | public async Task SendToConnectionAsync(string connectionId, object payload, CancellationToken ct = default)
108 | {
109 | if (_connections.TryGetValue(connectionId, out var conn) && conn.Socket.State == WebSocketState.Open)
110 | {
111 | await SendJsonAsync(conn.Socket, payload, ct);
112 | }
113 | }
114 |
115 | public async Task SendToGroupAsync(string groupName, object payload, CancellationToken ct = default)
116 | {
117 | if (_groups.TryGetValue(groupName, out var members))
118 | {
119 | foreach (var id in members.Keys)
120 | {
121 | if (_connections.TryGetValue(id, out var conn) && conn.Socket.State == WebSocketState.Open)
122 | {
123 | try { await SendJsonAsync(conn.Socket, payload, ct); }
124 | catch { }
125 | }
126 | }
127 | }
128 | }
129 |
130 | public Task AddToGroupAsync(string connectionId, string groupName)
131 | {
132 | var members = _groups.GetOrAdd(groupName, _ => new ConcurrentDictionary());
133 | members[connectionId] = 0;
134 | return Task.CompletedTask;
135 | }
136 |
137 | public Task RemoveFromGroupAsync(string connectionId, string groupName)
138 | {
139 | if (_groups.TryGetValue(groupName, out var members))
140 | members.TryRemove(connectionId, out _);
141 | return Task.CompletedTask;
142 | }
143 |
144 | public void Dispose()
145 | {
146 | foreach (var conn in _connections.Values)
147 | {
148 | try { conn.Socket.Abort(); conn.Socket.Dispose(); } catch { }
149 | }
150 | _connections.Clear();
151 | _groups.Clear();
152 | }
153 | }
154 |
155 | public class SignalPMiddleware
156 | {
157 | private readonly RequestDelegate _next;
158 | private readonly SignalPOptions _options;
159 | private readonly SignalPService _service;
160 | private readonly ILogger? _logger;
161 |
162 | public SignalPMiddleware(RequestDelegate next, SignalPOptions options, SignalPService service, ILogger? logger = null)
163 | {
164 | _next = next;
165 | _options = options;
166 | _service = service;
167 | _logger = logger;
168 | }
169 |
170 | public async Task InvokeAsync(HttpContext context)
171 | {
172 | if (!context.WebSockets.IsWebSocketRequest ||
173 | string.IsNullOrEmpty(context.Request.PathBase))
174 | {
175 | await _next(context);
176 | return;
177 | }
178 |
179 | using var ws = await context.WebSockets.AcceptWebSocketAsync();
180 | var connectionId = Guid.NewGuid().ToString("N");
181 | var user = context.Request.Query["user"].ToString();
182 | var connInfo = new ConnectionInfo(connectionId, string.IsNullOrWhiteSpace(user) ? null : user, context);
183 | var conn = new WebSocketConnection(ws, connInfo);
184 | _service.TryRegister(connectionId, conn);
185 | _logger?.LogInformation("SignalP connected {id} user={user}", connectionId, user);
186 |
187 | var buffer = new byte[_options.ReceiveBufferSize];
188 | var ct = context.RequestAborted;
189 |
190 | try
191 | {
192 | await _service.SendToConnectionAsync(connectionId, new { type = "connected", connectionId });
193 |
194 | var seg = new ArraySegment(buffer);
195 | while (!ct.IsCancellationRequested && ws.State == WebSocketState.Open)
196 | {
197 | var result = await ws.ReceiveAsync(seg, ct);
198 | if (result.CloseStatus.HasValue) break;
199 |
200 | int count = result.Count;
201 | using var ms = new System.IO.MemoryStream();
202 | ms.Write(buffer, 0, count);
203 |
204 | while (!result.EndOfMessage)
205 | {
206 | result = await ws.ReceiveAsync(seg, ct);
207 | ms.Write(buffer, 0, result.Count);
208 | }
209 |
210 | ms.Seek(0, System.IO.SeekOrigin.Begin);
211 | var msg = await JsonSerializer.DeserializeAsync(ms, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }, ct);
212 | await HandleMessage(connectionId, msg, ct);
213 | }
214 | }
215 | catch (OperationCanceledException) { }
216 | catch (WebSocketException) { }
217 | catch (Exception ex) { _logger?.LogError(ex, "SignalP error"); }
218 | finally
219 | {
220 | _service.TryRemove(connectionId);
221 | try { if (ws.State != WebSocketState.Closed) await ws.CloseAsync(WebSocketCloseStatus.NormalClosure, "closing", CancellationToken.None); } catch { }
222 | _logger?.LogInformation("SignalP disconnected {id}", connectionId);
223 | }
224 | }
225 |
226 | private async Task HandleMessage(string connectionId, JsonElement msg, CancellationToken ct)
227 | {
228 | if (!msg.TryGetProperty("type", out var typeEl)) return;
229 | var type = typeEl.GetString()?.ToLowerInvariant() ?? "";
230 |
231 | switch (type)
232 | {
233 | case "join":
234 | if (msg.TryGetProperty("target", out var joinTarget))
235 | {
236 | var group = joinTarget.GetString() ?? "";
237 | await _service.AddToGroupAsync(connectionId, group);
238 | await _service.SendToConnectionAsync(connectionId, new { type = "joined", group });
239 | }
240 | break;
241 |
242 | case "leave":
243 | if (msg.TryGetProperty("target", out var leaveTarget))
244 | {
245 | var group = leaveTarget.GetString() ?? "";
246 | await _service.RemoveFromGroupAsync(connectionId, group);
247 | await _service.SendToConnectionAsync(connectionId, new { type = "left", group });
248 | }
249 | break;
250 |
251 | case "private":
252 | case "sendto":
253 | if (msg.TryGetProperty("target", out var toTarget) && msg.TryGetProperty("payload", out var toPayload))
254 | {
255 | var toId = toTarget.GetString() ?? "";
256 | await _service.SendToConnectionAsync(toId, new { type = "message", from = connectionId, payload = toPayload });
257 | }
258 | break;
259 |
260 | case "group":
261 | case "sendtogroup":
262 | if (msg.TryGetProperty("target", out var grpTarget) && msg.TryGetProperty("payload", out var grpPayload))
263 | {
264 | var group = grpTarget.GetString() ?? "";
265 | await _service.SendToGroupAsync(group, new { type = "message", from = connectionId, payload = grpPayload });
266 | }
267 | break;
268 |
269 | case "broadcast":
270 | case "all":
271 | case "message":
272 | if (msg.TryGetProperty("payload", out var payload))
273 | {
274 | await _service.SendToAllAsync(new { type = "message", from = connectionId, payload }, ct);
275 | }
276 | break;
277 |
278 | default:
279 | await _service.SendToConnectionAsync(connectionId, new { type = "error", message = "Unknown type", receivedType = type });
280 | break;
281 | }
282 | }
283 | }
284 |
285 | public static class SignalPExtensions
286 | {
287 | public static IServiceCollection AddSignalP(this IServiceCollection services)
288 | {
289 | services.AddSingleton();
290 | services.AddSingleton(sp => sp.GetRequiredService());
291 | return services;
292 | }
293 |
294 | public static IApplicationBuilder UseSignalP(this IApplicationBuilder app, Action? configure = null)
295 | {
296 | var options = new SignalPOptions();
297 | configure?.Invoke(options);
298 |
299 | app.UseWebSockets(new WebSocketOptions
300 | {
301 | KeepAliveInterval = options.KeepAliveInterval
302 | });
303 |
304 | var service = app.ApplicationServices.GetRequiredService();
305 | var loggerFactory = app.ApplicationServices.GetService();
306 | var logger = loggerFactory?.CreateLogger();
307 |
308 | app.Map(options.Path, builder =>
309 | {
310 | builder.Use(next =>
311 | {
312 | return async ctx =>
313 | {
314 | var middleware = new SignalPMiddleware(next, options, service, logger);
315 | await middleware.InvokeAsync(ctx);
316 | };
317 | });
318 | });
319 |
320 | return app;
321 | }
322 | }
323 | }
324 |
325 |
--------------------------------------------------------------------------------
/SignalP.Tests/obj/project.assets.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": 3,
3 | "targets": {
4 | "net9.0": {
5 | "coverlet.collector/6.0.2": {
6 | "type": "package",
7 | "build": {
8 | "build/netstandard2.0/coverlet.collector.targets": {}
9 | }
10 | },
11 | "Microsoft.AspNetCore.TestHost/9.0.9": {
12 | "type": "package",
13 | "compile": {
14 | "lib/net9.0/Microsoft.AspNetCore.TestHost.dll": {
15 | "related": ".xml"
16 | }
17 | },
18 | "runtime": {
19 | "lib/net9.0/Microsoft.AspNetCore.TestHost.dll": {
20 | "related": ".xml"
21 | }
22 | },
23 | "frameworkReferences": [
24 | "Microsoft.AspNetCore.App"
25 | ]
26 | },
27 | "Microsoft.CodeCoverage/17.11.1": {
28 | "type": "package",
29 | "compile": {
30 | "lib/netcoreapp3.1/Microsoft.VisualStudio.CodeCoverage.Shim.dll": {}
31 | },
32 | "runtime": {
33 | "lib/netcoreapp3.1/Microsoft.VisualStudio.CodeCoverage.Shim.dll": {}
34 | },
35 | "build": {
36 | "build/netstandard2.0/Microsoft.CodeCoverage.props": {},
37 | "build/netstandard2.0/Microsoft.CodeCoverage.targets": {}
38 | }
39 | },
40 | "Microsoft.NET.Test.Sdk/17.11.1": {
41 | "type": "package",
42 | "dependencies": {
43 | "Microsoft.CodeCoverage": "17.11.1",
44 | "Microsoft.TestPlatform.TestHost": "17.11.1"
45 | },
46 | "compile": {
47 | "lib/netcoreapp3.1/_._": {}
48 | },
49 | "runtime": {
50 | "lib/netcoreapp3.1/_._": {}
51 | },
52 | "build": {
53 | "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.props": {},
54 | "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.targets": {}
55 | },
56 | "buildMultiTargeting": {
57 | "buildMultiTargeting/Microsoft.NET.Test.Sdk.props": {}
58 | }
59 | },
60 | "Microsoft.TestPlatform.ObjectModel/17.11.1": {
61 | "type": "package",
62 | "dependencies": {
63 | "System.Reflection.Metadata": "1.6.0"
64 | },
65 | "compile": {
66 | "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll": {},
67 | "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll": {},
68 | "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll": {}
69 | },
70 | "runtime": {
71 | "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll": {},
72 | "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll": {},
73 | "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll": {}
74 | },
75 | "resource": {
76 | "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
77 | "locale": "cs"
78 | },
79 | "lib/netcoreapp3.1/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
80 | "locale": "cs"
81 | },
82 | "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
83 | "locale": "de"
84 | },
85 | "lib/netcoreapp3.1/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
86 | "locale": "de"
87 | },
88 | "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
89 | "locale": "es"
90 | },
91 | "lib/netcoreapp3.1/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
92 | "locale": "es"
93 | },
94 | "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
95 | "locale": "fr"
96 | },
97 | "lib/netcoreapp3.1/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
98 | "locale": "fr"
99 | },
100 | "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
101 | "locale": "it"
102 | },
103 | "lib/netcoreapp3.1/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
104 | "locale": "it"
105 | },
106 | "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
107 | "locale": "ja"
108 | },
109 | "lib/netcoreapp3.1/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
110 | "locale": "ja"
111 | },
112 | "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
113 | "locale": "ko"
114 | },
115 | "lib/netcoreapp3.1/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
116 | "locale": "ko"
117 | },
118 | "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
119 | "locale": "pl"
120 | },
121 | "lib/netcoreapp3.1/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
122 | "locale": "pl"
123 | },
124 | "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
125 | "locale": "pt-BR"
126 | },
127 | "lib/netcoreapp3.1/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
128 | "locale": "pt-BR"
129 | },
130 | "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
131 | "locale": "ru"
132 | },
133 | "lib/netcoreapp3.1/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
134 | "locale": "ru"
135 | },
136 | "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
137 | "locale": "tr"
138 | },
139 | "lib/netcoreapp3.1/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
140 | "locale": "tr"
141 | },
142 | "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
143 | "locale": "zh-Hans"
144 | },
145 | "lib/netcoreapp3.1/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
146 | "locale": "zh-Hans"
147 | },
148 | "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
149 | "locale": "zh-Hant"
150 | },
151 | "lib/netcoreapp3.1/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
152 | "locale": "zh-Hant"
153 | }
154 | }
155 | },
156 | "Microsoft.TestPlatform.TestHost/17.11.1": {
157 | "type": "package",
158 | "dependencies": {
159 | "Microsoft.TestPlatform.ObjectModel": "17.11.1",
160 | "Newtonsoft.Json": "13.0.1"
161 | },
162 | "compile": {
163 | "lib/netcoreapp3.1/Microsoft.TestPlatform.CommunicationUtilities.dll": {},
164 | "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll": {},
165 | "lib/netcoreapp3.1/Microsoft.TestPlatform.CrossPlatEngine.dll": {},
166 | "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll": {},
167 | "lib/netcoreapp3.1/Microsoft.TestPlatform.Utilities.dll": {},
168 | "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.Common.dll": {},
169 | "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll": {},
170 | "lib/netcoreapp3.1/testhost.dll": {
171 | "related": ".deps.json"
172 | }
173 | },
174 | "runtime": {
175 | "lib/netcoreapp3.1/Microsoft.TestPlatform.CommunicationUtilities.dll": {},
176 | "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll": {},
177 | "lib/netcoreapp3.1/Microsoft.TestPlatform.CrossPlatEngine.dll": {},
178 | "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll": {},
179 | "lib/netcoreapp3.1/Microsoft.TestPlatform.Utilities.dll": {},
180 | "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.Common.dll": {},
181 | "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll": {},
182 | "lib/netcoreapp3.1/testhost.dll": {
183 | "related": ".deps.json"
184 | }
185 | },
186 | "resource": {
187 | "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
188 | "locale": "cs"
189 | },
190 | "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
191 | "locale": "cs"
192 | },
193 | "lib/netcoreapp3.1/cs/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
194 | "locale": "cs"
195 | },
196 | "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
197 | "locale": "de"
198 | },
199 | "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
200 | "locale": "de"
201 | },
202 | "lib/netcoreapp3.1/de/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
203 | "locale": "de"
204 | },
205 | "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
206 | "locale": "es"
207 | },
208 | "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
209 | "locale": "es"
210 | },
211 | "lib/netcoreapp3.1/es/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
212 | "locale": "es"
213 | },
214 | "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
215 | "locale": "fr"
216 | },
217 | "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
218 | "locale": "fr"
219 | },
220 | "lib/netcoreapp3.1/fr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
221 | "locale": "fr"
222 | },
223 | "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
224 | "locale": "it"
225 | },
226 | "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
227 | "locale": "it"
228 | },
229 | "lib/netcoreapp3.1/it/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
230 | "locale": "it"
231 | },
232 | "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
233 | "locale": "ja"
234 | },
235 | "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
236 | "locale": "ja"
237 | },
238 | "lib/netcoreapp3.1/ja/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
239 | "locale": "ja"
240 | },
241 | "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
242 | "locale": "ko"
243 | },
244 | "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
245 | "locale": "ko"
246 | },
247 | "lib/netcoreapp3.1/ko/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
248 | "locale": "ko"
249 | },
250 | "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
251 | "locale": "pl"
252 | },
253 | "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
254 | "locale": "pl"
255 | },
256 | "lib/netcoreapp3.1/pl/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
257 | "locale": "pl"
258 | },
259 | "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
260 | "locale": "pt-BR"
261 | },
262 | "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
263 | "locale": "pt-BR"
264 | },
265 | "lib/netcoreapp3.1/pt-BR/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
266 | "locale": "pt-BR"
267 | },
268 | "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
269 | "locale": "ru"
270 | },
271 | "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
272 | "locale": "ru"
273 | },
274 | "lib/netcoreapp3.1/ru/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
275 | "locale": "ru"
276 | },
277 | "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
278 | "locale": "tr"
279 | },
280 | "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
281 | "locale": "tr"
282 | },
283 | "lib/netcoreapp3.1/tr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
284 | "locale": "tr"
285 | },
286 | "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
287 | "locale": "zh-Hans"
288 | },
289 | "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
290 | "locale": "zh-Hans"
291 | },
292 | "lib/netcoreapp3.1/zh-Hans/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
293 | "locale": "zh-Hans"
294 | },
295 | "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
296 | "locale": "zh-Hant"
297 | },
298 | "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
299 | "locale": "zh-Hant"
300 | },
301 | "lib/netcoreapp3.1/zh-Hant/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
302 | "locale": "zh-Hant"
303 | }
304 | },
305 | "build": {
306 | "build/netcoreapp3.1/Microsoft.TestPlatform.TestHost.props": {}
307 | }
308 | },
309 | "Newtonsoft.Json/13.0.1": {
310 | "type": "package",
311 | "compile": {
312 | "lib/netstandard2.0/Newtonsoft.Json.dll": {
313 | "related": ".xml"
314 | }
315 | },
316 | "runtime": {
317 | "lib/netstandard2.0/Newtonsoft.Json.dll": {
318 | "related": ".xml"
319 | }
320 | }
321 | },
322 | "System.Reflection.Metadata/1.6.0": {
323 | "type": "package",
324 | "compile": {
325 | "lib/netstandard2.0/System.Reflection.Metadata.dll": {
326 | "related": ".xml"
327 | }
328 | },
329 | "runtime": {
330 | "lib/netstandard2.0/System.Reflection.Metadata.dll": {
331 | "related": ".xml"
332 | }
333 | }
334 | },
335 | "xunit/2.9.2": {
336 | "type": "package",
337 | "dependencies": {
338 | "xunit.analyzers": "1.16.0",
339 | "xunit.assert": "2.9.2",
340 | "xunit.core": "[2.9.2]"
341 | }
342 | },
343 | "xunit.abstractions/2.0.3": {
344 | "type": "package",
345 | "compile": {
346 | "lib/netstandard2.0/xunit.abstractions.dll": {
347 | "related": ".xml"
348 | }
349 | },
350 | "runtime": {
351 | "lib/netstandard2.0/xunit.abstractions.dll": {
352 | "related": ".xml"
353 | }
354 | }
355 | },
356 | "xunit.analyzers/1.16.0": {
357 | "type": "package"
358 | },
359 | "xunit.assert/2.9.2": {
360 | "type": "package",
361 | "compile": {
362 | "lib/net6.0/xunit.assert.dll": {
363 | "related": ".xml"
364 | }
365 | },
366 | "runtime": {
367 | "lib/net6.0/xunit.assert.dll": {
368 | "related": ".xml"
369 | }
370 | }
371 | },
372 | "xunit.core/2.9.2": {
373 | "type": "package",
374 | "dependencies": {
375 | "xunit.extensibility.core": "[2.9.2]",
376 | "xunit.extensibility.execution": "[2.9.2]"
377 | },
378 | "build": {
379 | "build/xunit.core.props": {},
380 | "build/xunit.core.targets": {}
381 | },
382 | "buildMultiTargeting": {
383 | "buildMultiTargeting/xunit.core.props": {},
384 | "buildMultiTargeting/xunit.core.targets": {}
385 | }
386 | },
387 | "xunit.extensibility.core/2.9.2": {
388 | "type": "package",
389 | "dependencies": {
390 | "xunit.abstractions": "2.0.3"
391 | },
392 | "compile": {
393 | "lib/netstandard1.1/xunit.core.dll": {
394 | "related": ".xml"
395 | }
396 | },
397 | "runtime": {
398 | "lib/netstandard1.1/xunit.core.dll": {
399 | "related": ".xml"
400 | }
401 | }
402 | },
403 | "xunit.extensibility.execution/2.9.2": {
404 | "type": "package",
405 | "dependencies": {
406 | "xunit.extensibility.core": "[2.9.2]"
407 | },
408 | "compile": {
409 | "lib/netstandard1.1/xunit.execution.dotnet.dll": {
410 | "related": ".xml"
411 | }
412 | },
413 | "runtime": {
414 | "lib/netstandard1.1/xunit.execution.dotnet.dll": {
415 | "related": ".xml"
416 | }
417 | }
418 | },
419 | "xunit.runner.visualstudio/2.8.2": {
420 | "type": "package",
421 | "compile": {
422 | "lib/net6.0/_._": {}
423 | },
424 | "runtime": {
425 | "lib/net6.0/_._": {}
426 | },
427 | "build": {
428 | "build/net6.0/xunit.runner.visualstudio.props": {}
429 | }
430 | }
431 | }
432 | },
433 | "libraries": {
434 | "coverlet.collector/6.0.2": {
435 | "sha512": "bJShQ6uWRTQ100ZeyiMqcFlhP7WJ+bCuabUs885dJiBEzMsJMSFr7BOyeCw4rgvQokteGi5rKQTlkhfQPUXg2A==",
436 | "type": "package",
437 | "path": "coverlet.collector/6.0.2",
438 | "files": [
439 | ".nupkg.metadata",
440 | ".signature.p7s",
441 | "VSTestIntegration.md",
442 | "build/netstandard2.0/Microsoft.Bcl.AsyncInterfaces.dll",
443 | "build/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll",
444 | "build/netstandard2.0/Microsoft.Extensions.DependencyInjection.dll",
445 | "build/netstandard2.0/Microsoft.Extensions.DependencyModel.dll",
446 | "build/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll",
447 | "build/netstandard2.0/Microsoft.TestPlatform.CoreUtilities.dll",
448 | "build/netstandard2.0/Microsoft.TestPlatform.PlatformAbstractions.dll",
449 | "build/netstandard2.0/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll",
450 | "build/netstandard2.0/Mono.Cecil.Mdb.dll",
451 | "build/netstandard2.0/Mono.Cecil.Pdb.dll",
452 | "build/netstandard2.0/Mono.Cecil.Rocks.dll",
453 | "build/netstandard2.0/Mono.Cecil.dll",
454 | "build/netstandard2.0/Newtonsoft.Json.dll",
455 | "build/netstandard2.0/NuGet.Frameworks.dll",
456 | "build/netstandard2.0/NuGet.Versioning.dll",
457 | "build/netstandard2.0/System.Buffers.dll",
458 | "build/netstandard2.0/System.Collections.Immutable.dll",
459 | "build/netstandard2.0/System.Memory.dll",
460 | "build/netstandard2.0/System.Numerics.Vectors.dll",
461 | "build/netstandard2.0/System.Reflection.Metadata.dll",
462 | "build/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll",
463 | "build/netstandard2.0/System.Text.Encodings.Web.dll",
464 | "build/netstandard2.0/System.Text.Json.dll",
465 | "build/netstandard2.0/System.Threading.Tasks.Extensions.dll",
466 | "build/netstandard2.0/coverlet.collector.deps.json",
467 | "build/netstandard2.0/coverlet.collector.dll",
468 | "build/netstandard2.0/coverlet.collector.pdb",
469 | "build/netstandard2.0/coverlet.collector.targets",
470 | "build/netstandard2.0/coverlet.core.dll",
471 | "build/netstandard2.0/coverlet.core.pdb",
472 | "build/netstandard2.0/coverlet.core.xml",
473 | "build/netstandard2.0/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll",
474 | "build/netstandard2.0/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
475 | "build/netstandard2.0/de/Microsoft.TestPlatform.CoreUtilities.resources.dll",
476 | "build/netstandard2.0/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
477 | "build/netstandard2.0/es/Microsoft.TestPlatform.CoreUtilities.resources.dll",
478 | "build/netstandard2.0/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
479 | "build/netstandard2.0/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll",
480 | "build/netstandard2.0/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
481 | "build/netstandard2.0/it/Microsoft.TestPlatform.CoreUtilities.resources.dll",
482 | "build/netstandard2.0/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
483 | "build/netstandard2.0/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll",
484 | "build/netstandard2.0/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
485 | "build/netstandard2.0/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll",
486 | "build/netstandard2.0/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
487 | "build/netstandard2.0/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll",
488 | "build/netstandard2.0/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
489 | "build/netstandard2.0/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll",
490 | "build/netstandard2.0/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
491 | "build/netstandard2.0/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll",
492 | "build/netstandard2.0/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
493 | "build/netstandard2.0/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll",
494 | "build/netstandard2.0/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
495 | "build/netstandard2.0/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll",
496 | "build/netstandard2.0/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
497 | "build/netstandard2.0/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll",
498 | "build/netstandard2.0/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
499 | "coverlet-icon.png",
500 | "coverlet.collector.6.0.2.nupkg.sha512",
501 | "coverlet.collector.nuspec"
502 | ]
503 | },
504 | "Microsoft.AspNetCore.TestHost/9.0.9": {
505 | "sha512": "5iVjUUakdWCVN5rWvEtnbjneNJmW3p5VN7tW/DKPW2UWNYylf2gvJtS9Iloq6H3k8oDai1uaaLR6PAHbd/S7FA==",
506 | "type": "package",
507 | "path": "microsoft.aspnetcore.testhost/9.0.9",
508 | "files": [
509 | ".nupkg.metadata",
510 | ".signature.p7s",
511 | "Icon.png",
512 | "THIRD-PARTY-NOTICES.TXT",
513 | "lib/net9.0/Microsoft.AspNetCore.TestHost.dll",
514 | "lib/net9.0/Microsoft.AspNetCore.TestHost.xml",
515 | "microsoft.aspnetcore.testhost.9.0.9.nupkg.sha512",
516 | "microsoft.aspnetcore.testhost.nuspec"
517 | ]
518 | },
519 | "Microsoft.CodeCoverage/17.11.1": {
520 | "sha512": "nPJqrcA5iX+Y0kqoT3a+pD/8lrW/V7ayqnEJQsTonSoPz59J8bmoQhcSN4G8+UJ64Hkuf0zuxnfuj2lkHOq4cA==",
521 | "type": "package",
522 | "path": "microsoft.codecoverage/17.11.1",
523 | "files": [
524 | ".nupkg.metadata",
525 | ".signature.p7s",
526 | "Icon.png",
527 | "ThirdPartyNotices.txt",
528 | "build/netstandard2.0/CodeCoverage/CodeCoverage.config",
529 | "build/netstandard2.0/CodeCoverage/CodeCoverage.exe",
530 | "build/netstandard2.0/CodeCoverage/VanguardInstrumentationProfiler_x86.config",
531 | "build/netstandard2.0/CodeCoverage/amd64/CodeCoverage.exe",
532 | "build/netstandard2.0/CodeCoverage/amd64/VanguardInstrumentationProfiler_x64.config",
533 | "build/netstandard2.0/CodeCoverage/amd64/covrun64.dll",
534 | "build/netstandard2.0/CodeCoverage/amd64/msdia140.dll",
535 | "build/netstandard2.0/CodeCoverage/arm64/VanguardInstrumentationProfiler_arm64.config",
536 | "build/netstandard2.0/CodeCoverage/arm64/covrunarm64.dll",
537 | "build/netstandard2.0/CodeCoverage/arm64/msdia140.dll",
538 | "build/netstandard2.0/CodeCoverage/codecoveragemessages.dll",
539 | "build/netstandard2.0/CodeCoverage/coreclr/Microsoft.VisualStudio.CodeCoverage.Shim.dll",
540 | "build/netstandard2.0/CodeCoverage/covrun32.dll",
541 | "build/netstandard2.0/CodeCoverage/msdia140.dll",
542 | "build/netstandard2.0/InstrumentationEngine/alpine/x64/VanguardInstrumentationProfiler_x64.config",
543 | "build/netstandard2.0/InstrumentationEngine/alpine/x64/libCoverageInstrumentationMethod.so",
544 | "build/netstandard2.0/InstrumentationEngine/alpine/x64/libInstrumentationEngine.so",
545 | "build/netstandard2.0/InstrumentationEngine/arm64/MicrosoftInstrumentationEngine_arm64.dll",
546 | "build/netstandard2.0/InstrumentationEngine/macos/x64/VanguardInstrumentationProfiler_x64.config",
547 | "build/netstandard2.0/InstrumentationEngine/macos/x64/libCoverageInstrumentationMethod.dylib",
548 | "build/netstandard2.0/InstrumentationEngine/macos/x64/libInstrumentationEngine.dylib",
549 | "build/netstandard2.0/InstrumentationEngine/ubuntu/x64/VanguardInstrumentationProfiler_x64.config",
550 | "build/netstandard2.0/InstrumentationEngine/ubuntu/x64/libCoverageInstrumentationMethod.so",
551 | "build/netstandard2.0/InstrumentationEngine/ubuntu/x64/libInstrumentationEngine.so",
552 | "build/netstandard2.0/InstrumentationEngine/x64/MicrosoftInstrumentationEngine_x64.dll",
553 | "build/netstandard2.0/InstrumentationEngine/x86/MicrosoftInstrumentationEngine_x86.dll",
554 | "build/netstandard2.0/Microsoft.CodeCoverage.Core.dll",
555 | "build/netstandard2.0/Microsoft.CodeCoverage.Instrumentation.Core.dll",
556 | "build/netstandard2.0/Microsoft.CodeCoverage.Instrumentation.dll",
557 | "build/netstandard2.0/Microsoft.CodeCoverage.Interprocess.dll",
558 | "build/netstandard2.0/Microsoft.CodeCoverage.props",
559 | "build/netstandard2.0/Microsoft.CodeCoverage.targets",
560 | "build/netstandard2.0/Microsoft.DiaSymReader.dll",
561 | "build/netstandard2.0/Microsoft.VisualStudio.TraceDataCollector.dll",
562 | "build/netstandard2.0/Mono.Cecil.Pdb.dll",
563 | "build/netstandard2.0/Mono.Cecil.Rocks.dll",
564 | "build/netstandard2.0/Mono.Cecil.dll",
565 | "build/netstandard2.0/ThirdPartyNotices.txt",
566 | "build/netstandard2.0/cs/Microsoft.VisualStudio.TraceDataCollector.resources.dll",
567 | "build/netstandard2.0/de/Microsoft.VisualStudio.TraceDataCollector.resources.dll",
568 | "build/netstandard2.0/es/Microsoft.VisualStudio.TraceDataCollector.resources.dll",
569 | "build/netstandard2.0/fr/Microsoft.VisualStudio.TraceDataCollector.resources.dll",
570 | "build/netstandard2.0/it/Microsoft.VisualStudio.TraceDataCollector.resources.dll",
571 | "build/netstandard2.0/ja/Microsoft.VisualStudio.TraceDataCollector.resources.dll",
572 | "build/netstandard2.0/ko/Microsoft.VisualStudio.TraceDataCollector.resources.dll",
573 | "build/netstandard2.0/pl/Microsoft.VisualStudio.TraceDataCollector.resources.dll",
574 | "build/netstandard2.0/pt-BR/Microsoft.VisualStudio.TraceDataCollector.resources.dll",
575 | "build/netstandard2.0/ru/Microsoft.VisualStudio.TraceDataCollector.resources.dll",
576 | "build/netstandard2.0/tr/Microsoft.VisualStudio.TraceDataCollector.resources.dll",
577 | "build/netstandard2.0/zh-Hans/Microsoft.VisualStudio.TraceDataCollector.resources.dll",
578 | "build/netstandard2.0/zh-Hant/Microsoft.VisualStudio.TraceDataCollector.resources.dll",
579 | "lib/net462/Microsoft.VisualStudio.CodeCoverage.Shim.dll",
580 | "lib/netcoreapp3.1/Microsoft.VisualStudio.CodeCoverage.Shim.dll",
581 | "microsoft.codecoverage.17.11.1.nupkg.sha512",
582 | "microsoft.codecoverage.nuspec"
583 | ]
584 | },
585 | "Microsoft.NET.Test.Sdk/17.11.1": {
586 | "sha512": "U3Ty4BaGoEu+T2bwSko9tWqWUOU16WzSFkq6U8zve75oRBMSLTBdMAZrVNNz1Tq12aCdDom9fcOcM9QZaFHqFg==",
587 | "type": "package",
588 | "path": "microsoft.net.test.sdk/17.11.1",
589 | "files": [
590 | ".nupkg.metadata",
591 | ".signature.p7s",
592 | "Icon.png",
593 | "build/net462/Microsoft.NET.Test.Sdk.props",
594 | "build/net462/Microsoft.NET.Test.Sdk.targets",
595 | "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.Program.cs",
596 | "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.Program.fs",
597 | "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.Program.vb",
598 | "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.props",
599 | "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.targets",
600 | "buildMultiTargeting/Microsoft.NET.Test.Sdk.props",
601 | "lib/net462/_._",
602 | "lib/netcoreapp3.1/_._",
603 | "microsoft.net.test.sdk.17.11.1.nupkg.sha512",
604 | "microsoft.net.test.sdk.nuspec"
605 | ]
606 | },
607 | "Microsoft.TestPlatform.ObjectModel/17.11.1": {
608 | "sha512": "E2jZqAU6JeWEVsyOEOrSW1o1bpHLgb25ypvKNB/moBXPVsFYBPd/Jwi7OrYahG50J83LfHzezYI+GaEkpAotiA==",
609 | "type": "package",
610 | "path": "microsoft.testplatform.objectmodel/17.11.1",
611 | "files": [
612 | ".nupkg.metadata",
613 | ".signature.p7s",
614 | "Icon.png",
615 | "lib/net462/Microsoft.TestPlatform.CoreUtilities.dll",
616 | "lib/net462/Microsoft.TestPlatform.PlatformAbstractions.dll",
617 | "lib/net462/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll",
618 | "lib/net462/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll",
619 | "lib/net462/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
620 | "lib/net462/de/Microsoft.TestPlatform.CoreUtilities.resources.dll",
621 | "lib/net462/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
622 | "lib/net462/es/Microsoft.TestPlatform.CoreUtilities.resources.dll",
623 | "lib/net462/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
624 | "lib/net462/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll",
625 | "lib/net462/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
626 | "lib/net462/it/Microsoft.TestPlatform.CoreUtilities.resources.dll",
627 | "lib/net462/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
628 | "lib/net462/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll",
629 | "lib/net462/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
630 | "lib/net462/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll",
631 | "lib/net462/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
632 | "lib/net462/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll",
633 | "lib/net462/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
634 | "lib/net462/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll",
635 | "lib/net462/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
636 | "lib/net462/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll",
637 | "lib/net462/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
638 | "lib/net462/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll",
639 | "lib/net462/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
640 | "lib/net462/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll",
641 | "lib/net462/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
642 | "lib/net462/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll",
643 | "lib/net462/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
644 | "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll",
645 | "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll",
646 | "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll",
647 | "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll",
648 | "lib/netcoreapp3.1/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
649 | "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CoreUtilities.resources.dll",
650 | "lib/netcoreapp3.1/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
651 | "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CoreUtilities.resources.dll",
652 | "lib/netcoreapp3.1/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
653 | "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll",
654 | "lib/netcoreapp3.1/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
655 | "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CoreUtilities.resources.dll",
656 | "lib/netcoreapp3.1/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
657 | "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll",
658 | "lib/netcoreapp3.1/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
659 | "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll",
660 | "lib/netcoreapp3.1/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
661 | "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll",
662 | "lib/netcoreapp3.1/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
663 | "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll",
664 | "lib/netcoreapp3.1/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
665 | "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll",
666 | "lib/netcoreapp3.1/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
667 | "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll",
668 | "lib/netcoreapp3.1/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
669 | "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll",
670 | "lib/netcoreapp3.1/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
671 | "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll",
672 | "lib/netcoreapp3.1/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
673 | "lib/netstandard2.0/Microsoft.TestPlatform.CoreUtilities.dll",
674 | "lib/netstandard2.0/Microsoft.TestPlatform.PlatformAbstractions.dll",
675 | "lib/netstandard2.0/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll",
676 | "lib/netstandard2.0/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll",
677 | "lib/netstandard2.0/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
678 | "lib/netstandard2.0/de/Microsoft.TestPlatform.CoreUtilities.resources.dll",
679 | "lib/netstandard2.0/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
680 | "lib/netstandard2.0/es/Microsoft.TestPlatform.CoreUtilities.resources.dll",
681 | "lib/netstandard2.0/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
682 | "lib/netstandard2.0/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll",
683 | "lib/netstandard2.0/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
684 | "lib/netstandard2.0/it/Microsoft.TestPlatform.CoreUtilities.resources.dll",
685 | "lib/netstandard2.0/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
686 | "lib/netstandard2.0/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll",
687 | "lib/netstandard2.0/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
688 | "lib/netstandard2.0/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll",
689 | "lib/netstandard2.0/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
690 | "lib/netstandard2.0/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll",
691 | "lib/netstandard2.0/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
692 | "lib/netstandard2.0/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll",
693 | "lib/netstandard2.0/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
694 | "lib/netstandard2.0/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll",
695 | "lib/netstandard2.0/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
696 | "lib/netstandard2.0/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll",
697 | "lib/netstandard2.0/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
698 | "lib/netstandard2.0/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll",
699 | "lib/netstandard2.0/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
700 | "lib/netstandard2.0/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll",
701 | "lib/netstandard2.0/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
702 | "microsoft.testplatform.objectmodel.17.11.1.nupkg.sha512",
703 | "microsoft.testplatform.objectmodel.nuspec"
704 | ]
705 | },
706 | "Microsoft.TestPlatform.TestHost/17.11.1": {
707 | "sha512": "DnG+GOqJXO/CkoqlJWeDFTgPhqD/V6VqUIL3vINizCWZ3X+HshCtbbyDdSHQQEjrc2Sl/K3yaxX6s+5LFEdYuw==",
708 | "type": "package",
709 | "path": "microsoft.testplatform.testhost/17.11.1",
710 | "files": [
711 | ".nupkg.metadata",
712 | ".signature.p7s",
713 | "Icon.png",
714 | "ThirdPartyNotices.txt",
715 | "build/netcoreapp3.1/Microsoft.TestPlatform.TestHost.props",
716 | "build/netcoreapp3.1/x64/testhost.dll",
717 | "build/netcoreapp3.1/x64/testhost.exe",
718 | "build/netcoreapp3.1/x86/testhost.x86.dll",
719 | "build/netcoreapp3.1/x86/testhost.x86.exe",
720 | "lib/net462/_._",
721 | "lib/netcoreapp3.1/Microsoft.TestPlatform.CommunicationUtilities.dll",
722 | "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll",
723 | "lib/netcoreapp3.1/Microsoft.TestPlatform.CrossPlatEngine.dll",
724 | "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll",
725 | "lib/netcoreapp3.1/Microsoft.TestPlatform.Utilities.dll",
726 | "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.Common.dll",
727 | "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll",
728 | "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CommunicationUtilities.resources.dll",
729 | "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CrossPlatEngine.resources.dll",
730 | "lib/netcoreapp3.1/cs/Microsoft.VisualStudio.TestPlatform.Common.resources.dll",
731 | "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CommunicationUtilities.resources.dll",
732 | "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CrossPlatEngine.resources.dll",
733 | "lib/netcoreapp3.1/de/Microsoft.VisualStudio.TestPlatform.Common.resources.dll",
734 | "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CommunicationUtilities.resources.dll",
735 | "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CrossPlatEngine.resources.dll",
736 | "lib/netcoreapp3.1/es/Microsoft.VisualStudio.TestPlatform.Common.resources.dll",
737 | "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll",
738 | "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll",
739 | "lib/netcoreapp3.1/fr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll",
740 | "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CommunicationUtilities.resources.dll",
741 | "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CrossPlatEngine.resources.dll",
742 | "lib/netcoreapp3.1/it/Microsoft.VisualStudio.TestPlatform.Common.resources.dll",
743 | "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CommunicationUtilities.resources.dll",
744 | "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CrossPlatEngine.resources.dll",
745 | "lib/netcoreapp3.1/ja/Microsoft.VisualStudio.TestPlatform.Common.resources.dll",
746 | "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CommunicationUtilities.resources.dll",
747 | "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CrossPlatEngine.resources.dll",
748 | "lib/netcoreapp3.1/ko/Microsoft.VisualStudio.TestPlatform.Common.resources.dll",
749 | "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CommunicationUtilities.resources.dll",
750 | "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CrossPlatEngine.resources.dll",
751 | "lib/netcoreapp3.1/pl/Microsoft.VisualStudio.TestPlatform.Common.resources.dll",
752 | "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CommunicationUtilities.resources.dll",
753 | "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CrossPlatEngine.resources.dll",
754 | "lib/netcoreapp3.1/pt-BR/Microsoft.VisualStudio.TestPlatform.Common.resources.dll",
755 | "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CommunicationUtilities.resources.dll",
756 | "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CrossPlatEngine.resources.dll",
757 | "lib/netcoreapp3.1/ru/Microsoft.VisualStudio.TestPlatform.Common.resources.dll",
758 | "lib/netcoreapp3.1/testhost.deps.json",
759 | "lib/netcoreapp3.1/testhost.dll",
760 | "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll",
761 | "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll",
762 | "lib/netcoreapp3.1/tr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll",
763 | "lib/netcoreapp3.1/x64/msdia140.dll",
764 | "lib/netcoreapp3.1/x86/msdia140.dll",
765 | "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CommunicationUtilities.resources.dll",
766 | "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CrossPlatEngine.resources.dll",
767 | "lib/netcoreapp3.1/zh-Hans/Microsoft.VisualStudio.TestPlatform.Common.resources.dll",
768 | "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CommunicationUtilities.resources.dll",
769 | "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CrossPlatEngine.resources.dll",
770 | "lib/netcoreapp3.1/zh-Hant/Microsoft.VisualStudio.TestPlatform.Common.resources.dll",
771 | "microsoft.testplatform.testhost.17.11.1.nupkg.sha512",
772 | "microsoft.testplatform.testhost.nuspec"
773 | ]
774 | },
775 | "Newtonsoft.Json/13.0.1": {
776 | "sha512": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==",
777 | "type": "package",
778 | "path": "newtonsoft.json/13.0.1",
779 | "files": [
780 | ".nupkg.metadata",
781 | ".signature.p7s",
782 | "LICENSE.md",
783 | "lib/net20/Newtonsoft.Json.dll",
784 | "lib/net20/Newtonsoft.Json.xml",
785 | "lib/net35/Newtonsoft.Json.dll",
786 | "lib/net35/Newtonsoft.Json.xml",
787 | "lib/net40/Newtonsoft.Json.dll",
788 | "lib/net40/Newtonsoft.Json.xml",
789 | "lib/net45/Newtonsoft.Json.dll",
790 | "lib/net45/Newtonsoft.Json.xml",
791 | "lib/netstandard1.0/Newtonsoft.Json.dll",
792 | "lib/netstandard1.0/Newtonsoft.Json.xml",
793 | "lib/netstandard1.3/Newtonsoft.Json.dll",
794 | "lib/netstandard1.3/Newtonsoft.Json.xml",
795 | "lib/netstandard2.0/Newtonsoft.Json.dll",
796 | "lib/netstandard2.0/Newtonsoft.Json.xml",
797 | "newtonsoft.json.13.0.1.nupkg.sha512",
798 | "newtonsoft.json.nuspec",
799 | "packageIcon.png"
800 | ]
801 | },
802 | "System.Reflection.Metadata/1.6.0": {
803 | "sha512": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==",
804 | "type": "package",
805 | "path": "system.reflection.metadata/1.6.0",
806 | "files": [
807 | ".nupkg.metadata",
808 | ".signature.p7s",
809 | "LICENSE.TXT",
810 | "THIRD-PARTY-NOTICES.TXT",
811 | "lib/netstandard1.1/System.Reflection.Metadata.dll",
812 | "lib/netstandard1.1/System.Reflection.Metadata.xml",
813 | "lib/netstandard2.0/System.Reflection.Metadata.dll",
814 | "lib/netstandard2.0/System.Reflection.Metadata.xml",
815 | "lib/portable-net45+win8/System.Reflection.Metadata.dll",
816 | "lib/portable-net45+win8/System.Reflection.Metadata.xml",
817 | "system.reflection.metadata.1.6.0.nupkg.sha512",
818 | "system.reflection.metadata.nuspec",
819 | "useSharedDesignerContext.txt",
820 | "version.txt"
821 | ]
822 | },
823 | "xunit/2.9.2": {
824 | "sha512": "7LhFS2N9Z6Xgg8aE5lY95cneYivRMfRI8v+4PATa4S64D5Z/Plkg0qa8dTRHSiGRgVZ/CL2gEfJDE5AUhOX+2Q==",
825 | "type": "package",
826 | "path": "xunit/2.9.2",
827 | "files": [
828 | ".nupkg.metadata",
829 | ".signature.p7s",
830 | "_content/README.md",
831 | "_content/logo-128-transparent.png",
832 | "xunit.2.9.2.nupkg.sha512",
833 | "xunit.nuspec"
834 | ]
835 | },
836 | "xunit.abstractions/2.0.3": {
837 | "sha512": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==",
838 | "type": "package",
839 | "path": "xunit.abstractions/2.0.3",
840 | "files": [
841 | ".nupkg.metadata",
842 | ".signature.p7s",
843 | "lib/net35/xunit.abstractions.dll",
844 | "lib/net35/xunit.abstractions.xml",
845 | "lib/netstandard1.0/xunit.abstractions.dll",
846 | "lib/netstandard1.0/xunit.abstractions.xml",
847 | "lib/netstandard2.0/xunit.abstractions.dll",
848 | "lib/netstandard2.0/xunit.abstractions.xml",
849 | "xunit.abstractions.2.0.3.nupkg.sha512",
850 | "xunit.abstractions.nuspec"
851 | ]
852 | },
853 | "xunit.analyzers/1.16.0": {
854 | "sha512": "hptYM7vGr46GUIgZt21YHO4rfuBAQS2eINbFo16CV/Dqq+24Tp+P5gDCACu1AbFfW4Sp/WRfDPSK8fmUUb8s0Q==",
855 | "type": "package",
856 | "path": "xunit.analyzers/1.16.0",
857 | "hasTools": true,
858 | "files": [
859 | ".nupkg.metadata",
860 | ".signature.p7s",
861 | "_content/README.md",
862 | "_content/logo-128-transparent.png",
863 | "analyzers/dotnet/cs/xunit.analyzers.dll",
864 | "analyzers/dotnet/cs/xunit.analyzers.fixes.dll",
865 | "tools/install.ps1",
866 | "tools/uninstall.ps1",
867 | "xunit.analyzers.1.16.0.nupkg.sha512",
868 | "xunit.analyzers.nuspec"
869 | ]
870 | },
871 | "xunit.assert/2.9.2": {
872 | "sha512": "QkNBAQG4pa66cholm28AxijBjrmki98/vsEh4Sx5iplzotvPgpiotcxqJQMRC8d7RV7nIT8ozh97957hDnZwsQ==",
873 | "type": "package",
874 | "path": "xunit.assert/2.9.2",
875 | "files": [
876 | ".nupkg.metadata",
877 | ".signature.p7s",
878 | "_content/README.md",
879 | "_content/logo-128-transparent.png",
880 | "lib/net6.0/xunit.assert.dll",
881 | "lib/net6.0/xunit.assert.xml",
882 | "lib/netstandard1.1/xunit.assert.dll",
883 | "lib/netstandard1.1/xunit.assert.xml",
884 | "xunit.assert.2.9.2.nupkg.sha512",
885 | "xunit.assert.nuspec"
886 | ]
887 | },
888 | "xunit.core/2.9.2": {
889 | "sha512": "O6RrNSdmZ0xgEn5kT927PNwog5vxTtKrWMihhhrT0Sg9jQ7iBDciYOwzBgP2krBEk5/GBXI18R1lKvmnxGcb4w==",
890 | "type": "package",
891 | "path": "xunit.core/2.9.2",
892 | "files": [
893 | ".nupkg.metadata",
894 | ".signature.p7s",
895 | "_content/README.md",
896 | "_content/logo-128-transparent.png",
897 | "build/xunit.core.props",
898 | "build/xunit.core.targets",
899 | "buildMultiTargeting/xunit.core.props",
900 | "buildMultiTargeting/xunit.core.targets",
901 | "xunit.core.2.9.2.nupkg.sha512",
902 | "xunit.core.nuspec"
903 | ]
904 | },
905 | "xunit.extensibility.core/2.9.2": {
906 | "sha512": "Ol+KlBJz1x8BrdnhN2DeOuLrr1I/cTwtHCggL9BvYqFuVd/TUSzxNT5O0NxCIXth30bsKxgMfdqLTcORtM52yQ==",
907 | "type": "package",
908 | "path": "xunit.extensibility.core/2.9.2",
909 | "files": [
910 | ".nupkg.metadata",
911 | ".signature.p7s",
912 | "_content/README.md",
913 | "_content/logo-128-transparent.png",
914 | "lib/net452/xunit.core.dll",
915 | "lib/net452/xunit.core.dll.tdnet",
916 | "lib/net452/xunit.core.xml",
917 | "lib/net452/xunit.runner.tdnet.dll",
918 | "lib/net452/xunit.runner.utility.net452.dll",
919 | "lib/netstandard1.1/xunit.core.dll",
920 | "lib/netstandard1.1/xunit.core.xml",
921 | "xunit.extensibility.core.2.9.2.nupkg.sha512",
922 | "xunit.extensibility.core.nuspec"
923 | ]
924 | },
925 | "xunit.extensibility.execution/2.9.2": {
926 | "sha512": "rKMpq4GsIUIJibXuZoZ8lYp5EpROlnYaRpwu9Zr0sRZXE7JqJfEEbCsUriZqB+ByXCLFBJyjkTRULMdC+U566g==",
927 | "type": "package",
928 | "path": "xunit.extensibility.execution/2.9.2",
929 | "files": [
930 | ".nupkg.metadata",
931 | ".signature.p7s",
932 | "_content/README.md",
933 | "_content/logo-128-transparent.png",
934 | "lib/net452/xunit.execution.desktop.dll",
935 | "lib/net452/xunit.execution.desktop.xml",
936 | "lib/netstandard1.1/xunit.execution.dotnet.dll",
937 | "lib/netstandard1.1/xunit.execution.dotnet.xml",
938 | "xunit.extensibility.execution.2.9.2.nupkg.sha512",
939 | "xunit.extensibility.execution.nuspec"
940 | ]
941 | },
942 | "xunit.runner.visualstudio/2.8.2": {
943 | "sha512": "vm1tbfXhFmjFMUmS4M0J0ASXz3/U5XvXBa6DOQUL3fEz4Vt6YPhv+ESCarx6M6D+9kJkJYZKCNvJMas1+nVfmQ==",
944 | "type": "package",
945 | "path": "xunit.runner.visualstudio/2.8.2",
946 | "files": [
947 | ".nupkg.metadata",
948 | ".signature.p7s",
949 | "_content/README.md",
950 | "_content/logo-128-transparent.png",
951 | "build/net462/xunit.abstractions.dll",
952 | "build/net462/xunit.runner.reporters.net452.dll",
953 | "build/net462/xunit.runner.utility.net452.dll",
954 | "build/net462/xunit.runner.visualstudio.props",
955 | "build/net462/xunit.runner.visualstudio.testadapter.dll",
956 | "build/net6.0/xunit.abstractions.dll",
957 | "build/net6.0/xunit.runner.reporters.netcoreapp10.dll",
958 | "build/net6.0/xunit.runner.utility.netcoreapp10.dll",
959 | "build/net6.0/xunit.runner.visualstudio.props",
960 | "build/net6.0/xunit.runner.visualstudio.testadapter.dll",
961 | "lib/net462/_._",
962 | "lib/net6.0/_._",
963 | "xunit.runner.visualstudio.2.8.2.nupkg.sha512",
964 | "xunit.runner.visualstudio.nuspec"
965 | ]
966 | }
967 | },
968 | "projectFileDependencyGroups": {
969 | "net9.0": [
970 | "Microsoft.AspNetCore.TestHost >= 9.0.9",
971 | "Microsoft.NET.Test.Sdk >= 17.11.1",
972 | "coverlet.collector >= 6.0.2",
973 | "xunit >= 2.9.2",
974 | "xunit.runner.visualstudio >= 2.8.2"
975 | ]
976 | },
977 | "packageFolders": {
978 | "C:\\Users\\Joever Monceda\\.nuget\\packages\\": {},
979 | "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {},
980 | "C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder": {}
981 | },
982 | "project": {
983 | "version": "1.0.0",
984 | "restore": {
985 | "projectUniqueName": "D:\\RePoint_Solutions\\SignalP\\SignalP\\SignalP\\SignalP.Tests\\SignalP.Tests.csproj",
986 | "projectName": "SignalP.Tests",
987 | "projectPath": "D:\\RePoint_Solutions\\SignalP\\SignalP\\SignalP\\SignalP.Tests\\SignalP.Tests.csproj",
988 | "packagesPath": "C:\\Users\\Joever Monceda\\.nuget\\packages\\",
989 | "outputPath": "D:\\RePoint_Solutions\\SignalP\\SignalP\\SignalP\\SignalP.Tests\\obj\\",
990 | "projectStyle": "PackageReference",
991 | "fallbackFolders": [
992 | "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages",
993 | "C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder"
994 | ],
995 | "configFilePaths": [
996 | "C:\\Users\\Joever Monceda\\AppData\\Roaming\\NuGet\\NuGet.Config",
997 | "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
998 | "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
999 | ],
1000 | "originalTargetFrameworks": [
1001 | "net9.0"
1002 | ],
1003 | "sources": {
1004 | "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
1005 | "https://api.nuget.org/v3/index.json": {}
1006 | },
1007 | "frameworks": {
1008 | "net9.0": {
1009 | "targetAlias": "net9.0",
1010 | "projectReferences": {}
1011 | }
1012 | },
1013 | "warningProperties": {
1014 | "warnAsError": [
1015 | "NU1605"
1016 | ]
1017 | },
1018 | "restoreAuditProperties": {
1019 | "enableAudit": "true",
1020 | "auditLevel": "low",
1021 | "auditMode": "direct"
1022 | },
1023 | "SdkAnalysisLevel": "9.0.100"
1024 | },
1025 | "frameworks": {
1026 | "net9.0": {
1027 | "targetAlias": "net9.0",
1028 | "dependencies": {
1029 | "Microsoft.AspNetCore.TestHost": {
1030 | "target": "Package",
1031 | "version": "[9.0.9, )"
1032 | },
1033 | "Microsoft.NET.Test.Sdk": {
1034 | "target": "Package",
1035 | "version": "[17.11.1, )"
1036 | },
1037 | "coverlet.collector": {
1038 | "target": "Package",
1039 | "version": "[6.0.2, )"
1040 | },
1041 | "xunit": {
1042 | "target": "Package",
1043 | "version": "[2.9.2, )"
1044 | },
1045 | "xunit.runner.visualstudio": {
1046 | "target": "Package",
1047 | "version": "[2.8.2, )"
1048 | }
1049 | },
1050 | "imports": [
1051 | "net461",
1052 | "net462",
1053 | "net47",
1054 | "net471",
1055 | "net472",
1056 | "net48",
1057 | "net481"
1058 | ],
1059 | "assetTargetFallback": true,
1060 | "warn": true,
1061 | "frameworkReferences": {
1062 | "Microsoft.NETCore.App": {
1063 | "privateAssets": "all"
1064 | }
1065 | },
1066 | "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.101/PortableRuntimeIdentifierGraph.json"
1067 | }
1068 | }
1069 | }
1070 | }
--------------------------------------------------------------------------------