mirror of
https://github.com/bitwarden/server.git
synced 2025-07-03 00:52:49 -05:00
Platform/pm 2535/upgrade to azure messaging servicebus (#3102)
* `dotnet add package Azure.Messaging.ServiceBus` 🤖 * Move to Azure.Messaging.ServiceBus * `dotnet restore --locked-mode --force-evaluate` 🤖 Remove Microsoft.Azure.ServiceBus * `dotnet restore --locked-mode --force-evaluate` 🤖 * Include broker filter * `dotnet restore --locked-mode --force-evaluate` 🤖
This commit is contained in:
@ -24,6 +24,7 @@
|
||||
<PackageReference Include="AWSSDK.SimpleEmail" Version="3.7.0.150" />
|
||||
<PackageReference Include="AWSSDK.SQS" Version="3.7.2.47" />
|
||||
<PackageReference Include="Azure.Extensions.AspNetCore.DataProtection.Blobs" Version="1.3.2" />
|
||||
<PackageReference Include="Azure.Messaging.ServiceBus" Version="7.15.0" />
|
||||
<PackageReference Include="Azure.Storage.Blobs" Version="12.14.1" />
|
||||
<PackageReference Include="Azure.Storage.Queues" Version="12.12.0" />
|
||||
<PackageReference Include="BitPay.Light" Version="1.0.1907" />
|
||||
@ -35,7 +36,6 @@
|
||||
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.4" />
|
||||
<PackageReference Include="Microsoft.Azure.Cosmos.Table" Version="1.0.8" />
|
||||
<PackageReference Include="Microsoft.Azure.NotificationHubs" Version="4.1.0" />
|
||||
<PackageReference Include="Microsoft.Azure.ServiceBus" Version="5.2.0" />
|
||||
<PackageReference Include="Microsoft.Data.SqlClient" Version="5.0.1" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="6.0.1" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="6.0.1" />
|
||||
|
@ -1,10 +1,10 @@
|
||||
using Bit.Core.Enums;
|
||||
using Azure.Messaging.ServiceBus;
|
||||
using Azure.Messaging.ServiceBus.Administration;
|
||||
using Bit.Core.Enums;
|
||||
using Bit.Core.Repositories;
|
||||
using Bit.Core.Services;
|
||||
using Bit.Core.Settings;
|
||||
using Bit.Core.Utilities;
|
||||
using Microsoft.Azure.ServiceBus;
|
||||
using Microsoft.Azure.ServiceBus.Management;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
@ -15,10 +15,14 @@ public class ApplicationCacheHostedService : IHostedService, IDisposable
|
||||
private readonly InMemoryServiceBusApplicationCacheService _applicationCacheService;
|
||||
private readonly IOrganizationRepository _organizationRepository;
|
||||
protected readonly ILogger<ApplicationCacheHostedService> _logger;
|
||||
private readonly SubscriptionClient _subscriptionClient;
|
||||
private readonly ManagementClient _managementClient;
|
||||
private readonly ServiceBusClient _serviceBusClient;
|
||||
private readonly ServiceBusReceiver _subscriptionReceiver;
|
||||
private readonly ServiceBusAdministrationClient _serviceBusAdministrationClient;
|
||||
private readonly string _subName;
|
||||
private readonly string _topicName;
|
||||
private CancellationTokenSource _cts;
|
||||
private Task _executingTask;
|
||||
|
||||
|
||||
public ApplicationCacheHostedService(
|
||||
IApplicationCacheService applicationCacheService,
|
||||
@ -31,53 +35,73 @@ public class ApplicationCacheHostedService : IHostedService, IDisposable
|
||||
_applicationCacheService = applicationCacheService as InMemoryServiceBusApplicationCacheService;
|
||||
_organizationRepository = organizationRepository;
|
||||
_logger = logger;
|
||||
_managementClient = new ManagementClient(globalSettings.ServiceBus.ConnectionString);
|
||||
_subscriptionClient = new SubscriptionClient(globalSettings.ServiceBus.ConnectionString,
|
||||
_topicName, _subName);
|
||||
_serviceBusClient = new ServiceBusClient(globalSettings.ServiceBus.ConnectionString);
|
||||
_subscriptionReceiver = _serviceBusClient.CreateReceiver(_topicName, _subName);
|
||||
_serviceBusAdministrationClient = new ServiceBusAdministrationClient(globalSettings.ServiceBus.ConnectionString);
|
||||
}
|
||||
|
||||
public virtual async Task StartAsync(CancellationToken cancellationToken)
|
||||
{
|
||||
try
|
||||
{
|
||||
await _managementClient.CreateSubscriptionAsync(new SubscriptionDescription(_topicName, _subName)
|
||||
await _serviceBusAdministrationClient.CreateSubscriptionAsync(new CreateSubscriptionOptions(_topicName, _subName)
|
||||
{
|
||||
DefaultMessageTimeToLive = TimeSpan.FromDays(14),
|
||||
LockDuration = TimeSpan.FromSeconds(30),
|
||||
EnableDeadLetteringOnFilterEvaluationExceptions = true,
|
||||
EnableDeadLetteringOnMessageExpiration = true,
|
||||
}, new RuleDescription("default", new SqlFilter($"sys.Label != '{_subName}'")));
|
||||
}
|
||||
catch (MessagingEntityAlreadyExistsException) { }
|
||||
_subscriptionClient.RegisterMessageHandler(ProcessMessageAsync,
|
||||
new MessageHandlerOptions(ExceptionReceivedHandlerAsync)
|
||||
DeadLetteringOnMessageExpiration = true,
|
||||
}, new CreateRuleOptions
|
||||
{
|
||||
MaxConcurrentCalls = 2,
|
||||
AutoComplete = false,
|
||||
});
|
||||
Filter = new SqlRuleFilter($"sys.label != '{_subName}'")
|
||||
}, cancellationToken);
|
||||
}
|
||||
catch (ServiceBusException e)
|
||||
when (e.Reason == ServiceBusFailureReason.MessagingEntityAlreadyExists)
|
||||
{ }
|
||||
|
||||
_cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
|
||||
_executingTask = ExecuteAsync(_cts.Token);
|
||||
}
|
||||
|
||||
public virtual async Task StopAsync(CancellationToken cancellationToken)
|
||||
{
|
||||
await _subscriptionClient.CloseAsync();
|
||||
await _subscriptionReceiver.CloseAsync(cancellationToken);
|
||||
await _serviceBusClient.DisposeAsync();
|
||||
_cts.Cancel();
|
||||
try
|
||||
{
|
||||
await _managementClient.DeleteSubscriptionAsync(_topicName, _subName, cancellationToken);
|
||||
await _serviceBusAdministrationClient.DeleteSubscriptionAsync(_topicName, _subName, cancellationToken);
|
||||
}
|
||||
catch { }
|
||||
await _executingTask;
|
||||
}
|
||||
|
||||
public virtual void Dispose()
|
||||
{ }
|
||||
|
||||
private async Task ProcessMessageAsync(Message message, CancellationToken cancellationToken)
|
||||
private async Task ExecuteAsync(CancellationToken cancellationToken)
|
||||
{
|
||||
if (message.Label != _subName && _applicationCacheService != null)
|
||||
await foreach (var message in _subscriptionReceiver.ReceiveMessagesAsync(cancellationToken))
|
||||
{
|
||||
switch ((ApplicationCacheMessageType)message.UserProperties["type"])
|
||||
try
|
||||
{
|
||||
await ProcessMessageAsync(message, cancellationToken);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_logger.LogError(e, "Error processing messages in ApplicationCacheHostedService");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private async Task ProcessMessageAsync(ServiceBusReceivedMessage message, CancellationToken cancellationToken)
|
||||
{
|
||||
if (message.Subject != _subName && _applicationCacheService != null)
|
||||
{
|
||||
switch ((ApplicationCacheMessageType)message.ApplicationProperties["type"])
|
||||
{
|
||||
case ApplicationCacheMessageType.UpsertOrganizationAbility:
|
||||
var upsertedOrgId = (Guid)message.UserProperties["id"];
|
||||
var upsertedOrgId = (Guid)message.ApplicationProperties["id"];
|
||||
var upsertedOrg = await _organizationRepository.GetByIdAsync(upsertedOrgId);
|
||||
if (upsertedOrg != null)
|
||||
{
|
||||
@ -86,7 +110,7 @@ public class ApplicationCacheHostedService : IHostedService, IDisposable
|
||||
break;
|
||||
case ApplicationCacheMessageType.DeleteOrganizationAbility:
|
||||
await _applicationCacheService.BaseDeleteOrganizationAbilityAsync(
|
||||
(Guid)message.UserProperties["id"]);
|
||||
(Guid)message.ApplicationProperties["id"]);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -94,13 +118,7 @@ public class ApplicationCacheHostedService : IHostedService, IDisposable
|
||||
}
|
||||
if (!cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
await _subscriptionClient.CompleteAsync(message.SystemProperties.LockToken);
|
||||
await _subscriptionReceiver.CompleteMessageAsync(message, cancellationToken);
|
||||
}
|
||||
}
|
||||
|
||||
private Task ExceptionReceivedHandlerAsync(ExceptionReceivedEventArgs args)
|
||||
{
|
||||
_logger.LogError(args.Exception, "Message handler encountered an exception.");
|
||||
return Task.FromResult(0);
|
||||
}
|
||||
}
|
||||
|
@ -1,15 +1,16 @@
|
||||
using Bit.Core.Entities;
|
||||
using Azure.Messaging.ServiceBus;
|
||||
using Bit.Core.Entities;
|
||||
using Bit.Core.Enums;
|
||||
using Bit.Core.Repositories;
|
||||
using Bit.Core.Settings;
|
||||
using Bit.Core.Utilities;
|
||||
using Microsoft.Azure.ServiceBus;
|
||||
|
||||
namespace Bit.Core.Services;
|
||||
|
||||
public class InMemoryServiceBusApplicationCacheService : InMemoryApplicationCacheService, IApplicationCacheService
|
||||
{
|
||||
private readonly TopicClient _topicClient;
|
||||
private readonly ServiceBusClient _serviceBusClient;
|
||||
private readonly ServiceBusSender _topicMessageSender;
|
||||
private readonly string _subName;
|
||||
|
||||
public InMemoryServiceBusApplicationCacheService(
|
||||
@ -19,38 +20,38 @@ public class InMemoryServiceBusApplicationCacheService : InMemoryApplicationCach
|
||||
: base(organizationRepository, providerRepository)
|
||||
{
|
||||
_subName = CoreHelpers.GetApplicationCacheServiceBusSubscriptionName(globalSettings);
|
||||
_topicClient = new TopicClient(globalSettings.ServiceBus.ConnectionString,
|
||||
globalSettings.ServiceBus.ApplicationCacheTopicName);
|
||||
_serviceBusClient = new ServiceBusClient(globalSettings.ServiceBus.ConnectionString);
|
||||
_topicMessageSender = new ServiceBusClient(globalSettings.ServiceBus.ConnectionString).CreateSender(globalSettings.ServiceBus.ApplicationCacheTopicName);
|
||||
}
|
||||
|
||||
public override async Task UpsertOrganizationAbilityAsync(Organization organization)
|
||||
{
|
||||
await base.UpsertOrganizationAbilityAsync(organization);
|
||||
var message = new Message
|
||||
var message = new ServiceBusMessage
|
||||
{
|
||||
Label = _subName,
|
||||
UserProperties =
|
||||
Subject = _subName,
|
||||
ApplicationProperties =
|
||||
{
|
||||
{ "type", (byte)ApplicationCacheMessageType.UpsertOrganizationAbility },
|
||||
{ "id", organization.Id },
|
||||
}
|
||||
};
|
||||
var task = _topicClient.SendAsync(message);
|
||||
var task = _topicMessageSender.SendMessageAsync(message);
|
||||
}
|
||||
|
||||
public override async Task DeleteOrganizationAbilityAsync(Guid organizationId)
|
||||
{
|
||||
await base.DeleteOrganizationAbilityAsync(organizationId);
|
||||
var message = new Message
|
||||
var message = new ServiceBusMessage
|
||||
{
|
||||
Label = _subName,
|
||||
UserProperties =
|
||||
Subject = _subName,
|
||||
ApplicationProperties =
|
||||
{
|
||||
{ "type", (byte)ApplicationCacheMessageType.DeleteOrganizationAbility },
|
||||
{ "id", organizationId },
|
||||
}
|
||||
};
|
||||
var task = _topicClient.SendAsync(message);
|
||||
var task = _topicMessageSender.SendMessageAsync(message);
|
||||
}
|
||||
|
||||
public async Task BaseUpsertOrganizationAbilityAsync(Organization organization)
|
||||
|
@ -483,6 +483,7 @@ public class GlobalSettings : IGlobalSettings
|
||||
{
|
||||
public string ApplicationCacheTopicName { get; set; }
|
||||
public string ApplicationCacheSubscriptionName { get; set; }
|
||||
public string WebSiteInstanceId { get; set; }
|
||||
}
|
||||
|
||||
public class AppleIapSettings
|
||||
|
@ -531,7 +531,8 @@ public static class CoreHelpers
|
||||
var subName = globalSettings.ServiceBus.ApplicationCacheSubscriptionName;
|
||||
if (string.IsNullOrWhiteSpace(subName))
|
||||
{
|
||||
var websiteInstanceId = Environment.GetEnvironmentVariable("WEBSITE_INSTANCE_ID");
|
||||
var websiteInstanceId = Environment.GetEnvironmentVariable("WEBSITE_INSTANCE_ID") ??
|
||||
globalSettings.ServiceBus.WebSiteInstanceId;
|
||||
if (string.IsNullOrWhiteSpace(websiteInstanceId))
|
||||
{
|
||||
throw new Exception("No service bus subscription name available.");
|
||||
|
@ -53,6 +53,19 @@
|
||||
"Microsoft.AspNetCore.DataProtection": "3.1.32"
|
||||
}
|
||||
},
|
||||
"Azure.Messaging.ServiceBus": {
|
||||
"type": "Direct",
|
||||
"requested": "[7.15.0, )",
|
||||
"resolved": "7.15.0",
|
||||
"contentHash": "K2SONtHZSQL3bAbhSBLkNzvh6XsTPK1wXfNjUiZQaJciqX6827kfmJ4DkA3ZZjW+zNaPfGMWVI9zL9berJ4ibg==",
|
||||
"dependencies": {
|
||||
"Azure.Core": "1.32.0",
|
||||
"Azure.Core.Amqp": "1.3.0",
|
||||
"Microsoft.Azure.Amqp": "2.6.2",
|
||||
"Microsoft.Bcl.AsyncInterfaces": "1.1.1",
|
||||
"System.Memory.Data": "1.0.2"
|
||||
}
|
||||
},
|
||||
"Azure.Storage.Blobs": {
|
||||
"type": "Direct",
|
||||
"requested": "[12.14.1, )",
|
||||
@ -197,19 +210,6 @@
|
||||
"Newtonsoft.Json": "12.0.3"
|
||||
}
|
||||
},
|
||||
"Microsoft.Azure.ServiceBus": {
|
||||
"type": "Direct",
|
||||
"requested": "[5.2.0, )",
|
||||
"resolved": "5.2.0",
|
||||
"contentHash": "wyZNJggyFNtKxd+HgvcTiuRYuTjDGi+pgE4RcBvFbfvNiarKr5AOlE4Ne7on1eUJZuMuEa19wN5dj694HlP60A==",
|
||||
"dependencies": {
|
||||
"Microsoft.Azure.Amqp": "2.4.11",
|
||||
"Microsoft.Azure.Services.AppAuthentication": "[1.0.3, 2.0.0)",
|
||||
"Newtonsoft.Json": "10.0.3",
|
||||
"System.Diagnostics.DiagnosticSource": "4.5.1",
|
||||
"System.IdentityModel.Tokens.Jwt": "5.4.0"
|
||||
}
|
||||
},
|
||||
"Microsoft.Data.SqlClient": {
|
||||
"type": "Direct",
|
||||
"requested": "[5.0.1, )",
|
||||
@ -413,8 +413,8 @@
|
||||
},
|
||||
"Azure.Core": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.30.0",
|
||||
"contentHash": "w5Z2uTASP+EsnG4kqQsYtKTf41x1czIu1CgPuDQdHILxCk+IP2DiXazUcfTqr6kebi7S6ah927mrQx1nT/4bnw==",
|
||||
"resolved": "1.32.0",
|
||||
"contentHash": "NmnJxaNqKjPwnHXngVg63SrkwbJXrkT0mcK8uCx9rSq0nK6Q3Q+/GZRCaTWcdcECoRP5XK0lr3Ce8PZkHkuHNg==",
|
||||
"dependencies": {
|
||||
"Microsoft.Bcl.AsyncInterfaces": "1.1.1",
|
||||
"System.Diagnostics.DiagnosticSource": "4.6.0",
|
||||
@ -425,6 +425,16 @@
|
||||
"System.Threading.Tasks.Extensions": "4.5.4"
|
||||
}
|
||||
},
|
||||
"Azure.Core.Amqp": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.3.0",
|
||||
"contentHash": "6GG4gyFkAuHtpBVkvj0wE5+lCM+ttsZlIWAipBkI+jlCUlTgrTiNUROBFnb8xuKoymVDw9Tf1W8RoKqgbd71lg==",
|
||||
"dependencies": {
|
||||
"Microsoft.Azure.Amqp": "2.6.1",
|
||||
"System.Memory": "4.5.4",
|
||||
"System.Memory.Data": "1.0.2"
|
||||
}
|
||||
},
|
||||
"Azure.Identity": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.6.0",
|
||||
@ -577,12 +587,8 @@
|
||||
},
|
||||
"Microsoft.Azure.Amqp": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2.4.11",
|
||||
"contentHash": "7x5fu2f6TLQDDJS0sY5qW8/daFwJaY9O75YvU8RcUfRzbug+9YGjXUBxoRrprgyi0jxdBAMQL05p1s783SOSFQ==",
|
||||
"dependencies": {
|
||||
"System.Net.WebSockets.Client": "4.0.2",
|
||||
"System.Runtime.Serialization.Primitives": "4.1.1"
|
||||
}
|
||||
"resolved": "2.6.2",
|
||||
"contentHash": "6hQqWRiHRd9J6pGBlzQM9LBOWaO8xIsRVYs3olrDGqOkK7v9mgwz9rmrv+49FIbLEOGgkP9IKLnXdsA4Y8IIYw=="
|
||||
},
|
||||
"Microsoft.Azure.Cosmos": {
|
||||
"type": "Transitive",
|
||||
@ -626,16 +632,6 @@
|
||||
"System.Security.SecureString": "4.0.0"
|
||||
}
|
||||
},
|
||||
"Microsoft.Azure.Services.AppAuthentication": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.0.3",
|
||||
"contentHash": "ywpQaK1klu1IoX4VUf+TBmU4kR71aWNI6O5rEIJU8z28L2xhJhnIm7k2Nf1Zu/PygeuOtt5g0QPCk5+lLltbeQ==",
|
||||
"dependencies": {
|
||||
"Microsoft.IdentityModel.Clients.ActiveDirectory": "3.14.2",
|
||||
"NETStandard.Library": "1.6.1",
|
||||
"System.Diagnostics.Process": "4.3.0"
|
||||
}
|
||||
},
|
||||
"Microsoft.Bcl.AsyncInterfaces": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.1.1",
|
||||
@ -868,16 +864,6 @@
|
||||
"resolved": "6.21.0",
|
||||
"contentHash": "XeE6LQtD719Qs2IG7HDi1TSw9LIkDbJ33xFiOBoHbApVw/8GpIBCbW+t7RwOjErUDyXZvjhZliwRkkLb8Z1uzg=="
|
||||
},
|
||||
"Microsoft.IdentityModel.Clients.ActiveDirectory": {
|
||||
"type": "Transitive",
|
||||
"resolved": "3.14.2",
|
||||
"contentHash": "TNsJJMiRnkeby1ovThVoV9yFsPWjAdluwOA+Nf0LtSsBVVrKQv8Qp4kYOgyNwMVj+pDwbhXISySk+4HyHVWNZQ==",
|
||||
"dependencies": {
|
||||
"NETStandard.Library": "1.6.0",
|
||||
"System.Runtime.Serialization.Json": "4.0.2",
|
||||
"System.Runtime.Serialization.Primitives": "4.1.1"
|
||||
}
|
||||
},
|
||||
"Microsoft.IdentityModel.JsonWebTokens": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.21.0",
|
||||
@ -1406,34 +1392,6 @@
|
||||
"System.Security.Principal.Windows": "5.0.0"
|
||||
}
|
||||
},
|
||||
"System.Diagnostics.Process": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==",
|
||||
"dependencies": {
|
||||
"Microsoft.NETCore.Platforms": "1.1.0",
|
||||
"Microsoft.Win32.Primitives": "4.3.0",
|
||||
"Microsoft.Win32.Registry": "4.3.0",
|
||||
"System.Collections": "4.3.0",
|
||||
"System.Diagnostics.Debug": "4.3.0",
|
||||
"System.Globalization": "4.3.0",
|
||||
"System.IO": "4.3.0",
|
||||
"System.IO.FileSystem": "4.3.0",
|
||||
"System.IO.FileSystem.Primitives": "4.3.0",
|
||||
"System.Resources.ResourceManager": "4.3.0",
|
||||
"System.Runtime": "4.3.0",
|
||||
"System.Runtime.Extensions": "4.3.0",
|
||||
"System.Runtime.Handles": "4.3.0",
|
||||
"System.Runtime.InteropServices": "4.3.0",
|
||||
"System.Text.Encoding": "4.3.0",
|
||||
"System.Text.Encoding.Extensions": "4.3.0",
|
||||
"System.Threading": "4.3.0",
|
||||
"System.Threading.Tasks": "4.3.0",
|
||||
"System.Threading.Thread": "4.3.0",
|
||||
"System.Threading.ThreadPool": "4.3.0",
|
||||
"runtime.native.System": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Diagnostics.Tools": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
@ -1875,42 +1833,6 @@
|
||||
"System.Runtime.Extensions": "4.1.0"
|
||||
}
|
||||
},
|
||||
"System.Net.WebSockets": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.0.0",
|
||||
"contentHash": "2KJo8hir6Edi9jnMDAMhiJoI691xRBmKcbNpwjrvpIMOCTYOtBpSsSEGBxBDV7PKbasJNaFp1+PZz1D7xS41Hg==",
|
||||
"dependencies": {
|
||||
"Microsoft.Win32.Primitives": "4.0.1",
|
||||
"System.Resources.ResourceManager": "4.0.1",
|
||||
"System.Runtime": "4.1.0",
|
||||
"System.Threading.Tasks": "4.0.11"
|
||||
}
|
||||
},
|
||||
"System.Net.WebSockets.Client": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.0.2",
|
||||
"contentHash": "NUCcDroX4lCQXgOrzlwIZ1u9YJ0krfyF0wk0ONnyLUmcQoEiYV2/OfUPRqUwQBbpH1BlGApkLgoQUwMqb5+c1g==",
|
||||
"dependencies": {
|
||||
"Microsoft.NETCore.Platforms": "1.0.2",
|
||||
"Microsoft.Win32.Primitives": "4.0.1",
|
||||
"System.Collections": "4.0.11",
|
||||
"System.Diagnostics.Debug": "4.0.11",
|
||||
"System.Diagnostics.Tracing": "4.1.0",
|
||||
"System.Globalization": "4.0.11",
|
||||
"System.Net.Primitives": "4.0.11",
|
||||
"System.Net.WebHeaderCollection": "4.0.1",
|
||||
"System.Net.WebSockets": "4.0.0",
|
||||
"System.Resources.ResourceManager": "4.0.1",
|
||||
"System.Runtime": "4.1.0",
|
||||
"System.Runtime.Extensions": "4.1.0",
|
||||
"System.Runtime.Handles": "4.0.1",
|
||||
"System.Runtime.InteropServices": "4.1.0",
|
||||
"System.Security.Cryptography.X509Certificates": "4.1.0",
|
||||
"System.Text.Encoding": "4.0.11",
|
||||
"System.Threading": "4.0.11",
|
||||
"System.Threading.Tasks": "4.0.11"
|
||||
}
|
||||
},
|
||||
"System.Numerics.Vectors": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.5.0",
|
||||
@ -1928,37 +1850,6 @@
|
||||
"System.Threading": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Private.DataContractSerialization": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.1.1",
|
||||
"contentHash": "lcqFBUaCZxPiUkA4dlSOoPZGtZsAuuElH2XHgLwGLxd7ZozWetV5yiz0qGAV2AUYOqw97MtZBjbLMN16Xz4vXA==",
|
||||
"dependencies": {
|
||||
"System.Collections": "4.0.11",
|
||||
"System.Collections.Concurrent": "4.0.12",
|
||||
"System.Diagnostics.Debug": "4.0.11",
|
||||
"System.Globalization": "4.0.11",
|
||||
"System.IO": "4.1.0",
|
||||
"System.Linq": "4.1.0",
|
||||
"System.Reflection": "4.1.0",
|
||||
"System.Reflection.Emit.ILGeneration": "4.0.1",
|
||||
"System.Reflection.Emit.Lightweight": "4.0.1",
|
||||
"System.Reflection.Extensions": "4.0.1",
|
||||
"System.Reflection.Primitives": "4.0.1",
|
||||
"System.Reflection.TypeExtensions": "4.1.0",
|
||||
"System.Resources.ResourceManager": "4.0.1",
|
||||
"System.Runtime": "4.1.0",
|
||||
"System.Runtime.Extensions": "4.1.0",
|
||||
"System.Runtime.Serialization.Primitives": "4.1.1",
|
||||
"System.Text.Encoding": "4.0.11",
|
||||
"System.Text.Encoding.Extensions": "4.0.11",
|
||||
"System.Text.RegularExpressions": "4.1.0",
|
||||
"System.Threading": "4.0.11",
|
||||
"System.Threading.Tasks": "4.0.11",
|
||||
"System.Xml.ReaderWriter": "4.0.11",
|
||||
"System.Xml.XmlDocument": "4.0.1",
|
||||
"System.Xml.XmlSerializer": "4.0.11"
|
||||
}
|
||||
},
|
||||
"System.Reflection": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
@ -2126,16 +2017,6 @@
|
||||
"System.Runtime.Extensions": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Runtime.Serialization.Json": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.0.2",
|
||||
"contentHash": "+7DIJhnKYgCzUgcLbVTtRQb2l1M0FP549XFlFkQM5lmNiUBl44AfNbx4bz61xA8PzLtlYwfmif4JJJW7MPPnjg==",
|
||||
"dependencies": {
|
||||
"System.IO": "4.1.0",
|
||||
"System.Private.DataContractSerialization": "4.1.1",
|
||||
"System.Runtime": "4.1.0"
|
||||
}
|
||||
},
|
||||
"System.Runtime.Serialization.Primitives": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.1.1",
|
||||
@ -2448,10 +2329,10 @@
|
||||
},
|
||||
"System.Threading.Thread": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==",
|
||||
"resolved": "4.0.0",
|
||||
"contentHash": "gIdJqDXlOr5W9zeqFErLw3dsOsiShSCYtF9SEHitACycmvNvY8odf9kiKvp6V7aibc8C4HzzNBkWXjyfn7plbQ==",
|
||||
"dependencies": {
|
||||
"System.Runtime": "4.3.0"
|
||||
"System.Runtime": "4.1.0"
|
||||
}
|
||||
},
|
||||
"System.Threading.ThreadPool": {
|
||||
@ -2544,30 +2425,6 @@
|
||||
"System.Xml.ReaderWriter": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Xml.XmlSerializer": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.0.11",
|
||||
"contentHash": "FrazwwqfIXTfq23mfv4zH+BjqkSFNaNFBtjzu3I9NRmG8EELYyrv/fJnttCIwRMFRR/YKXF1hmsMmMEnl55HGw==",
|
||||
"dependencies": {
|
||||
"System.Collections": "4.0.11",
|
||||
"System.Globalization": "4.0.11",
|
||||
"System.IO": "4.1.0",
|
||||
"System.Linq": "4.1.0",
|
||||
"System.Reflection": "4.1.0",
|
||||
"System.Reflection.Emit": "4.0.1",
|
||||
"System.Reflection.Emit.ILGeneration": "4.0.1",
|
||||
"System.Reflection.Extensions": "4.0.1",
|
||||
"System.Reflection.Primitives": "4.0.1",
|
||||
"System.Reflection.TypeExtensions": "4.1.0",
|
||||
"System.Resources.ResourceManager": "4.0.1",
|
||||
"System.Runtime": "4.1.0",
|
||||
"System.Runtime.Extensions": "4.1.0",
|
||||
"System.Text.RegularExpressions": "4.1.0",
|
||||
"System.Threading": "4.0.11",
|
||||
"System.Xml.ReaderWriter": "4.0.11",
|
||||
"System.Xml.XmlDocument": "4.0.1"
|
||||
}
|
||||
},
|
||||
"System.Xml.XPath": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
|
Reference in New Issue
Block a user