From 7907348f2ec3a2063f752632ba93d24eef00d833 Mon Sep 17 00:00:00 2001 From: chgagnon Date: Thu, 28 Apr 2022 17:05:53 -0700 Subject: [PATCH] Target netstandard2.0 --- ...rosoft.Azure.WebJobs.Extensions.Sql.csproj | 2 +- src/SqlAsyncCollector.cs | 183 ++++++++------- src/SqlAsyncEnumerable.cs | 8 +- src/SqlConverters.cs | 22 +- src/Telemetry/Telemetry.cs | 8 +- src/packages.lock.json | 216 ++---------------- 6 files changed, 133 insertions(+), 306 deletions(-) diff --git a/src/Microsoft.Azure.WebJobs.Extensions.Sql.csproj b/src/Microsoft.Azure.WebJobs.Extensions.Sql.csproj index 669ae546c..0cddf5860 100644 --- a/src/Microsoft.Azure.WebJobs.Extensions.Sql.csproj +++ b/src/Microsoft.Azure.WebJobs.Extensions.Sql.csproj @@ -1,6 +1,6 @@  - netstandard2.1 + netstandard2.0 SQL binding extension for Azure Functions Microsoft Microsoft diff --git a/src/SqlAsyncCollector.cs b/src/SqlAsyncCollector.cs index 0c24d3131..20dffca9e 100644 --- a/src/SqlAsyncCollector.cs +++ b/src/SqlAsyncCollector.cs @@ -147,90 +147,92 @@ public async Task FlushAsync(CancellationToken cancellationToken = default) /// Used to build up the connection private async Task UpsertRowsAsync(IEnumerable rows, SqlAttribute attribute, IConfiguration configuration) { - using SqlConnection connection = SqlBindingUtilities.BuildConnection(attribute.ConnectionStringSetting, configuration); - await connection.OpenAsync(); - Dictionary props = connection.AsConnectionProps(); + using (SqlConnection connection = SqlBindingUtilities.BuildConnection(attribute.ConnectionStringSetting, configuration)) + { + await connection.OpenAsync(); + Dictionary props = connection.AsConnectionProps(); - string fullTableName = attribute.CommandText; + string fullTableName = attribute.CommandText; - // Include the connection string hash as part of the key in case this customer has the same table in two different Sql Servers - string cacheKey = $"{connection.ConnectionString.GetHashCode()}-{fullTableName}"; + // Include the connection string hash as part of the key in case this customer has the same table in two different Sql Servers + string cacheKey = $"{connection.ConnectionString.GetHashCode()}-{fullTableName}"; - ObjectCache cachedTables = MemoryCache.Default; - var tableInfo = cachedTables[cacheKey] as TableInformation; + ObjectCache cachedTables = MemoryCache.Default; + var tableInfo = cachedTables[cacheKey] as TableInformation; - if (tableInfo == null) - { - TelemetryInstance.TrackEvent(TelemetryEventName.TableInfoCacheMiss, props); - // set the columnNames for supporting T as JObject since it doesn't have columns in the memeber info. - tableInfo = await TableInformation.RetrieveTableInformationAsync(connection, fullTableName, this._logger, GetColumnNamesFromItem(rows.First())); - var policy = new CacheItemPolicy + if (tableInfo == null) { - // Re-look up the primary key(s) after 10 minutes (they should not change very often!) - AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(10) - }; - - this._logger.LogInformation($"DB and Table: {connection.Database}.{fullTableName}. Primary keys: [{string.Join(",", tableInfo.PrimaryKeys.Select(pk => pk.Name))}]. SQL Column and Definitions: [{string.Join(",", tableInfo.ColumnDefinitions)}]"); - cachedTables.Set(cacheKey, tableInfo, policy); - } - else - { - TelemetryInstance.TrackEvent(TelemetryEventName.TableInfoCacheHit, props); - } + TelemetryInstance.TrackEvent(TelemetryEventName.TableInfoCacheMiss, props); + // set the columnNames for supporting T as JObject since it doesn't have columns in the memeber info. + tableInfo = await TableInformation.RetrieveTableInformationAsync(connection, fullTableName, this._logger, GetColumnNamesFromItem(rows.First())); + var policy = new CacheItemPolicy + { + // Re-look up the primary key(s) after 10 minutes (they should not change very often!) + AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(10) + }; - IEnumerable extraProperties = GetExtraProperties(tableInfo.Columns, rows.First()); - if (extraProperties.Any()) - { - string message = $"The following properties in {typeof(T)} do not exist in the table {fullTableName}: {string.Join(", ", extraProperties.ToArray())}."; - var ex = new InvalidOperationException(message); - TelemetryInstance.TrackException(TelemetryErrorName.PropsNotExistOnTable, ex, props); - throw ex; - } + this._logger.LogInformation($"DB and Table: {connection.Database}.{fullTableName}. Primary keys: [{string.Join(",", tableInfo.PrimaryKeys.Select(pk => pk.Name))}]. SQL Column and Definitions: [{string.Join(",", tableInfo.ColumnDefinitions)}]"); + cachedTables.Set(cacheKey, tableInfo, policy); + } + else + { + TelemetryInstance.TrackEvent(TelemetryEventName.TableInfoCacheHit, props); + } - TelemetryInstance.TrackEvent(TelemetryEventName.UpsertStart, props); - var transactionSw = Stopwatch.StartNew(); - int batchSize = 1000; - SqlTransaction transaction = connection.BeginTransaction(); - try - { - SqlCommand command = connection.CreateCommand(); - command.Connection = connection; - command.Transaction = transaction; - SqlParameter par = command.Parameters.Add(RowDataParameter, SqlDbType.NVarChar, -1); - int batchCount = 0; - var commandSw = Stopwatch.StartNew(); - foreach (IEnumerable batch in rows.Batch(batchSize)) + IEnumerable extraProperties = GetExtraProperties(tableInfo.Columns, rows.First()); + if (extraProperties.Any()) { - batchCount++; - GenerateDataQueryForMerge(tableInfo, batch, out string newDataQuery, out string rowData); - command.CommandText = $"{newDataQuery} {tableInfo.Query};"; - par.Value = rowData; - await command.ExecuteNonQueryAsync(); + string message = $"The following properties in {typeof(T)} do not exist in the table {fullTableName}: {string.Join(", ", extraProperties.ToArray())}."; + var ex = new InvalidOperationException(message); + TelemetryInstance.TrackException(TelemetryErrorName.PropsNotExistOnTable, ex, props); + throw ex; } - transaction.Commit(); - var measures = new Dictionary() + + TelemetryInstance.TrackEvent(TelemetryEventName.UpsertStart, props); + var transactionSw = Stopwatch.StartNew(); + int batchSize = 1000; + SqlTransaction transaction = connection.BeginTransaction(); + try + { + SqlCommand command = connection.CreateCommand(); + command.Connection = connection; + command.Transaction = transaction; + SqlParameter par = command.Parameters.Add(RowDataParameter, SqlDbType.NVarChar, -1); + int batchCount = 0; + var commandSw = Stopwatch.StartNew(); + foreach (IEnumerable batch in rows.Batch(batchSize)) + { + batchCount++; + GenerateDataQueryForMerge(tableInfo, batch, out string newDataQuery, out string rowData); + command.CommandText = $"{newDataQuery} {tableInfo.Query};"; + par.Value = rowData; + await command.ExecuteNonQueryAsync(); + } + transaction.Commit(); + var measures = new Dictionary() { { TelemetryMeasureName.BatchCount.ToString(), batchCount }, { TelemetryMeasureName.TransactionDurationMs.ToString(), transactionSw.ElapsedMilliseconds }, { TelemetryMeasureName.CommandDurationMs.ToString(), commandSw.ElapsedMilliseconds } }; - TelemetryInstance.TrackEvent(TelemetryEventName.UpsertEnd, props, measures); - this._logger.LogInformation($"Upserted {rows.Count()} row(s) into database: {connection.Database} and table: {fullTableName}."); - } - catch (Exception ex) - { - try - { - TelemetryInstance.TrackException(TelemetryErrorName.Upsert, ex, props); - transaction.Rollback(); + TelemetryInstance.TrackEvent(TelemetryEventName.UpsertEnd, props, measures); + this._logger.LogInformation($"Upserted {rows.Count()} row(s) into database: {connection.Database} and table: {fullTableName}."); } - catch (Exception ex2) + catch (Exception ex) { - TelemetryInstance.TrackException(TelemetryErrorName.UpsertRollback, ex2, props); - string message2 = $"Encountered exception during upsert and rollback."; - throw new AggregateException(message2, new List { ex, ex2 }); + try + { + TelemetryInstance.TrackException(TelemetryErrorName.Upsert, ex, props); + transaction.Rollback(); + } + catch (Exception ex2) + { + TelemetryInstance.TrackException(TelemetryErrorName.UpsertRollback, ex2, props); + string message2 = $"Encountered exception during upsert and rollback."; + throw new AggregateException(message2, new List { ex, ex2 }); + } + throw; } - throw; } } @@ -376,7 +378,7 @@ public static bool GetCaseSensitivityFromCollation(string collation) public static string GetDatabaseCollationQuery(SqlConnection sqlConnection) { return $@" - SELECT + SELECT DATABASEPROPERTYEX('{sqlConnection.Database}', '{Collation}') AS {Collation};"; } @@ -454,7 +456,7 @@ public static string GetMergeQuery(IList primaryKeys, SqlObject tabl } string columnMatchingQuery = columnMatchingQueryBuilder.ToString().TrimEnd(','); - return @$" + return $@" MERGE INTO {table.BracketQuotedFullName} WITH (HOLDLOCK) AS ExistingData USING {CteName} @@ -490,17 +492,19 @@ public static async Task RetrieveTableInformationAsync(SqlConn try { var cmdCollation = new SqlCommand(GetDatabaseCollationQuery(sqlConnection), sqlConnection); - using SqlDataReader rdr = await cmdCollation.ExecuteReaderAsync(); - while (await rdr.ReadAsync()) + using (SqlDataReader rdr = await cmdCollation.ExecuteReaderAsync()) { - caseSensitive = GetCaseSensitivityFromCollation(rdr[Collation].ToString()); + while (await rdr.ReadAsync()) + { + caseSensitive = GetCaseSensitivityFromCollation(rdr[Collation].ToString()); + } + caseSensitiveSw.Stop(); + TelemetryInstance.TrackDuration(TelemetryEventName.GetCaseSensitivity, caseSensitiveSw.ElapsedMilliseconds, sqlConnProps); } - caseSensitiveSw.Stop(); - TelemetryInstance.TrackDuration(TelemetryEventName.GetCaseSensitivity, caseSensitiveSw.ElapsedMilliseconds, sqlConnProps); } catch (Exception ex) { - // Since this doesn't rethrow make sure we stop here too (don't use finally because we want the execution time to be the same here and in the + // Since this doesn't rethrow make sure we stop here too (don't use finally because we want the execution time to be the same here and in the // overall event but we also only want to send the GetCaseSensitivity event if it succeeds) caseSensitiveSw.Stop(); TelemetryInstance.TrackException(TelemetryErrorName.GetCaseSensitivity, ex, sqlConnProps); @@ -515,14 +519,17 @@ public static async Task RetrieveTableInformationAsync(SqlConn try { var cmdColDef = new SqlCommand(GetColumnDefinitionsQuery(table), sqlConnection); - using SqlDataReader rdr = await cmdColDef.ExecuteReaderAsync(); - while (await rdr.ReadAsync()) + using (SqlDataReader rdr = await cmdColDef.ExecuteReaderAsync()) { - string columnName = caseSensitive ? rdr[ColumnName].ToString() : rdr[ColumnName].ToString().ToLowerInvariant(); - columnDefinitionsFromSQL.Add(columnName, rdr[ColumnDefinition].ToString()); + while (await rdr.ReadAsync()) + { + string columnName = caseSensitive ? rdr[ColumnName].ToString() : rdr[ColumnName].ToString().ToLowerInvariant(); + columnDefinitionsFromSQL.Add(columnName, rdr[ColumnDefinition].ToString()); + } + columnDefinitionsSw.Stop(); + TelemetryInstance.TrackDuration(TelemetryEventName.GetColumnDefinitions, columnDefinitionsSw.ElapsedMilliseconds, sqlConnProps); } - columnDefinitionsSw.Stop(); - TelemetryInstance.TrackDuration(TelemetryEventName.GetColumnDefinitions, columnDefinitionsSw.ElapsedMilliseconds, sqlConnProps); + } catch (Exception ex) { @@ -546,14 +553,16 @@ public static async Task RetrieveTableInformationAsync(SqlConn try { var cmd = new SqlCommand(GetPrimaryKeysQuery(table), sqlConnection); - using SqlDataReader rdr = await cmd.ExecuteReaderAsync(); - while (await rdr.ReadAsync()) + using (SqlDataReader rdr = await cmd.ExecuteReaderAsync()) { - string columnName = caseSensitive ? rdr[ColumnName].ToString() : rdr[ColumnName].ToString().ToLowerInvariant(); - primaryKeys.Add(new PrimaryKey(columnName, bool.Parse(rdr[IsIdentity].ToString()))); + while (await rdr.ReadAsync()) + { + string columnName = caseSensitive ? rdr[ColumnName].ToString() : rdr[ColumnName].ToString().ToLowerInvariant(); + primaryKeys.Add(new PrimaryKey(columnName, bool.Parse(rdr[IsIdentity].ToString()))); + } + primaryKeysSw.Stop(); + TelemetryInstance.TrackDuration(TelemetryEventName.GetPrimaryKeys, primaryKeysSw.ElapsedMilliseconds, sqlConnProps); } - primaryKeysSw.Stop(); - TelemetryInstance.TrackDuration(TelemetryEventName.GetPrimaryKeys, primaryKeysSw.ElapsedMilliseconds, sqlConnProps); } catch (Exception ex) { diff --git a/src/SqlAsyncEnumerable.cs b/src/SqlAsyncEnumerable.cs index 2ca4dfa1d..daeebf798 100644 --- a/src/SqlAsyncEnumerable.cs +++ b/src/SqlAsyncEnumerable.cs @@ -105,9 +105,11 @@ private async Task GetNextRowAsync() { if (this._reader == null) { - using SqlCommand command = SqlBindingUtilities.BuildCommand(this._attribute, this._connection); - await command.Connection.OpenAsync(); - this._reader = await command.ExecuteReaderAsync(); + using (SqlCommand command = SqlBindingUtilities.BuildCommand(this._attribute, this._connection)) + { + await command.Connection.OpenAsync(); + this._reader = await command.ExecuteReaderAsync(); + } } if (await this._reader.ReadAsync()) { diff --git a/src/SqlConverters.cs b/src/SqlConverters.cs index e073cc24f..d49edf2fd 100644 --- a/src/SqlConverters.cs +++ b/src/SqlConverters.cs @@ -154,18 +154,20 @@ async Task IAsyncConverter.ConvertAsync(SqlAttribu /// public virtual async Task BuildItemFromAttributeAsync(SqlAttribute attribute) { - using SqlConnection connection = SqlBindingUtilities.BuildConnection(attribute.ConnectionStringSetting, this._configuration); + using (SqlConnection connection = SqlBindingUtilities.BuildConnection(attribute.ConnectionStringSetting, this._configuration)) // Ideally, we would like to move away from using SqlDataAdapter both here and in the // SqlAsyncCollector since it does not support asynchronous operations. - // There is a GitHub issue open to track this - using var adapter = new SqlDataAdapter(); - using SqlCommand command = SqlBindingUtilities.BuildCommand(attribute, connection); - adapter.SelectCommand = command; - await connection.OpenAsync(); - var dataTable = new DataTable(); - adapter.Fill(dataTable); - this._logger.LogInformation($"{dataTable.Rows.Count} row(s) queried from database: {connection.Database} using Command: {command.CommandText}"); - return JsonConvert.SerializeObject(dataTable); + using (var adapter = new SqlDataAdapter()) + using (SqlCommand command = SqlBindingUtilities.BuildCommand(attribute, connection)) + { + adapter.SelectCommand = command; + await connection.OpenAsync(); + var dataTable = new DataTable(); + adapter.Fill(dataTable); + this._logger.LogInformation($"{dataTable.Rows.Count} row(s) queried from database: {connection.Database} using Command: {command.CommandText}"); + return JsonConvert.SerializeObject(dataTable); + } + } IAsyncEnumerable IConverter>.Convert(SqlAttribute attribute) diff --git a/src/Telemetry/Telemetry.cs b/src/Telemetry/Telemetry.cs index 450a2bd4d..3d4008abd 100644 --- a/src/Telemetry/Telemetry.cs +++ b/src/Telemetry/Telemetry.cs @@ -120,7 +120,7 @@ public void TrackException(TelemetryErrorName errorName, Exception exception, ID return; } this._logger.LogInformation($"Sending exception event: {exception.Message}"); - properties ??= new Dictionary(); + properties = properties ?? new Dictionary(); properties.Add(TelemetryPropertyName.ErrorName.ToString(), errorName.ToString()); properties.Add(TelemetryPropertyName.ErrorCode.ToString(), ExtractErrorCode(exception)); //continue task in existing parallel thread @@ -147,7 +147,7 @@ public void TrackDuration(TelemetryEventName eventName, long durationMs, IDictio { try { - measurements ??= new Dictionary(); + measurements = measurements ?? new Dictionary(); measurements.Add(TelemetryMeasureName.DurationMs.ToString(), durationMs); this.TrackEvent(eventName, properties, measurements); } @@ -169,7 +169,7 @@ public void TrackCreate(CreateType type, IDictionary properties { try { - properties ??= new Dictionary(); + properties = properties ?? new Dictionary(); properties.Add(TelemetryPropertyName.Type.ToString(), type.ToString()); this.TrackEvent(TelemetryEventName.Create, properties, measurements); } @@ -191,7 +191,7 @@ public void TrackConvert(ConvertType type, IDictionary propertie { try { - properties ??= new Dictionary(); + properties = properties ?? new Dictionary(); properties.Add(TelemetryPropertyName.Type.ToString(), type.ToString()); this.TrackEvent(TelemetryEventName.Convert, properties, measurements); } diff --git a/src/packages.lock.json b/src/packages.lock.json index 04e07a39e..6b2b58421 100644 --- a/src/packages.lock.json +++ b/src/packages.lock.json @@ -1,7 +1,7 @@ { "version": 2, "dependencies": { - ".NETStandard,Version=v2.1": { + ".NETStandard,Version=v2.0": { "Microsoft.ApplicationInsights": { "type": "Direct", "requested": "[2.17.0, )", @@ -69,6 +69,15 @@ "resolved": "3.3.2", "contentHash": "MQc8GppZJLmjvcpEdf3EkC6ovsp7gRWt2e5mC7dcIOrgwSc+yjFd3JQ0iRqr3XrUT6rb/phv0IkEmBtbfVA7AQ==" }, + "NETStandard.Library": { + "type": "Direct", + "requested": "[2.0.3, )", + "resolved": "2.0.3", + "contentHash": "st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0" + } + }, "System.Runtime.Caching": { "type": "Direct", "requested": "[4.7.0, )", @@ -407,57 +416,6 @@ "System.Security.Principal.Windows": "4.7.0" } }, - "NETStandard.Library": { - "type": "Transitive", - "resolved": "1.6.1", - "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.Win32.Primitives": "4.3.0", - "System.AppContext": "4.3.0", - "System.Collections": "4.3.0", - "System.Collections.Concurrent": "4.3.0", - "System.Console": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Diagnostics.Tools": "4.3.0", - "System.Diagnostics.Tracing": "4.3.0", - "System.Globalization": "4.3.0", - "System.Globalization.Calendars": "4.3.0", - "System.IO": "4.3.0", - "System.IO.Compression": "4.3.0", - "System.IO.Compression.ZipFile": "4.3.0", - "System.IO.FileSystem": "4.3.0", - "System.IO.FileSystem.Primitives": "4.3.0", - "System.Linq": "4.3.0", - "System.Linq.Expressions": "4.3.0", - "System.Net.Http": "4.3.0", - "System.Net.Primitives": "4.3.0", - "System.Net.Sockets": "4.3.0", - "System.ObjectModel": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Extensions": "4.3.0", - "System.Reflection.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.Runtime.InteropServices.RuntimeInformation": "4.3.0", - "System.Runtime.Numerics": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Security.Cryptography.X509Certificates": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Text.Encoding.Extensions": "4.3.0", - "System.Text.RegularExpressions": "4.3.0", - "System.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0", - "System.Threading.Timer": "4.3.0", - "System.Xml.ReaderWriter": "4.3.0", - "System.Xml.XDocument": "4.3.0" - } - }, "Newtonsoft.Json": { "type": "Transitive", "resolved": "11.0.2", @@ -487,15 +445,6 @@ "Microsoft.NETCore.Targets": "1.1.0" } }, - "runtime.native.System.IO.Compression": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, "runtime.native.System.Net.Http": { "type": "Transitive", "resolved": "4.3.0", @@ -570,14 +519,6 @@ "resolved": "4.3.0", "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" }, - "System.AppContext": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", - "dependencies": { - "System.Runtime": "4.3.0" - } - }, "System.Buffers": { "type": "Transitive", "resolved": "4.5.1", @@ -691,18 +632,6 @@ "System.Security.Permissions": "4.7.0" } }, - "System.Console": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0" - } - }, "System.Diagnostics.Debug": { "type": "Transitive", "resolved": "4.3.0", @@ -862,44 +791,6 @@ "System.Threading.Tasks": "4.3.0" } }, - "System.IO.Compression": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Buffers": "4.3.0", - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.IO": "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.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0", - "runtime.native.System": "4.3.0", - "runtime.native.System.IO.Compression": "4.3.0" - } - }, - "System.IO.Compression.ZipFile": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", - "dependencies": { - "System.Buffers": "4.3.0", - "System.IO": "4.3.0", - "System.IO.Compression": "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.Text.Encoding": "4.3.0" - } - }, "System.IO.FileSystem": { "type": "Transitive", "resolved": "4.3.0", @@ -977,63 +868,6 @@ "System.Text.Json": "4.6.0" } }, - "System.Net.Http": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Diagnostics.DiagnosticSource": "4.3.0", - "System.Diagnostics.Tracing": "4.3.0", - "System.Globalization": "4.3.0", - "System.Globalization.Extensions": "4.3.0", - "System.IO": "4.3.0", - "System.IO.FileSystem": "4.3.0", - "System.Net.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.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.OpenSsl": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Security.Cryptography.X509Certificates": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0", - "runtime.native.System": "4.3.0", - "runtime.native.System.Net.Http": "4.3.0", - "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } - }, - "System.Net.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Runtime.Handles": "4.3.0" - } - }, - "System.Net.Sockets": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Net.Primitives": "4.3.0", - "System.Runtime": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, "System.Numerics.Vectors": { "type": "Transitive", "resolved": "4.5.0", @@ -1226,20 +1060,6 @@ "System.Runtime.Handles": "4.3.0" } }, - "System.Runtime.InteropServices.RuntimeInformation": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Reflection.Extensions": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Threading": "4.3.0", - "runtime.native.System": "4.3.0" - } - }, "System.Runtime.Loader": { "type": "Transitive", "resolved": "4.3.0", @@ -1499,7 +1319,11 @@ "System.Text.Encodings.Web": { "type": "Transitive", "resolved": "4.7.2", - "contentHash": "iTUgB/WtrZ1sWZs84F2hwyQhiRH6QNjQv2DkwrH+WP6RoFga2Q1m3f9/Q7FG8cck8AdHitQkmkXSY8qylcDmuA==" + "contentHash": "iTUgB/WtrZ1sWZs84F2hwyQhiRH6QNjQv2DkwrH+WP6RoFga2Q1m3f9/Q7FG8cck8AdHitQkmkXSY8qylcDmuA==", + "dependencies": { + "System.Buffers": "4.5.1", + "System.Memory": "4.5.4" + } }, "System.Text.Json": { "type": "Transitive", @@ -1577,16 +1401,6 @@ "System.Runtime.Handles": "4.3.0" } }, - "System.Threading.Timer": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, "System.Xml.ReaderWriter": { "type": "Transitive", "resolved": "4.3.0",