diff --git a/NuGet.Core/ServiceStack.Redis.Core.1.0.41.nupkg b/NuGet.Core/ServiceStack.Redis.Core.1.0.41.nupkg new file mode 100644 index 00000000..eab6a639 Binary files /dev/null and b/NuGet.Core/ServiceStack.Redis.Core.1.0.41.nupkg differ diff --git a/NuGet.Core/ServiceStack.Redis.Core/lib/netstandard1.3/ServiceStack.Redis.deps.json b/NuGet.Core/ServiceStack.Redis.Core/lib/netstandard1.3/ServiceStack.Redis.deps.json new file mode 100644 index 00000000..5a9dfada --- /dev/null +++ b/NuGet.Core/ServiceStack.Redis.Core/lib/netstandard1.3/ServiceStack.Redis.deps.json @@ -0,0 +1,1244 @@ +{ + "runtimeTarget": { + "name": ".NETStandard,Version=v1.3/", + "signature": "c5d6219cfc0753c1fa880ec6ab8375068b04bcdc" + }, + "compilationOptions": {}, + "targets": { + ".NETStandard,Version=v1.3": {}, + ".NETStandard,Version=v1.3/": { + "servicestack.redis/1.0.0": { + "dependencies": { + "NETStandard.Library": "1.6.1", + "System.Collections.NonGeneric": "4.3.0", + "System.Collections.Specialized": "4.3.0", + "System.Data.Common": "4.3.0", + "System.Net.NameResolution": "4.3.0", + "System.Net.Security": "4.3.1", + "System.Threading.Thread": "4.3.0" + }, + "runtime": { + "ServiceStack.Redis.dll": {} + } + }, + "microsoft.netcore.platforms/1.1.0": {}, + "microsoft.netcore.targets/1.1.0": {}, + "microsoft.win32.primitives/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "netstandard.library/1.6.1": { + "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" + } + }, + "runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl/4.3.0": {}, + "runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl/4.3.0": {}, + "runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl/4.3.0": {}, + "runtime.native.system/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.system.io.compression/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.system.security.cryptography.openssl/4.3.0": { + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl/4.3.0": {}, + "runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl/4.3.0": {}, + "runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl/4.3.0": {}, + "runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl/4.3.0": {}, + "runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl/4.3.0": {}, + "runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl/4.3.0": {}, + "runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl/4.3.0": {}, + "system.appcontext/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "system.buffers/4.3.0": { + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + }, + "runtime": { + "lib/netstandard1.1/System.Buffers.dll": {} + } + }, + "system.collections/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "system.collections.concurrent/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + }, + "runtime": { + "lib/netstandard1.3/System.Collections.Concurrent.dll": {} + } + }, + "system.collections.nongeneric/4.3.0": { + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + }, + "runtime": { + "lib/netstandard1.3/System.Collections.NonGeneric.dll": {} + } + }, + "system.collections.specialized/4.3.0": { + "dependencies": { + "System.Collections.NonGeneric": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + }, + "runtime": { + "lib/netstandard1.3/System.Collections.Specialized.dll": {} + } + }, + "system.console/4.3.0": { + "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.data.common/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Globalization": "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.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0" + }, + "runtime": { + "lib/netstandard1.2/System.Data.Common.dll": {} + } + }, + "system.diagnostics.debug/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "system.diagnostics.diagnosticsource/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + }, + "runtime": { + "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll": {} + } + }, + "system.diagnostics.tools/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "system.diagnostics.tracing/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "system.globalization/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "system.globalization.calendars/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "system.globalization.extensions/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "system.io/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "system.io.compression/4.3.0": { + "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/4.3.0": { + "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" + }, + "runtime": { + "lib/netstandard1.3/System.IO.Compression.ZipFile.dll": {} + } + }, + "system.io.filesystem/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "system.io.filesystem.primitives/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0" + }, + "runtime": { + "lib/netstandard1.3/System.IO.FileSystem.Primitives.dll": {} + } + }, + "system.linq/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "system.linq.expressions/4.3.0": { + "dependencies": { + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "system.net.http/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.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.IO": "4.3.0", + "System.IO.Compression": "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.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "system.net.nameresolution/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "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.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "system.net.primitives/4.3.0": { + "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.security/4.3.1": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "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.Claims": "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.Security.Principal": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.ThreadPool": "4.3.0" + } + }, + "system.net.sockets/4.3.0": { + "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.objectmodel/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + }, + "runtime": { + "lib/netstandard1.3/System.ObjectModel.dll": {} + } + }, + "system.reflection/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "system.reflection.extensions/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "system.reflection.primitives/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "system.resources.resourcemanager/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "system.runtime/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "system.runtime.extensions/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "system.runtime.handles/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "system.runtime.interopservices/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "system.runtime.interopservices.runtimeinformation/4.3.0": { + "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" + }, + "runtime": { + "lib/netstandard1.1/System.Runtime.InteropServices.RuntimeInformation.dll": {} + } + }, + "system.runtime.numerics/4.3.0": { + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + }, + "runtime": { + "lib/netstandard1.3/System.Runtime.Numerics.dll": {} + } + }, + "system.security.claims/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Globalization": "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.Security.Principal": "4.3.0" + }, + "runtime": { + "lib/netstandard1.3/System.Security.Claims.dll": {} + } + }, + "system.security.cryptography.algorithms/4.3.0": { + "dependencies": { + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0" + } + }, + "system.security.cryptography.encoding/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "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.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "system.security.cryptography.primitives/4.3.0": { + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + }, + "runtime": { + "lib/netstandard1.3/System.Security.Cryptography.Primitives.dll": {} + } + }, + "system.security.cryptography.x509certificates/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0" + } + }, + "system.security.principal/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0" + }, + "runtime": { + "lib/netstandard1.0/System.Security.Principal.dll": {} + } + }, + "system.security.principal.windows/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Reflection": "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.Claims": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "system.text.encoding/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "system.text.encoding.extensions/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "system.text.regularexpressions/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "system.threading/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + }, + "runtime": { + "lib/netstandard1.3/System.Threading.dll": {} + } + }, + "system.threading.tasks/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "system.threading.tasks.extensions/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + }, + "runtime": { + "lib/netstandard1.0/System.Threading.Tasks.Extensions.dll": {} + } + }, + "system.threading.thread/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0" + }, + "runtime": { + "lib/netstandard1.3/System.Threading.Thread.dll": {} + } + }, + "system.threading.threadpool/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + }, + "runtime": { + "lib/netstandard1.3/System.Threading.ThreadPool.dll": {} + } + }, + "system.threading.timer/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "system.xml.readerwriter/4.3.0": { + "dependencies": { + "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.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + }, + "runtime": { + "lib/netstandard1.3/System.Xml.ReaderWriter.dll": {} + } + }, + "system.xml.xdocument/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "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.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + }, + "runtime": { + "lib/netstandard1.3/System.Xml.XDocument.dll": {} + } + } + } + }, + "libraries": { + "servicestack.redis/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "microsoft.netcore.platforms/1.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==", + "path": "microsoft.netcore.platforms/1.1.0", + "hashPath": "microsoft.netcore.platforms.1.1.0.nupkg.sha512" + }, + "microsoft.netcore.targets/1.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==", + "path": "microsoft.netcore.targets/1.1.0", + "hashPath": "microsoft.netcore.targets.1.1.0.nupkg.sha512" + }, + "microsoft.win32.primitives/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "path": "microsoft.win32.primitives/4.3.0", + "hashPath": "microsoft.win32.primitives.4.3.0.nupkg.sha512" + }, + "netstandard.library/1.6.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "path": "netstandard.library/1.6.1", + "hashPath": "netstandard.library.1.6.1.nupkg.sha512" + }, + "runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==", + "path": "runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==", + "path": "runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==", + "path": "runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.native.system/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "path": "runtime.native.system/4.3.0", + "hashPath": "runtime.native.system.4.3.0.nupkg.sha512" + }, + "runtime.native.system.io.compression/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "path": "runtime.native.system.io.compression/4.3.0", + "hashPath": "runtime.native.system.io.compression.4.3.0.nupkg.sha512" + }, + "runtime.native.system.security.cryptography.openssl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "path": "runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==", + "path": "runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==", + "path": "runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==", + "path": "runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==", + "path": "runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==", + "path": "runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==", + "path": "runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==", + "path": "runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "system.appcontext/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "path": "system.appcontext/4.3.0", + "hashPath": "system.appcontext.4.3.0.nupkg.sha512" + }, + "system.buffers/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "path": "system.buffers/4.3.0", + "hashPath": "system.buffers.4.3.0.nupkg.sha512" + }, + "system.collections/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "path": "system.collections/4.3.0", + "hashPath": "system.collections.4.3.0.nupkg.sha512" + }, + "system.collections.concurrent/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "path": "system.collections.concurrent/4.3.0", + "hashPath": "system.collections.concurrent.4.3.0.nupkg.sha512" + }, + "system.collections.nongeneric/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-prtjIEMhGUnQq6RnPEYLpFt8AtLbp9yq2zxOSrY7KJJZrw25Fi97IzBqY7iqssbM61Ek5b8f3MG/sG1N2sN5KA==", + "path": "system.collections.nongeneric/4.3.0", + "hashPath": "system.collections.nongeneric.4.3.0.nupkg.sha512" + }, + "system.collections.specialized/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Epx8PoVZR0iuOnJJDzp7pWvdfMMOAvpUo95pC4ScH2mJuXkKA2Y4aR3cG9qt2klHgSons1WFh4kcGW7cSXvrxg==", + "path": "system.collections.specialized/4.3.0", + "hashPath": "system.collections.specialized.4.3.0.nupkg.sha512" + }, + "system.console/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "path": "system.console/4.3.0", + "hashPath": "system.console.4.3.0.nupkg.sha512" + }, + "system.data.common/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-lm6E3T5u7BOuEH0u18JpbJHxBfOJPuCyl4Kg1RH10ktYLp5uEEE1xKrHW56/We4SnZpGAuCc9N0MJpSDhTHZGQ==", + "path": "system.data.common/4.3.0", + "hashPath": "system.data.common.4.3.0.nupkg.sha512" + }, + "system.diagnostics.debug/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "path": "system.diagnostics.debug/4.3.0", + "hashPath": "system.diagnostics.debug.4.3.0.nupkg.sha512" + }, + "system.diagnostics.diagnosticsource/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", + "path": "system.diagnostics.diagnosticsource/4.3.0", + "hashPath": "system.diagnostics.diagnosticsource.4.3.0.nupkg.sha512" + }, + "system.diagnostics.tools/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "path": "system.diagnostics.tools/4.3.0", + "hashPath": "system.diagnostics.tools.4.3.0.nupkg.sha512" + }, + "system.diagnostics.tracing/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "path": "system.diagnostics.tracing/4.3.0", + "hashPath": "system.diagnostics.tracing.4.3.0.nupkg.sha512" + }, + "system.globalization/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "path": "system.globalization/4.3.0", + "hashPath": "system.globalization.4.3.0.nupkg.sha512" + }, + "system.globalization.calendars/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "path": "system.globalization.calendars/4.3.0", + "hashPath": "system.globalization.calendars.4.3.0.nupkg.sha512" + }, + "system.globalization.extensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "path": "system.globalization.extensions/4.3.0", + "hashPath": "system.globalization.extensions.4.3.0.nupkg.sha512" + }, + "system.io/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "path": "system.io/4.3.0", + "hashPath": "system.io.4.3.0.nupkg.sha512" + }, + "system.io.compression/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "path": "system.io.compression/4.3.0", + "hashPath": "system.io.compression.4.3.0.nupkg.sha512" + }, + "system.io.compression.zipfile/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "path": "system.io.compression.zipfile/4.3.0", + "hashPath": "system.io.compression.zipfile.4.3.0.nupkg.sha512" + }, + "system.io.filesystem/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "path": "system.io.filesystem/4.3.0", + "hashPath": "system.io.filesystem.4.3.0.nupkg.sha512" + }, + "system.io.filesystem.primitives/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "path": "system.io.filesystem.primitives/4.3.0", + "hashPath": "system.io.filesystem.primitives.4.3.0.nupkg.sha512" + }, + "system.linq/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "path": "system.linq/4.3.0", + "hashPath": "system.linq.4.3.0.nupkg.sha512" + }, + "system.linq.expressions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "path": "system.linq.expressions/4.3.0", + "hashPath": "system.linq.expressions.4.3.0.nupkg.sha512" + }, + "system.net.http/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "path": "system.net.http/4.3.0", + "hashPath": "system.net.http.4.3.0.nupkg.sha512" + }, + "system.net.nameresolution/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-AFYl08R7MrsrEjqpQWTZWBadqXyTzNDaWpMqyxhb0d6sGhV6xMDKueuBXlLL30gz+DIRY6MpdgnHWlCh5wmq9w==", + "path": "system.net.nameresolution/4.3.0", + "hashPath": "system.net.nameresolution.4.3.0.nupkg.sha512" + }, + "system.net.primitives/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "path": "system.net.primitives/4.3.0", + "hashPath": "system.net.primitives.4.3.0.nupkg.sha512" + }, + "system.net.security/4.3.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-qYnDntmrrHXUAhA+v2Kve8onMjJ2ZryQvx7kjGhW88c0IgA9B+q2M8b3l76HFBeotufDbAJfOvLEP32PS4XIKA==", + "path": "system.net.security/4.3.1", + "hashPath": "system.net.security.4.3.1.nupkg.sha512" + }, + "system.net.sockets/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "path": "system.net.sockets/4.3.0", + "hashPath": "system.net.sockets.4.3.0.nupkg.sha512" + }, + "system.objectmodel/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "path": "system.objectmodel/4.3.0", + "hashPath": "system.objectmodel.4.3.0.nupkg.sha512" + }, + "system.reflection/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "path": "system.reflection/4.3.0", + "hashPath": "system.reflection.4.3.0.nupkg.sha512" + }, + "system.reflection.extensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "path": "system.reflection.extensions/4.3.0", + "hashPath": "system.reflection.extensions.4.3.0.nupkg.sha512" + }, + "system.reflection.primitives/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "path": "system.reflection.primitives/4.3.0", + "hashPath": "system.reflection.primitives.4.3.0.nupkg.sha512" + }, + "system.resources.resourcemanager/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "path": "system.resources.resourcemanager/4.3.0", + "hashPath": "system.resources.resourcemanager.4.3.0.nupkg.sha512" + }, + "system.runtime/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "path": "system.runtime/4.3.0", + "hashPath": "system.runtime.4.3.0.nupkg.sha512" + }, + "system.runtime.extensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "path": "system.runtime.extensions/4.3.0", + "hashPath": "system.runtime.extensions.4.3.0.nupkg.sha512" + }, + "system.runtime.handles/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "path": "system.runtime.handles/4.3.0", + "hashPath": "system.runtime.handles.4.3.0.nupkg.sha512" + }, + "system.runtime.interopservices/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "path": "system.runtime.interopservices/4.3.0", + "hashPath": "system.runtime.interopservices.4.3.0.nupkg.sha512" + }, + "system.runtime.interopservices.runtimeinformation/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "path": "system.runtime.interopservices.runtimeinformation/4.3.0", + "hashPath": "system.runtime.interopservices.runtimeinformation.4.3.0.nupkg.sha512" + }, + "system.runtime.numerics/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "path": "system.runtime.numerics/4.3.0", + "hashPath": "system.runtime.numerics.4.3.0.nupkg.sha512" + }, + "system.security.claims/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-P/+BR/2lnc4PNDHt/TPBAWHVMLMRHsyYZbU1NphW4HIWzCggz8mJbTQQ3MKljFE7LS3WagmVFuBgoLcFzYXlkA==", + "path": "system.security.claims/4.3.0", + "hashPath": "system.security.claims.4.3.0.nupkg.sha512" + }, + "system.security.cryptography.algorithms/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "path": "system.security.cryptography.algorithms/4.3.0", + "hashPath": "system.security.cryptography.algorithms.4.3.0.nupkg.sha512" + }, + "system.security.cryptography.encoding/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "path": "system.security.cryptography.encoding/4.3.0", + "hashPath": "system.security.cryptography.encoding.4.3.0.nupkg.sha512" + }, + "system.security.cryptography.primitives/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "path": "system.security.cryptography.primitives/4.3.0", + "hashPath": "system.security.cryptography.primitives.4.3.0.nupkg.sha512" + }, + "system.security.cryptography.x509certificates/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "path": "system.security.cryptography.x509certificates/4.3.0", + "hashPath": "system.security.cryptography.x509certificates.4.3.0.nupkg.sha512" + }, + "system.security.principal/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", + "path": "system.security.principal/4.3.0", + "hashPath": "system.security.principal.4.3.0.nupkg.sha512" + }, + "system.security.principal.windows/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-HVL1rvqYtnRCxFsYag/2le/ZfKLK4yMw79+s6FmKXbSCNN0JeAhrYxnRAHFoWRa0dEojsDcbBSpH3l22QxAVyw==", + "path": "system.security.principal.windows/4.3.0", + "hashPath": "system.security.principal.windows.4.3.0.nupkg.sha512" + }, + "system.text.encoding/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "path": "system.text.encoding/4.3.0", + "hashPath": "system.text.encoding.4.3.0.nupkg.sha512" + }, + "system.text.encoding.extensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "path": "system.text.encoding.extensions/4.3.0", + "hashPath": "system.text.encoding.extensions.4.3.0.nupkg.sha512" + }, + "system.text.regularexpressions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "path": "system.text.regularexpressions/4.3.0", + "hashPath": "system.text.regularexpressions.4.3.0.nupkg.sha512" + }, + "system.threading/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "path": "system.threading/4.3.0", + "hashPath": "system.threading.4.3.0.nupkg.sha512" + }, + "system.threading.tasks/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "path": "system.threading.tasks/4.3.0", + "hashPath": "system.threading.tasks.4.3.0.nupkg.sha512" + }, + "system.threading.tasks.extensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "path": "system.threading.tasks.extensions/4.3.0", + "hashPath": "system.threading.tasks.extensions.4.3.0.nupkg.sha512" + }, + "system.threading.thread/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", + "path": "system.threading.thread/4.3.0", + "hashPath": "system.threading.thread.4.3.0.nupkg.sha512" + }, + "system.threading.threadpool/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", + "path": "system.threading.threadpool/4.3.0", + "hashPath": "system.threading.threadpool.4.3.0.nupkg.sha512" + }, + "system.threading.timer/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "path": "system.threading.timer/4.3.0", + "hashPath": "system.threading.timer.4.3.0.nupkg.sha512" + }, + "system.xml.readerwriter/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "path": "system.xml.readerwriter/4.3.0", + "hashPath": "system.xml.readerwriter.4.3.0.nupkg.sha512" + }, + "system.xml.xdocument/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "path": "system.xml.xdocument/4.3.0", + "hashPath": "system.xml.xdocument.4.3.0.nupkg.sha512" + } + } +} \ No newline at end of file diff --git a/NuGet.Core/ServiceStack.Redis.Core/lib/netstandard1.3/ServiceStack.Redis.dll b/NuGet.Core/ServiceStack.Redis.Core/lib/netstandard1.3/ServiceStack.Redis.dll new file mode 100644 index 00000000..7385adac Binary files /dev/null and b/NuGet.Core/ServiceStack.Redis.Core/lib/netstandard1.3/ServiceStack.Redis.dll differ diff --git a/NuGet.Core/ServiceStack.Redis.Core/lib/netstandard1.3/ServiceStack.Redis.xml b/NuGet.Core/ServiceStack.Redis.Core/lib/netstandard1.3/ServiceStack.Redis.xml new file mode 100644 index 00000000..53bbf139 --- /dev/null +++ b/NuGet.Core/ServiceStack.Redis.Core/lib/netstandard1.3/ServiceStack.Redis.xml @@ -0,0 +1,1612 @@ + + + + ServiceStack.Redis + + + + + Provides thread-safe retrievel of redis clients since each client is a new one. + Allows the configuration of different ReadWrite and ReadOnly hosts + + + BasicRedisClientManager for ICacheClient + + For more interoperabilty I'm also implementing the ICacheClient on + this cache client manager which has the affect of calling + GetCacheClient() for all write operations and GetReadOnlyCacheClient() + for the read ones. + + This works well for master-slave replication scenarios where you have + 1 master that replicates to multiple read slaves. + + + + + Gets or sets object key prefix. + + + + + Hosts can be an IP Address or Hostname in the format: host[:port] + e.g. 127.0.0.1:6379 + default is: localhost:6379 + + The write hosts. + The read hosts. + + + + + Returns a Read/Write client (The default) using the hosts defined in ReadWriteHosts + + + + + + Returns a ReadOnly client using the hosts defined in ReadOnlyHosts. + + + + + + Courtesy of @marcgravell + http://code.google.com/p/protobuf-net/source/browse/trunk/protobuf-net/BufferPool.cs + + + + + A complete redis command, with method to send command, receive response, and run callback on success or failure + + + + + Wrap the common redis set operations under a ICollection[string] interface. + + + + + Wrap the common redis set operations under a ICollection[string] interface. + + + + + Wrap the common redis set operations under a ICollection[string] interface. + + + + + Allows you to get Redis value operations to operate against POCO types. + + + + + + Use this to share the same redis connection with another + + The client. + + + + Queue of commands for redis typed client + + + + + + Adds support for Redis Transactions (i.e. MULTI/EXEC/DISCARD operations). + + + + + Put "QUEUED" messages at back of queue + + + + + + Issue exec command (not queued) + + + + + callback for after result count is read in + + + + + + Pipeline for redis typed client + + + + + + Resolver strategy for resolving hosts and creating clients + + + + + A complete redis command, with method to send command, receive response, and run callback on success or failure + + + + + General purpose pipeline + + + + + + Flush send buffer, and read responses + + + + + Redis command that does not get queued + + + + + + + + + Redis operation (transaction/pipeline) that allows queued commands to be completed + + + + + Provides thread-safe pooling of redis client connections. + Allows load-balancing of master-write and read-slave hosts, ideal for + 1 master and multiple replicated read slaves. + + + + + Gets or sets object key prefix. + + + + + Hosts can be an IP Address or Hostname in the format: host[:port] + e.g. 127.0.0.1:6379 + default is: localhost:6379 + + The write hosts. + The read hosts. + The config. + + + + Returns a Read/Write client (The default) using the hosts defined in ReadWriteHosts + + + + + + Called within a lock + + + + + + Returns a ReadOnly client using the hosts defined in ReadOnlyHosts. + + + + + + Called within a lock + + + + + + Disposes the read only client. + + The client. + + + + Disposes the write client. + + The client. + + + + Manage a client acquired from the PooledRedisClientManager + Dispose method will release the client back to the pool. + + + + + wrap the acquired client + + + + + + access the wrapped client + + + + + release the wrapped client back to the pool + + + + + The client wraps the native redis operations into a more readable c# API. + + Where possible these operations are also exposed in common c# interfaces, + e.g. RedisClient.Lists => IList[string] + RedisClient.Sets => ICollection[string] + + + + + Creates a new instance of the Redis Client from NewFactoryFn. + + + + + Store object fields as a dictionary of values in a Hash value. + Conversion to Dictionary can be customized with RedisClient.ConvertToHashFn + + + + + Returns key with automatic object id detection in provided value with generic type. + + + + + + + Returns key with explicit object id. + + + + + + + Returns key with explicit object type and id. + + + + + + + + Wrap the common redis set operations under a ICollection[string] interface. + + + + + Wrap the common redis list operations under a IList[string] interface. + + + + + For interoperabilty GetCacheClient() and GetReadOnlyCacheClient() + return an ICacheClient wrapper around the redis manager which has the affect of calling + GetClient() for all write operations and GetReadOnlyClient() for the read ones. + + This works well for master-slave replication scenarios where you have + 1 master that replicates to multiple read slaves. + + + + + Ignore dispose on RedisClientsManager, which should be registered as a singleton + + + + + Wrap the common redis set operations under a ICollection[string] interface. + + + + + Useful wrapper IRedisClientsManager to cut down the boiler plate of most IRedisClient access + + + + + Creates a PubSubServer that uses a background thread to listen and process for + Redis Pub/Sub messages published to the specified channel. + Use optional callbacks to listen for message, error and life-cycle events. + Callbacks can be assigned later, then call Start() for PubSubServer to start listening for messages + + + + + Wrap the common redis set operations under a ICollection[string] interface. + + + + + Factory used to Create `RedisClient` instances + + + + + The default RedisClient Socket ConnectTimeout (default -1, None) + + + + + The default RedisClient Socket SendTimeout (default -1, None) + + + + + The default RedisClient Socket ReceiveTimeout (default -1, None) + + + + + Default Idle TimeOut before a connection is considered to be stale (default 240 secs) + + + + + The default RetryTimeout for auto retry of failed operations (default 10,000ms) + + + + + Default Max Pool Size for Pooled Redis Client Managers (default none) + + + + + The BackOff multiplier failed Auto Retries starts from (default 10ms) + + + + + The Byte Buffer Size to combine Redis Operations within (default 1450 bytes) + + + + + The Byte Buffer Size for Operations to use a byte buffer pool (default 500kb) + + + + + Whether Connections to Master hosts should be verified they're still master instances (default true) + + + + + The ConnectTimeout on clients used to find the next available host (default 200ms) + + + + + Skip ServerVersion Checks by specifying Min Version number, e.g: 2.8.12 => 2812, 2.9.1 => 2910 + + + + + How long to hold deactivated clients for before disposing their connection (default 1 min) + Dispose of deactivated Clients immediately with TimeSpan.Zero + + + + + Whether Debug Logging should log detailed Redis operations (default false) + + + + + Resets Redis Config and Redis Stats back to default values + + + + + Redis-specific exception. Thrown if unable to connect to Redis server due to socket exception, for example. + + + + + Configuration class for the RedisManagerPool + + + + + Default pool size used by every new instance of . (default: 40) + + + + + Maximum ammount of s created by the . + + + + + Provides thread-safe pooling of redis client connections. All connections are treaded as read and write hosts. + + + + + Returns a Read/Write client (The default) using the hosts defined in ReadWriteHosts + + + + + + Called within a lock + + + + + + Disposes the write client. + + The client. + + + + This class contains all the common operations for the RedisClient. + The client contains a 1:1 mapping of c# methods to redis operations of the same name. + + Not threadsafe, use a pooled manager! + All redis calls on a single instances write to the same Socket. + If used in multiple threads (or async Tasks) at the same time you will find + that commands are not executed properly by redis and Servicestack wont be able to (json) serialize + the data that comes back. + + + + + Used to manage connection pooling + + + + + Gets or sets object key prefix. + + + + + Requires custom result parsing + + Number of results + + + + Command to set multuple binary safe arguments + + + + + + + Send command outside of managed Write Buffer + + + + + + reset buffer index in send buffer + + + + + Change to use a different IRedisClientsManager + + + + + Configure the Redis Connection String to use for a Redis Client Host + + + + + The configured Redis Client Manager this Sentinel managers + + + + + Fired when Sentinel fails over the Redis Client Manager to a new master + + + + + Fired when the Redis Sentinel Worker connection fails + + + + + Fired when the Sentinel worker receives a message from the Sentinel Subscription + + + + + Map the internal IP's returned by Sentinels to its external IP + + + + + Whether to routinely scan for other sentinel hosts (default true) + + + + + What interval to scan for other sentinel hosts (default 10 mins) + + + + + How long to wait after failing before connecting to next redis instance (default 250ms) + + + + + How long to retry connecting to hosts before throwing (default 60 secs) + + + + + How long to wait after consecutive failed connection attempts to master before forcing + a Sentinel to failover the current master (default 60 secs) + + + + + The Max Connection time for Sentinel Worker (default 100ms) + + + + + The Max TCP Socket Receive time for Sentinel Worker (default 100ms) + + + + + The Max TCP Socket Send time for Sentinel Worker (default 100ms) + + + + + Reset client connections when Sentinel reports redis instance is subjectively down (default true) + + + + + Reset client connections when Sentinel reports redis instance is objectively down (default true) + + + + + Initialize Sentinel Subscription and Configure Redis ClientsManager + + + + + Check if GetValidSentinel should try the next sentinel server + + + This will be true if the failures is less than either RedisSentinel.MaxFailures or the # of sentinels, whatever is greater + + + + Event that is fired when the sentinel subscription raises an event + + + + + + + Don't immediately kill connections of active clients after failover to give them a chance to dispose gracefully. + Deactivating clients are automatically cleared from the pool. + + + + + Total number of commands sent + + + + + Number of times the Redis Client Managers have FailoverTo() either by sentinel or manually + + + + + Number of times a Client was deactivated from the pool, either by FailoverTo() or exceptions on client + + + + + Number of times connecting to a Sentinel has failed + + + + + Number of times we've forced Sentinel to failover to another master due to + consecutive errors beyond sentinel.WaitBeforeForcingMasterFailover + + + + + Number of times a connecting to a reported Master wasn't actually a Master + + + + + Number of times no Masters could be found in any of the configured hosts + + + + + Number of Redis Client instances created with RedisConfig.ClientFactory + + + + + Number of times a Redis Client was created outside of pool, either due to overflow or reserved slot was overridden + + + + + Number of times Redis Sentinel reported a Subjective Down (sdown) + + + + + Number of times Redis Sentinel reported an Objective Down (sdown) + + + + + Number of times a Redis Request was retried due to Socket or Retryable exception + + + + + Number of times a Request succeeded after it was retried + + + + + Number of times a Retry Request failed after exceeding RetryTimeout + + + + + Total number of deactivated clients that are pending being disposed + + + + + Provides a redis connection pool that can be sharded + + + + + logical name + + + + + An arbitrary weight relative to other nodes + + + + logical name + An arbitrary weight relative to other nodes + redis nodes + + + + Provides sharding of redis client connections. + uses consistent hashing to distribute keys across connection pools + + + + + maps a key to a redis connection pool + + key to map + a redis connection pool + + + + Adds a node and maps points across the circle + + node to add + An arbitrary number, specifies how often it occurs relative to other targets. + + + + A variation of Binary Search algorithm. Given a number, matches the next highest number from the sorted array. + If a higher number does not exist, then the first number in the array is returned. + + a sorted array to perform the search + number to find the next highest number against + next highest number + + + + Given a key, generates an unsigned 64 bit hash code using MD5 + + + + + + + Provides access to the method reflection data as part of the before/after event + + + + + Stores details about the context in which an IRedisClient is allocated. + + + + + Represents a generic collection of key/value pairs that are ordered independently of the key and value. + + The type of the keys in the dictionary + The type of the values in the dictionary + + + + Adds an entry with the specified key and value into the IOrderedDictionary<TKey,TValue> collection with the lowest available index. + + The key of the entry to add. + The value of the entry to add. + The index of the newly added entry + + You can also use the property to add new elements by setting the value of a key that does not exist in the IOrderedDictionary<TKey,TValue> collection; however, if the specified key already exists in the IOrderedDictionary<TKey,TValue>, setting the property overwrites the old value. In contrast, the method does not modify existing elements. + An element with the same key already exists in the IOrderedDictionary<TKey,TValue> + The IOrderedDictionary<TKey,TValue> is read-only.
+ -or-
+ The IOrderedDictionary<TKey,TValue> has a fized size.
+
+ + + Inserts a new entry into the IOrderedDictionary<TKey,TValue> collection with the specified key and value at the specified index. + + The zero-based index at which the element should be inserted. + The key of the entry to add. + The value of the entry to add. The value can be if the type of the values in the dictionary is a reference type. + is less than 0.
+ -or-
+ is greater than .
+ An element with the same key already exists in the IOrderedDictionary<TKey,TValue>. + The IOrderedDictionary<TKey,TValue> is read-only.
+ -or-
+ The IOrderedDictionary<TKey,TValue> has a fized size.
+
+ + + Gets or sets the value at the specified index. + + The zero-based index of the value to get or set. + The value of the item at the specified index. + is less than 0.
+ -or-
+ is equal to or greater than .
+
+ + + distributed lock class that follows the Resource Allocation Is Initialization pattern + + + + + Lock + + + + in seconds + in seconds + + + + unlock + + + + + acquire distributed, non-reentrant lock on key + + global key for this lock + timeout for acquiring lock + timeout for lock, in seconds (stored as value against lock key) + + + + + + unlock key + + + + + + + + + + + + + Distributed lock interface + + + + + Locking strategy interface + + + + + This class manages a read lock for a local readers/writer lock, + using the Resource Acquisition Is Initialization pattern + + + + + RAII initialization + + + + + + RAII disposal + + + + + This class manages a write lock for a local readers/writer lock, + using the Resource Acquisition Is Initialization pattern + + + + + + RAII disposal + + + + + serialize/deserialize arbitrary objects + (objects must be serializable) + + + + + Serialize object to buffer + + serializable object + + + + + Deserialize buffer to object + + byte array to deserialize + + + + + Optimized implementation. Primitive types are manually serialized, the rest are serialized using binary serializer />. + + + + + + + + + + + + + + + + + + + serialize value and wrap with + + + + + + + Unwrap object wrapped in + + + + + + + Represents a generic collection of key/value pairs that are ordered independently of the key and value. + + The type of the keys in the dictionary + The type of the values in the dictionary + + + + Initializes a new instance of the OrderedDictionary<TKey,TValue> class. + + + + + Initializes a new instance of the OrderedDictionary<TKey,TValue> class using the specified initial capacity. + + The initial number of elements that the OrderedDictionary<TKey,TValue> can contain. + is less than 0 + + + + Initializes a new instance of the OrderedDictionary<TKey,TValue> class using the specified comparer. + + The IEqualityComparer<TKey> to use when comparing keys, or to use the default EqualityComparer<TKey> for the type of the key. + + + + Initializes a new instance of the OrderedDictionary<TKey,TValue> class using the specified initial capacity and comparer. + + The initial number of elements that the OrderedDictionary<TKey,TValue> collection can contain. + The IEqualityComparer<TKey> to use when comparing keys, or to use the default EqualityComparer<TKey> for the type of the key. + is less than 0 + + + + Converts the object passed as a key to the key type of the dictionary + + The key object to check + The key object, cast as the key type of the dictionary + is . + The key type of the OrderedDictionary<TKey,TValue> is not in the inheritance hierarchy of . + + + + Converts the object passed as a value to the value type of the dictionary + + The object to convert to the value type of the dictionary + The value object, converted to the value type of the dictionary + is , and the value type of the OrderedDictionary<TKey,TValue> is a value type. + The value type of the OrderedDictionary<TKey,TValue> is not in the inheritance hierarchy of . + + + + Gets the dictionary object that stores the keys and values + + The dictionary object that stores the keys and values for the OrderedDictionary<TKey,TValue> + Accessing this property will create the dictionary object if necessary + + + + Gets the list object that stores the key/value pairs. + + The list object that stores the key/value pairs for the OrderedDictionary<TKey,TValue> + Accessing this property will create the list object if necessary. + + + + Inserts a new entry into the OrderedDictionary<TKey,TValue> collection with the specified key and value at the specified index. + + The zero-based index at which the element should be inserted. + The key of the entry to add. + The value of the entry to add. The value can be if the type of the values in the dictionary is a reference type. + is less than 0.
+ -or-
+ is greater than .
+ is . + An element with the same key already exists in the OrderedDictionary<TKey,TValue>. +
+ + + Inserts a new entry into the OrderedDictionary<TKey,TValue> collection with the specified key and value at the specified index. + + The zero-based index at which the element should be inserted. + The key of the entry to add. + The value of the entry to add. The value can be if the type of the values in the dictionary is a reference type. + is less than 0.
+ -or-
+ is greater than .
+ is .
+ -or-
+ is , and the value type of the OrderedDictionary<TKey,TValue> is a value type.
+ The key type of the OrderedDictionary<TKey,TValue> is not in the inheritance hierarchy of .
+ -or-
+ The value type of the OrderedDictionary<TKey,TValue> is not in the inheritance hierarchy of .
+ -or-
+ An element with the same key already exists in the OrderedDictionary<TKey,TValue>.
+
+ + + Removes the entry at the specified index from the OrderedDictionary<TKey,TValue> collection. + + The zero-based index of the entry to remove. + is less than 0.
+ -or-
+ index is equal to or greater than .
+
+ + + Gets or sets the value at the specified index. + + The zero-based index of the value to get or set. + The value of the item at the specified index. + is less than 0.
+ -or-
+ index is equal to or greater than .
+
+ + + Gets or sets the value at the specified index. + + The zero-based index of the value to get or set. + The value of the item at the specified index. + is less than 0.
+ -or-
+ index is equal to or greater than .
+ is a null reference, and the value type of the OrderedDictionary<TKey,TValue> is a value type. + The value type of the OrderedDictionary<TKey,TValue> is not in the inheritance hierarchy of . +
+ + + Adds an entry with the specified key and value into the OrderedDictionary<TKey,TValue> collection with the lowest available index. + + The key of the entry to add. + The value of the entry to add. This value can be . + A key cannot be , but a value can be. + You can also use the property to add new elements by setting the value of a key that does not exist in the OrderedDictionary<TKey,TValue> collection; however, if the specified key already exists in the OrderedDictionary<TKey,TValue>, setting the property overwrites the old value. In contrast, the method does not modify existing elements. + is + An element with the same key already exists in the OrderedDictionary<TKey,TValue> + + + + Adds an entry with the specified key and value into the OrderedDictionary<TKey,TValue> collection with the lowest available index. + + The key of the entry to add. + The value of the entry to add. This value can be . + The index of the newly added entry + A key cannot be , but a value can be. + You can also use the property to add new elements by setting the value of a key that does not exist in the OrderedDictionary<TKey,TValue> collection; however, if the specified key already exists in the OrderedDictionary<TKey,TValue>, setting the property overwrites the old value. In contrast, the method does not modify existing elements. + is + An element with the same key already exists in the OrderedDictionary<TKey,TValue> + + + + Adds an entry with the specified key and value into the OrderedDictionary<TKey,TValue> collection with the lowest available index. + + The key of the entry to add. + The value of the entry to add. This value can be . + is .
+ -or-
+ is , and the value type of the OrderedDictionary<TKey,TValue> is a value type.
+ The key type of the OrderedDictionary<TKey,TValue> is not in the inheritance hierarchy of .
+ -or-
+ The value type of the OrderedDictionary<TKey,TValue> is not in the inheritance hierarchy of .
+
+ + + Removes all elements from the OrderedDictionary<TKey,TValue> collection. + + The capacity is not changed as a result of calling this method. + + + + Determines whether the OrderedDictionary<TKey,TValue> collection contains a specific key. + + The key to locate in the OrderedDictionary<TKey,TValue> collection. + if the OrderedDictionary<TKey,TValue> collection contains an element with the specified key; otherwise, . + is + + + + Determines whether the OrderedDictionary<TKey,TValue> collection contains a specific key. + + The key to locate in the OrderedDictionary<TKey,TValue> collection. + if the OrderedDictionary<TKey,TValue> collection contains an element with the specified key; otherwise, . + is + The key type of the OrderedDictionary<TKey,TValue> is not in the inheritance hierarchy of . + + + + Gets a value indicating whether the OrderedDictionary<TKey,TValue> has a fixed size. + + if the OrderedDictionary<TKey,TValue> has a fixed size; otherwise, . The default is . + + + + Gets a value indicating whether the OrderedDictionary<TKey,TValue> collection is read-only. + + if the OrderedDictionary<TKey,TValue> is read-only; otherwise, . The default is . + + A collection that is read-only does not allow the addition, removal, or modification of elements after the collection is created. + A collection that is read-only is simply a collection with a wrapper that prevents modification of the collection; therefore, if changes are made to the underlying collection, the read-only collection reflects those changes. + + + + + Gets an object containing the keys in the OrderedDictionary<TKey,TValue>. + + An object containing the keys in the OrderedDictionary<TKey,TValue>. + The returned object is not a static copy; instead, the collection refers back to the keys in the original OrderedDictionary<TKey,TValue>. Therefore, changes to the OrderedDictionary<TKey,TValue> continue to be reflected in the key collection. + + + + Returns the zero-based index of the specified key in the OrderedDictionary<TKey,TValue> + + The key to locate in the OrderedDictionary<TKey,TValue> + The zero-based index of , if is found in the OrderedDictionary<TKey,TValue>; otherwise, -1 + This method performs a linear search; therefore it has a cost of O(n) at worst. + + + + Removes the entry with the specified key from the OrderedDictionary<TKey,TValue> collection. + + The key of the entry to remove + if the key was found and the corresponding element was removed; otherwise, + + + + Removes the entry with the specified key from the OrderedDictionary<TKey,TValue> collection. + + The key of the entry to remove + + + + Gets an object containing the values in the OrderedDictionary<TKey,TValue> collection. + + An object containing the values in the OrderedDictionary<TKey,TValue> collection. + The returned object is not a static copy; instead, the refers back to the values in the original OrderedDictionary<TKey,TValue> collection. Therefore, changes to the OrderedDictionary<TKey,TValue> continue to be reflected in the . + + + + Gets or sets the value with the specified key. + + The key of the value to get or set. + The value associated with the specified key. If the specified key is not found, attempting to get it returns , and attempting to set it creates a new element using the specified key. + + + + Gets or sets the value with the specified key. + + The key of the value to get or set. + The value associated with the specified key. If the specified key is not found, attempting to get it returns , and attempting to set it creates a new element using the specified key. + + + + Copies the elements of the OrderedDictionary<TKey,TValue> elements to a one-dimensional Array object at the specified index. + + The one-dimensional object that is the destination of the objects copied from the OrderedDictionary<TKey,TValue>. The must have zero-based indexing. + The zero-based index in at which copying begins. + The method preserves the order of the elements in the OrderedDictionary<TKey,TValue> + + + + Gets the number of key/values pairs contained in the OrderedDictionary<TKey,TValue> collection. + + The number of key/value pairs contained in the OrderedDictionary<TKey,TValue> collection. + + + + Gets a value indicating whether access to the OrderedDictionary<TKey,TValue> object is synchronized (thread-safe). + + This method always returns false. + + + + Gets an object that can be used to synchronize access to the OrderedDictionary<TKey,TValue> object. + + An object that can be used to synchronize access to the OrderedDictionary<TKey,TValue> object. + + + + Gets an ICollection<TKey> object containing the keys in the OrderedDictionary<TKey,TValue>. + + An ICollection<TKey> object containing the keys in the OrderedDictionary<TKey,TValue>. + The returned ICollection<TKey> object is not a static copy; instead, the collection refers back to the keys in the original OrderedDictionary<TKey,TValue>. Therefore, changes to the OrderedDictionary<TKey,TValue> continue to be reflected in the key collection. + + + + Gets the value associated with the specified key. + + The key of the value to get. + When this method returns, contains the value associated with the specified key, if the key is found; otherwise, the default value for the type of . This parameter can be passed uninitialized. + if the OrderedDictionary<TKey,TValue> contains an element with the specified key; otherwise, . + + + + Gets an ICollection<TValue> object containing the values in the OrderedDictionary<TKey,TValue>. + + An ICollection<TValue> object containing the values in the OrderedDictionary<TKey,TValue>. + The returned ICollection<TKey> object is not a static copy; instead, the collection refers back to the values in the original OrderedDictionary<TKey,TValue>. Therefore, changes to the OrderedDictionary<TKey,TValue> continue to be reflected in the value collection. + + + + Adds the specified value to the OrderedDictionary<TKey,TValue> with the specified key. + + The KeyValuePair<TKey,TValue> structure representing the key and value to add to the OrderedDictionary<TKey,TValue>. + + + + Determines whether the OrderedDictionary<TKey,TValue> contains a specific key and value. + + The KeyValuePair<TKey,TValue> structure to locate in the OrderedDictionary<TKey,TValue>. + if is found in the OrderedDictionary<TKey,TValue>; otherwise, . + + + + Copies the elements of the OrderedDictionary<TKey,TValue> to an array of type , starting at the specified index. + + The one-dimensional array of type KeyValuePair<TKey,TValue> that is the destination of the KeyValuePair<TKey,TValue> elements copied from the OrderedDictionary<TKey,TValue>. The array must have zero-based indexing. + The zero-based index in at which copying begins. + + + + Removes a key and value from the dictionary. + + The KeyValuePair<TKey,TValue> structure representing the key and value to remove from the OrderedDictionary<TKey,TValue>. + if the key and value represented by is successfully found and removed; otherwise, . This method returns if is not found in the OrderedDictionary<TKey,TValue>. + + + + distributed work item queue. Messages are processed in chronological order + + + + + Enqueue incoming messages + + + + + + + + Dequeue next batch of work items + + + + + + + + + distributed work item queue. Each message must have an associated + work item id. For a given id, all work items are guaranteed to be processed + in the order in which they are received. + + + + + distributed work item queue. Each message must have an associated + work item id. For a given id, all work items are guaranteed to be processed + in the order in which they are received. + + + + + + + Queue incoming messages + + + + + + + Must call this periodically to move work items from priority queue to pending queue + + + + + Replace existing work item in workItemId queue + + + + + + + + Pop items from list + + + + + + + Force release of locks held by crashed servers + + + + + release lock held by crashed server + + + + true if lock is released, either by this method or by another client; false otherwise + + + + Unlock work item id, so other servers can process items for this id + + + + + + + + + + + + + + + + + + + + + + + + + + + simple distributed work item queue + + + + + + + Queue incoming messages + + + + + + Dequeue next batch of work items for processing. After this method is called, + no other work items with same id will be available for + dequeuing until PostDequeue is called + + KeyValuePair: key is work item id, and value is list of dequeued items. + + + + + distributed work item queue + + + + + pop remaining items that were returned by dequeue, and unlock queue + + + + + + indicate that an item has been processed by the caller + + + + + Update first unprocessed work item + + + + + + customize the client serializer + + + + + Serialize object to buffer + + serializable object + + + + + + + array of serializable objects + + + + + Deserialize buffer to object + + byte array to deserialize + + + + + + + + + + + pop numProcessed items from queue and unlock queue for work item id that dequeued + items are associated with + + + + + + A dequeued work item has been processed. When all of the dequeued items have been processed, + all items will be popped from the queue,and the queue unlocked for the work item id that + the dequeued items are associated with + + + + + Update first unprocessed item with new work item. + + + + + + Enqueue item in priority queue corresponding to workItemId identifier + + + + + + + Preprare next work item id for dequeueing + + + + + Dequeue up to maxBatchSize items from queue corresponding to workItemId identifier. + Once this method is called, or will not + return any items for workItemId until the dequeue lock returned is unlocked. + + + + + + + + Replace existing work item in workItemId queue + + + + + + + + Enqueue item + + + + + + Dequeue up to maxBatchSize items from queue + + + + + + + manages a "region" in the redis key space + namespace can be cleared by incrementing the generation + + + + + get locking strategy + + + + + get current generation + + + + + + set new generation + + + + + + redis key for generation + + + + + + get redis key that holds all namespace keys + + + + + + get global cache key + + + + + + + get global key inside of this namespace + + + prefixes can be added for name deconfliction + + + + + replace UniqueCharacter with its double, to avoid name clash + + + + + + + + + + + + + + wraps a serialized representation of an object + + + + + + Initializes a new instance of . + + Custom item data. + The serialized item. + + + + The data representing the item being stored/retireved. + + + + + Flags set for this instance. + + + + + Adds support for Redis Transactions (i.e. MULTI/EXEC/DISCARD operations). + + + + + Put "QUEUED" messages at back of queue + + + + + + Issue exec command (not queued) + + + + + callback for after result count is read in + + + +
+
diff --git a/NuGet/ServiceStack.Redis.Core/servicestack.redis.core.nuspec b/NuGet/ServiceStack.Redis.Core/servicestack.redis.core.nuspec index e9365e53..f85a6df8 100644 --- a/NuGet/ServiceStack.Redis.Core/servicestack.redis.core.nuspec +++ b/NuGet/ServiceStack.Redis.Core/servicestack.redis.core.nuspec @@ -24,7 +24,7 @@ - + diff --git a/NuGet/ServiceStack.Redis/servicestack.redis.nuspec b/NuGet/ServiceStack.Redis/servicestack.redis.nuspec index 9689a50c..2e736565 100644 --- a/NuGet/ServiceStack.Redis/servicestack.redis.nuspec +++ b/NuGet/ServiceStack.Redis/servicestack.redis.nuspec @@ -20,7 +20,7 @@ ServiceStack and contributors - + @@ -29,7 +29,7 @@ - + diff --git a/build/build.bat b/build/build.bat index de9128d7..13390c7d 100644 --- a/build/build.bat +++ b/build/build.bat @@ -1,5 +1,5 @@ -SET MSBUILD="C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\MSBuild.exe" +SET MSBUILD="C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\MSBuild.exe" %MSBUILD% build.proj /target:Default;NuGetPack /property:Configuration=Release;MinorVersion=1;PatchVersion=0 -msbuild /p:Configuration=Release ..\src\ServiceStack.Redis.sln +%msbuild% /p:Configuration=Release ..\src\ServiceStack.Redis.sln diff --git a/lib/net45/ServiceStack.Client.dll b/lib/net45/ServiceStack.Client.dll index ec2213b1..4ab29f53 100644 Binary files a/lib/net45/ServiceStack.Client.dll and b/lib/net45/ServiceStack.Client.dll differ diff --git a/lib/net45/ServiceStack.Client.xml b/lib/net45/ServiceStack.Client.xml index 508e478c..857fed6c 100644 --- a/lib/net45/ServiceStack.Client.xml +++ b/lib/net45/ServiceStack.Client.xml @@ -109,8 +109,10 @@ Namespace of type - Need to provide async request options - http://msdn.microsoft.com/en-us/library/86wf6409(VS.71).aspx + + Makes a client middleware to access remote web service. This is an abstract class. + Needs to provide async request options, http://msdn.microsoft.com/en-us/library/86wf6409(VS.71).aspx. + @@ -131,6 +133,11 @@ Gets the collection of headers to be added to outgoing requests. + + + Initializes a new instance of the ServiceStack.ServiceClientBase class. + + Sets all baseUri properties, using the Format property for the SyncReplyBaseUri and AsyncOneWayBaseUri diff --git a/lib/net45/ServiceStack.Common.dll b/lib/net45/ServiceStack.Common.dll index 39850b7b..0c76fd50 100644 Binary files a/lib/net45/ServiceStack.Common.dll and b/lib/net45/ServiceStack.Common.dll differ diff --git a/lib/net45/ServiceStack.Common.xml b/lib/net45/ServiceStack.Common.xml index 36f8577a..380db815 100644 --- a/lib/net45/ServiceStack.Common.xml +++ b/lib/net45/ServiceStack.Common.xml @@ -114,6 +114,11 @@ + + + Configure ServiceStack.Text JSON Serializer to use Templates JS parsing + + Creates a Console Logger, that logs all messages to: System.Console @@ -124,8 +129,6 @@ Default logger is to Console.WriteLine - - Made public so its testable @@ -163,8 +166,6 @@ Default logger is to System.Diagnostics.Debug.WriteLine - - Made public so its testable diff --git a/lib/net45/ServiceStack.Interfaces.dll b/lib/net45/ServiceStack.Interfaces.dll index 7acabb04..a4314fa4 100644 Binary files a/lib/net45/ServiceStack.Interfaces.dll and b/lib/net45/ServiceStack.Interfaces.dll differ diff --git a/lib/net45/ServiceStack.Interfaces.xml b/lib/net45/ServiceStack.Interfaces.xml index fe29cfe7..9b35bf4a 100644 --- a/lib/net45/ServiceStack.Interfaces.xml +++ b/lib/net45/ServiceStack.Interfaces.xml @@ -445,7 +445,24 @@ Resolve a dependency from the AppHost's IOC - + + + + + + Provides a common interface for Settings providers such as + ConfigurationManager or Azure's RoleEnvironment. The only + requirement is that if the implementation cannot find the + specified key, the return value must be null + + The key for the setting + The string value of the specified key, or null if the key + was invalid + + + + Return all keys in this configuration source. + @@ -518,6 +535,13 @@ Range Key Attribute used to specify which property is the RangeKey, e.g. in DynamoDb. + + + ReturnAttribute + Use to indicate that a property should be included in the + returning/output clause of INSERT sql sentences + + Used to indicate that property is a row version incremented automatically by the database @@ -918,64 +942,45 @@ - Logging API for this library. You can inject your own implementation otherwise - will use the DebugLogFactory to write to System.Diagnostics.Debug + Provides access to loggers. This class cannot be inherited. - Gets or sets the log factory. - Use this to override the factory that is used to create loggers + Gets or sets the log factory used to create loggers. The default value is + . - - - Gets the logger. - - - - - Gets the logger. - - - + - Default logger is to System.Diagnostics.Debug.Print - - Made public so its testable + Creates a empty Logger, that does not log anything. - + - Initializes a new instance of the class. + Initializes a new instance of the class. - + - Initializes a new instance of the class. + Initializes a new instance of the class. - + Logs the specified message. - + Logs the format. - + Logs the specified message. - - - - Creates a Debug Logger, that logs all messages to: System.Diagnostics.Debug - - Made public so its testable - + The message. @@ -983,22 +988,6 @@ Made public so its testable - - - Logs the specified message. - - - - - Logs the format. - - - - - Logs the specified message. - - The message. - Creates a test Logger, that stores all log messages in a member list @@ -1015,7 +1004,7 @@ Initializes a new instance of the class. - The type. + The type. @@ -2286,124 +2275,5 @@ Executes the DTO request with the current HttpRequest and option to Execute Request/Response Filters. - - - Allow the registration of user-defined routes for services - - - - - Maps the specified REST path to the specified request DTO. - - The type of request DTO to map - the path to. - The path to map the request DTO to. - See RouteAttribute.Path - for details on the correct format. - The same instance; - never . - - - - Maps the specified REST path to the specified request DTO, and - specifies the HTTP verbs supported by the path. - - The type of request DTO to map - the path to. - The path to map the request DTO to. - See RouteAttribute.Path - for details on the correct format. - - The comma-delimited list of HTTP verbs supported by the path, - such as "GET,PUT,DELETE". Specify empty or - to indicate that all verbs are supported. - - The same instance; - never . - - - - Maps the specified REST path to the specified request DTO, - specifies the HTTP verbs supported by the path, and indicates - the default MIME type of the returned response. - - - The type of request DTO to map the path to. - - The path to map the request DTO to. - See RouteAttribute.Path - for details on the correct format. - - The comma-delimited list of HTTP verbs supported by the path, - such as "GET,PUT,DELETE". - - The same instance; - never . - - - - Maps the specified REST path to the specified request DTO, - specifies the HTTP verbs supported by the path, and indicates - the default MIME type of the returned response. - - - Used to rank the precedences of route definitions in reverse routing. - i.e. Priorities below 0 are auto-generated have less precedence. - - - - - Maps the specified REST path to the specified request DTO, - specifies the HTTP verbs supported by the path, and indicates - the default MIME type of the returned response. - - - The type of request DTO to map the path to. - - The path to map the request DTO to. - See RouteAttribute.Path - for details on the correct format. - - The comma-delimited list of HTTP verbs supported by the path, - such as "GET,PUT,DELETE". - - - The short summary of what the REST does. - - - The longer text to explain the behaviour of the REST. - - The same instance; - never . - - - - Maps the specified REST path to the specified request DTO, - specifies the HTTP verbs supported by the path, and indicates - the default MIME type of the returned response. - - - The type of request DTO to map the path to. - - The path to map the request DTO to. - See RouteAttribute.Path - for details on the correct format. - - The comma-delimited list of HTTP verbs supported by the path, - such as "GET,PUT,DELETE". - - - The short summary of what the REST does. - - - The longer text to explain the behaviour of the REST. - - - Must match rule defined in Config.RequestRules or Regex expression with format: - "{IHttpRequest.Field} =~ {pattern}", e.g "PathInfo =~ \/[0-9]+$" - - The same instance; - never . - diff --git a/lib/net45/ServiceStack.Server.dll b/lib/net45/ServiceStack.Server.dll index e1421b7e..8339f0a2 100644 Binary files a/lib/net45/ServiceStack.Server.dll and b/lib/net45/ServiceStack.Server.dll differ diff --git a/lib/net45/ServiceStack.Text.dll b/lib/net45/ServiceStack.Text.dll index 555c715d..ceae72a7 100644 Binary files a/lib/net45/ServiceStack.Text.dll and b/lib/net45/ServiceStack.Text.dll differ diff --git a/lib/net45/ServiceStack.Text.xml b/lib/net45/ServiceStack.Text.xml index cd0e03eb..a3c1aa21 100644 --- a/lib/net45/ServiceStack.Text.xml +++ b/lib/net45/ServiceStack.Text.xml @@ -78,6 +78,12 @@ + + + Gets or sets the default character encoding using in A system.IO.Stream + to write data or read data. The default value is PclExport.Instance.GetUseEncoding(false). + + A fast, standards-based, serialization-issue free DateTime serailizer. @@ -333,6 +339,12 @@ Creates an instance of a Type from a string value + + + Gets or sets the default character encoding using in A system.IO.Stream to write data or read data. + The default value is PclExport.Instance.GetUseEncoding(false). + + Parses the specified value. @@ -1112,16 +1124,6 @@ Allow Type to be deserialized into late-bould object Types using __type info - - - Reusable StringBuilder ThreadStatic Cache - - - - - Alternative Reusable StringBuilder ThreadStatic Cache - - An optimized representation of a substring. @@ -1413,11 +1415,6 @@ Print Dump to Console.WriteLine - - - Print string.Format to Console.WriteLine - - Parses the specified value. @@ -1425,6 +1422,111 @@ The value. + + + Serializes and deserializes objects into and from XML strings. ServiceStack.Text.XmlSerializer enables you to control + how objects are encoded into XML. + + + + + Gets an default System.Xml.XmlWriterSettings instance providing a set of features to support on the System.Xml.XmlWriter object + created by the Overload:System.Xml.XmlWriter.Create method. + + + + + Gets an System.Xml.XmlReaderSettings instance providing a set of features to support on the System.Xml.XmlReader object + created by the Overload:System.Xml.XmlReader.Create method. + + + + + Deserializes the XML string with an System.IO.TextReader into an instance of object. + + The System.IO.TextReader used to read the XML string. + The supplied data contract type of the object that are deserialized. + The settings for the new System.Xml.XmlReader, if the value is null use the default + . + The deserialized object. + + + + Deserializes the XML string with an System.IO.TextReader into an instance of the specified type. + + The supplied data contract type of the instance that are deserialized. + The System.IO.TextReader used to read the XML string. + The settings for the new System.Xml.XmlReader, if the value is null use the default + . + The deserialized instance of the specified type. + + + + Deserializes the XML string into an instance of object. + + The XML string to deserialize. + The supplied data contract type of the object that are deserialized. + The settings for the new System.Xml.XmlReader, if the value is null use the default + . + The deserialized object. + + + + Deserializes the XML string into an instance of the specified type. + + The supplied data contract type of the instance that are deserialized. + The XML string to deserialize. + The settings for the new System.Xml.XmlReader, if the value is null use the default + . + The deserialized instance of the specified type. + + + + Deserializes the XML stream with an System.IO.Stream into an instance of object. + + The System.IO.Stream used to read the XML stream. + The supplied data contract type of the object that are deserialized. + The settings for the new System.Xml.XmlReader, if the value is null use the default + . + The deserialized object. + + + + Deserializes the XML stream with an System.IO.Stream into an instance of the specified type. + + The supplied data contract type of the instance that are deserialized. + The System.IO.Stream used to read the XML stream. + The settings for the new System.Xml.XmlReader, if the value is null use the default + . + The deserialized instance of the specified type. + + + + Serializes the specified System.Object and writes the XML string to a instance of System.IO.TextWriter. + + The supplied data contract object that contains the data to write to the stream. + The System.IO.Writer used to write the XML string. + The settings for the new System.Xml.XmlWriter, if the value is null use the default + . + + + + Serializes the specified System.Object and writes the XML string to a instance of System.IO.Stream. + + The supplied data contract object that contains the data to write to the stream. + The System.IO.Stream used to write the XML string. + The settings for the new System.Xml.XmlWriter, if the value is null use the default + . + + + + Serializes the specified System.Object into the XML string. + + The supplied data contract object that are serialized. + The settings for the new System.Xml.XmlWriter, if the value is null use the default + . + The XML string of the serialized object. + Populate an object with Example data. @@ -1440,6 +1542,188 @@ Tracks how deeply nested we are + + + Provides methods for the HTTP-specific request to a Uniform Resource Identifier (URI). + + + + + Gets the string representation response from the Internet resource to an HTTP-specific request, whose + Accept HTTP header is . + + A URL string that identifies the Internet resource. + The request method to use to contact the Internet resource. The default value is GET. + The optional request body associated with the Http-specific request. + The value of the Content-type HTTP header. The default value is null. + The method to filter the HTTP-specific request. + The method to filter the response to the HTTP-specific request. + The string representation response to the HTTP-specific request. + The URL specified in urlString is not a valid URL. + System.Net.HttpWebRequest.Abort was previously called.-or- The time-out period + for the request expired.-or- An error occurred while processing the request. + + + + Gets the string representation response from the Internet resource to an HTTP-specific request as an asynchronous operation, + whose Accept HTTP header is . + + A URL string that identifies the Internet resource. + The request method to use to contact the Internet resource. The default value is GET. + The optional request body associated with the Http-specific request. + The value of the Content-type HTTP header. The default value is null. + The method to filter the HTTP-specific request. + The method to filter the response to the HTTP-specific request. + Returns System.Threading.Tasks`1. The task object representing the asynchronous operation. + + + + Gets the string representation response from the Internet resource to an HTTP-specific request, whose + Accept HTTP header is . + + A URL string that identifies the Internet resource. + The request method to use to contact the Internet resource. The default value is GET. + The optional request body associated with the Http-specific request. + The value of the Content-type HTTP header. The default value is null. + The method to filter the HTTP-specific request. + The method to filter the response to the HTTP-specific request. + The string representation response to the HTTP-specific request. + The URL specified in urlString is not a valid URL. + System.Net.HttpWebRequest.Abort was previously called.-or- The time-out period + for the request expired.-or- An error occurred while processing the request. + + + + Gets the string representation response from the Internet resource to an HTTP-specific request as an asynchronous operation, + whose Accept HTTP header is . + + A URL string that identifies the Internet resource. + The request method to use to contact the Internet resource. The default value is GET. + The optional request body associated with the Http-specific request. + The value of the Content-type HTTP header. The default value is null. + The method to filter the HTTP-specific request. + The method to filter the response to the HTTP-specific request. + Returns System.Threading.Tasks`1. The task object representing the asynchronous operation. + + + + Gets the string representation response from the Internet resource to an HTTP-specific request, whose + Accept HTTP header is . + + A URL string that identifies the Internet resource. + The request method to use to contact the Internet resource. The default value is GET. + The optional request body associated with the Http-specific request. + The value of the Content-type HTTP header. The default value is null. + The method to filter the HTTP-specific request. + The method to filter the response to the HTTP-specific request. + The string representation response to the HTTP-specific request. + The URL specified in urlString is not a valid URL. + System.Net.HttpWebRequest.Abort was previously called.-or- The time-out period + for the request expired.-or- An error occurred while processing the request. + + + + Gets the string representation response from the Internet resource to an HTTP-specific request as an asynchronous operation, + whose Accept HTTP header is . + + A URL string that identifies the Internet resource. + The request method to use to contact the Internet resource. The default value is GET. + The optional request body associated with the Http-specific request. + The value of the Content-type HTTP header. The default value is null. + The method to filter the HTTP-specific request. + The method to filter the response to the HTTP-specific request. + Returns System.Threading.Tasks`1. The task object representing the asynchronous operation. + + + + Gets the string representation response from the Internet resource to an HTTP-specific request, whose + Accept HTTP header is . + + A URL string that identifies the Internet resource. + The request method to use to contact the Internet resource. The default value is GET. + The optional request body associated with the Http-specific request. + The value of the Content-type HTTP header. The default value is null. + The method to filter the HTTP-specific request. + The method to filter the response to the HTTP-specific request. + The string representation response to the HTTP-specific request. + The URL specified in urlString is not a valid URL. + System.Net.HttpWebRequest.Abort was previously called.-or- The time-out period + for the request expired.-or- An error occurred while processing the request. + + + + Gets the string representation response from the Internet resource to an HTTP-specific request as an asynchronous operation, + whose Accept HTTP header is . + + A URL string that identifies the Internet resource. + The request method to use to contact the Internet resource. The default value is GET. + The optional request body associated with the Http-specific request. + The value of the Content-type HTTP header. The default value is null. + The method to filter the HTTP-specific request. + The method to filter the response to the HTTP-specific request. + Returns System.Threading.Tasks`1. The task object representing the asynchronous operation. + + + + Gets the string representation response from the Internet resource to an HTTP-specific request using the specified request options. + + A URL string that identifies the Internet resource. + The request method to use to contact the Internet resource. The default value is GET. + The optional request body associated with the Http-specific request. + The value of the Content-type HTTP header. The default value is null. + The value of the Accept HTTP header. The default value is "*/*". + The method to filter the HTTP-specific request. + The method to filter the response to the HTTP-specific request. + The string representation response to the HTTP-specific request. + The URL specified in urlString is not a valid URL. + System.Net.HttpWebRequest.Abort was previously called.-or- The time-out period + for the request expired.-or- An error occurred while processing the request. + + + + Gets the string representation response from the Internet resource to an HTTP-specific request as an asynchronous operation using the specified request options. + + A URL string that identifies the Internet resource. + The request method to use to contact the Internet resource. The default value is GET. + The optional request body associated with the Http-specific request. + The value of the Content-type HTTP header. The default value is null. + The value of the Accept HTTP header. The default value is "*/*". + The method to filter the HTTP-specific request. + The method to filter the response to the HTTP-specific request. + Returns System.Threading.Tasks`1. The task object representing the asynchronous operation. + + + + Reads all characters from the current position to the end of the data stream from the Internet response. + + The response from an Uniform Resource Identifier (URI). + The rest of the data stream from the Internet response as a string. If + the current position is at the end of the stream, returns an empty string. + + + + Reads all lines of characters from the current position to the end of the data stream from the Internet response. + + The response from an Uniform Resource Identifier (URI). + An System.Collections.Generic.IEnumerable`1 that contains System.String elements from the Internet response. + + + + Gets a response from the Internet resource to an HTTP-specific request. + + A URL string that identifies the Internet resource. + A containing the response to the Internet request. + The URL specified in urlString is not a valid URL. + System.Net.HttpWebRequest.Abort was previously called.-or- The time-out period + for the request expired.-or- An error occurred while processing the request. + + + + Gets a response from the Internet resource to an HTTP-specific request as an asynchronous operation. + + A URL string that identifies the Internet resource. + Returns System.Threading.Tasks`1. The task object representing the asynchronous operation. + Public Code API to register commercial license for ServiceStack. @@ -1450,6 +1734,11 @@ Internal Utilities to verify licensing + + + Provides extension methods on System.String instances that contain file or directory path information or uri. + + Maps the path of a file in the context of a VS project in a Console App @@ -1484,6 +1773,71 @@ the absolute path Assumes static content is in the parent folder of the /bin/ directory + + + Combines the path elements in a specified System.String array into an base path. + + The base path to combine. + An string array that contains the path elements to combine. + The combined paths string. + + + + Combines the path elements in a specified System.String array. + + An string array that contains the path elements to combine. + The combined paths string. + + + + When overridden in a descendant class, writes a message followed by a line terminator, to the platform-specific output stream. + The default is . + + A message to write. + + + + When overridden in a descendant class, writes a formatted message followed by a line terminator, to the platform-specific output stream. + The default is . + + A composite format string (see Remarks) that contains text intermixed with zero or more format items, + which correspond to objects in the args array. + An object array that contains zero or more objects to format. + + + + When overridden in a descendant class, provides a instance of the class. A parameter + specifies whether to provide a Unicode byte order mark. + + true to specify that the method returns + a Unicode byte order mark; otherwise, false. See the Remarks section for more information. + A System.Text.Encoding instance. + + + + When overridden in a descendant class, Initializes a new System.Net.HttpWebRequest instance for the specified URI scheme. + + A URI string that identifies the Internet resource. + A System.Net.HttpWebRequest instance for the specific URI scheme. + The uriString is null. + The request scheme specified in uriString has not been registered. + The caller does not have permission to connect to the requested URI or a URI + that the request is redirected to. + The request scheme specified in uriString is the http or https scheme. + The URI specified in uriString is not a valid URI. + + + + + Writes a formatted message followed by a line terminator, to the Console output stream. + + A composite format string (see Remarks) that contains text intermixed with zero or more format items, + which correspond to objects in the args array. + An object array that contains zero or more objects to format. + An I/O error occurred. + The format or args is null. + The format specification in format is invalid. + Add a Property attribute at runtime. @@ -1592,6 +1946,11 @@ Same as ReadExactly, but without the argument checks. + + + Provides a set of static methods for object. + + Converts from base: 0 - 62 @@ -1601,6 +1960,46 @@ To. + + + Converts a uri component to its escaped representation using the specified upperCase. + + The uri component to escape. + true to perform an uppercase escaping, other then false. The default value is false. + A System.String that contains the escaped representation of uriComponent. + + + + Replaces the letter of the specified string with the letter 13 letters after it in the alphabet. + + A string to replace. + a Rot13 string. + + + + Appends a copy of the specified uriComponent without character escaping to the base URI. + + The base System.Uri, represented as a System.String. + The uri component to add to the base System.Uri. + A string representation for a System.Uri instance. + + + + Appends the uri component elements without character escaping in a specified System.String array to the base URI. + + The base System.Uri, represented as a System.String. + An string array that contains the uri component elements. + A string representation for a System.Uri instance. + + + + Appends the uri component elements in a specified System.String array to the base URI, with explicit control of character escaping. + + The base System.Uri, represented as a System.String. + An string array that contains the uri component elements. + true if escape the uri components; otherwise, false. + A string representation for a System.Uri instance. + Skip the encoding process for 'safe strings' @@ -1608,5 +2007,48 @@ + + + Replaces the format item in a specified string with the string representation of a corresponding object in a specified array. + + A composite format string. + An object array that contains zero or more objects to format. + A copy of format in which the format items have been replaced by the string representation + of the corresponding objects in args. + format is invalid.-or- The index of a format item is less than zero, or greater + than or equal to the length of the args array. + + + + Indicates whether the specified string is null or an System.String.Empty string. + + The string to be tested. + true if the value parameter is null or an empty string (""); otherwise, false. + + + + Removes all leading occurrences of a set of characters specified in an array from the current System.String object. + + The string to be trimed. + An array of Unicode characters to remove, or null. + The string that remains after all occurrences of characters in the trimChars parameter are removed from the start of the current string. + If trimChars is null or an empty array, white-space characters are removed instead. + + + + Removes the leading occurrences of the first matched string specified in an array from the current System.String object. + + The string to be trimed. + An array of strings to match, or null. + The string that remains after the first matched string is removed from the start of the current string. + + + + Prints a formatted message. + + A composite format string (see Remarks) that contains format intermixed with zero or more format items, + which correspond to objects in the args array. + An object array that contains zero or more objects to format. + diff --git a/lib/net45/ServiceStack.dll b/lib/net45/ServiceStack.dll index cf59a198..4d7cf72c 100644 Binary files a/lib/net45/ServiceStack.dll and b/lib/net45/ServiceStack.dll differ diff --git a/lib/net45/ServiceStack.xml b/lib/net45/ServiceStack.xml index c8c0ad8a..c56dc278 100644 --- a/lib/net45/ServiceStack.xml +++ b/lib/net45/ServiceStack.xml @@ -80,6 +80,12 @@ Should UserName or Emails be saved in AuthRepository in LowerCase + + + Override with Custom Validation logic to Assert if User is allowed to Authenticate. + Returning a non-null response invalidates Authentication with IHttpResult response returned to client. + + The Interface Auth Repositories need to implement to support API Keys @@ -160,26 +166,6 @@ Only allow access to users in specified roles - - - Inject logic into existing services by introspecting the request and injecting your own - validation logic. Exceptions thrown will have the same behaviour as if the service threw it. - - If a non-null object is returned the request will short-circuit and return that response. - - The instance of the service - GET,POST,PUT,DELETE - - Response DTO; non-null will short-circuit execution and return that response - - - - Get AuthProviders Registered in AuthFeature Plugin. - - specific provider, or null for all providers - - - Get specific AuthProvider @@ -566,12 +552,7 @@ - Create new Registration - - - - - Logic to update UserAuth from Registration info, not enabled on PUT because of security. + Create new Registration @@ -1053,26 +1034,38 @@ - More familiar name for the new crowd. + Provides access to the System.Configuration.AppSettingsSection data for the current application's default configuration. - The tier lets you specify a retrieving a setting with the tier prefix first before falling back to the original key. + Initializes a new instance of the ServiceStack.Configuration.AppSettings class. + + The tier used to retrieve a setting. The default value is null. + + + + Provides a collection of keys and values that contains application settings. This is an abstract class. + + + + + Gets or sets the prefix of key, which lets you retrieve a setting with the tier first before falling back to the original key. E.g a tier of 'Live' looks for 'Live.{Key}' or if not found falls back to '{Key}'. - + - Returns string if exists, otherwise null + Initializes a new instance of the ServiceStack.Configuration.AppSettingsBase class using the specified settings reader. - - + The instance of class to read the settings. - + - Would've preferred to use [assembly: ContractNamespace] attribute but it is not supported in Mono + Gets the string value associated with the specified key. + The specified key. + The string value associated with the specified key. If the specified key is not found, return null. @@ -1109,23 +1102,6 @@ Gets the dictionary from app setting. - - - Provides a common interface for Settings providers such as - ConfigurationManager or Azure's RoleEnvironment. The only - requirement is that if the implementation cannot find the - specified key, the return value must be null - - The key for the setting - The string value of the specified key, or null if the key - was invalid - - - - Return all keys in this configuration source. - - - Represents a builder for the class. @@ -4599,57 +4575,26 @@ and precision of 2 and 5 respectively. - + - When the AppHost was instantiated. + The AppHost.Container. Note: it is not thread safe to register dependencies after AppStart. - + - When the Init function was done. - Called at begin of + Initializes the AppHost. + Calls the method. + Should be called before start. - + - When all configuration was completed. - Called at the end of + Collection of added plugins. - If app currently runs for unit tests. - Used for overwritting AuthSession. - - - - - The assemblies reflected to find api services. - These can be provided in the constructor call. - - - - - Wether AppHost configuration is done. - Note: It doesn't mean the start function was called. - - - - - Wether AppHost is ready configured and either ready to run or already running. - Equals - - - - - Set the host config of the AppHost. - - - - - Initializes the AppHost. - Calls the method. - Should be called before start. + If app currently runs for unit tests. Used for overwritting AuthSession. @@ -4664,11 +4609,6 @@ Url to listen to - - - The AppHost.Container. Note: it is not thread safe to register dependencies after AppStart. - - Collection of PreRequest filters. @@ -4701,11 +4641,6 @@ If view is needed list is looped until view is found. - - - Collection of added plugins. - - Executed immediately before a Service is executed. Use return to change the request DTO used, must be of the same type. @@ -4761,11 +4696,6 @@ Apply PreRequest Filters for participating Custom Handlers, e.g. RazorFormat, MarkdownFormat, etc - - - Apply PreAuthenticate Filters from IAuthWithRequest AuthProviders - - Applies the raw request filters. Returns whether or not the request has been handled @@ -4810,11 +4740,6 @@ Provided by services and pageView, can be helpfull when overriding this method - - - If they don't have an ICacheClient configured use an In Memory one. - - Tries to resolve through Ioc container. @@ -4945,7 +4870,7 @@ Starts the Web Service - + A Uri that acts as the base that the server is listening on. Format should be: http://127.0.0.1:8080/ or http://127.0.0.1:8080/somevirtual/ Note: the trailing slash is required! For more info see the @@ -4959,7 +4884,7 @@ - Overridable method that can be used to implement a custom hnandler + When overrided in the sub class, which can be used to implement a custom hnandler @@ -5041,7 +4966,7 @@ - Execute a Service with a Request DTO. See ExecuteAsync for a non-blocking alternative. + External HTTP Request called from HTTP handlers @@ -5283,7 +5208,7 @@ string value or null if it doesn't exist - + * Input: http://localhost:96/Cambia3/Temp/Test.aspx/path/info?q=item#fragment @@ -5442,6 +5367,21 @@ The assemblies reflected to find api services provided in the AppHost constructor + + + The AppHost config + + + + + The AppHost AppSettings. Defaults to App or Web.config appSettings. + + + + + Access Service Controller for ServiceStack + + Register dependency in AppHost IOC on Startup @@ -5582,6 +5522,11 @@ Add alternative HTML View Engines + + + Register additional Virtual File Sources + + Provide an exception handler for unhandled exceptions @@ -5637,16 +5582,6 @@ Provide a custom model minder for a specific Request DTO - - - The AppHost config - - - - - The AppHost AppSettings. Defaults to App or Web.config appSettings. - - Allow specific configuration to be overridden at runtime in multi-tenancy Applications @@ -5688,11 +5623,6 @@ Read/Write Virtual FileSystem. Defaults to FileSystemVirtualPathProvider - - - Register additional Virtual File Sources - - Create a service runner for IService actions @@ -5714,11 +5644,6 @@ Execute MQ Message in ServiceStack - - - Access Service Controller for ServiceStack - - A convenient repository base class you can inherit from to reduce the boilerplate @@ -5758,6 +5683,23 @@ + + + Inject logic into existing services by introspecting the request and injecting your own + validation logic. Exceptions thrown will have the same behaviour as if the service threw it. + + If a non-null object is returned the request will short-circuit and return that response. + + The instance of the service + GET,POST,PUT,DELETE + + Response DTO; non-null will short-circuit execution and return that response + + + + Allow the registration of user-defined routes for services + + Encapsulates creating a new message handler @@ -5792,12 +5734,12 @@ If there is no Parse Method it will attempt to create a new instance of the destined type - + Determines wheter the Config section identified by the sectionName exists. - + Gets the connection string setting. @@ -6096,12 +6038,10 @@ can only execute, if the user has specific roles. - + Check all session is in all supplied roles otherwise a 401 HttpError is thrown - - @@ -6245,13 +6185,13 @@ Configure ServiceStack to have ISession support - + Create the active Session or Permanent Session Id cookie. - + Create both Permanent and Session Id cookies and return the active sessionId @@ -6341,9 +6281,8 @@ - Main container class for components, supporting container hierarchies and - lifetime management of instances. - + Main container class for components, supporting container hierarchies and lifetime management of instances. + @@ -6407,389 +6346,660 @@ - Initializes a new empty container. - + Initializes a new empty container. + - Default owner for new registrations. by default. - + Default owner for new registrations. by default. + - Default reuse scope for new registrations. by default. - + Default reuse scope for new registrations. by default. + - Creates a child container of the current one, which exposes its - current service registration to the new child container. - - - - - Disposes the container and all instances owned by it (see - ), as well as all child containers - created through . - + Creates a child container of the current one, which exposes its current service registration to the new child container. + - Registers a service instance with the container. This instance - will have and - behavior. - Service instance to use. + Registers a service instance with the container. This instance will have and + behavior. + + Service instance to use. - Registers a named service instance with the container. This instance - will have and - behavior. - Name of the service to register.Service instance to use. - - - - Retrieves a function that can be used to lazily resolve an instance - of the service when needed. - Type of the service to retrieve.The function that can resolve to the service instance when invoked.The requested service has not been registered previously. - - - - - - - - - - - - - - - - - - - - - - Retrieves a function that can be used to lazily resolve an instance - of the service with the given name when needed. - Type of the service to retrieve.Name of the service to retrieve.The function that can resolve to the service instance with the given name when invoked.The requested service with the given name has not been registered previously. - - - - Retrieves a function that can be used to lazily resolve an instance - of the service of the given type, name and service constructor arguments when needed. - Name of the service to retrieve.The function that can resolve to the service instance with the given and service constructor arguments name when invoked.The requested service with the given name and constructor arguments has not been registered previously. - - - - Retrieves a function that can be used to lazily resolve an instance - of the service of the given type, name and service constructor arguments when needed. - Name of the service to retrieve.The function that can resolve to the service instance with the given and service constructor arguments name when invoked.The requested service with the given name and constructor arguments has not been registered previously. - - - - Retrieves a function that can be used to lazily resolve an instance - of the service of the given type, name and service constructor arguments when needed. - Name of the service to retrieve.The function that can resolve to the service instance with the given and service constructor arguments name when invoked.The requested service with the given name and constructor arguments has not been registered previously. - - - - Retrieves a function that can be used to lazily resolve an instance - of the service of the given type, name and service constructor arguments when needed. - Name of the service to retrieve.The function that can resolve to the service instance with the given and service constructor arguments name when invoked.The requested service with the given name and constructor arguments has not been registered previously. - - - - Retrieves a function that can be used to lazily resolve an instance - of the service of the given type, name and service constructor arguments when needed. - Name of the service to retrieve.The function that can resolve to the service instance with the given and service constructor arguments name when invoked.The requested service with the given name and constructor arguments has not been registered previously. + Registers a named service instance with the container. This instance + will have and behavior. + + Name of the service to register. + Service instance to use. - + - Retrieves a function that can be used to lazily resolve an instance - of the service of the given type, name and service constructor arguments when needed. - Name of the service to retrieve.The function that can resolve to the service instance with the given and service constructor arguments name when invoked.The requested service with the given name and constructor arguments has not been registered previously. + Disposes the container and all instances owned by it (), as well as all child containers + created through . + - Registers the given service by providing a factory delegate to - instantiate it. - The service type to register.The factory delegate to initialize new instances of the service when needed.The registration object to perform further configuration via its fluent interface. + Registers the given service by providing a factory delegate to instantiate it. + + The service type to register. + The factory delegate to initialize new instances of the service when needed. + The registration object to perform further configuration via its fluent interface. - Registers the given service by providing a factory delegate that receives arguments to - instantiate it. - The service type to register.First argument that should be passed to the factory delegate to create the instace.The factory delegate to initialize new instances of the service when needed.The registration object to perform further configuration via its fluent interface. + Registers the given service by providing a factory delegate that receives arguments to instantiate it. + + The service type to register. + First argument that should be passed to the factory delegate to create the instace. + The factory delegate to initialize new instances of the service when needed. + The registration object to perform further configuration via its fluent interface. - Registers the given service by providing a factory delegate that receives arguments to - instantiate it. - The service type to register.First argument that should be passed to the factory delegate to create the instace.Second argument that should be passed to the factory delegate to create the instace.The factory delegate to initialize new instances of the service when needed.The registration object to perform further configuration via its fluent interface. + Registers the given service by providing a factory delegate that receives arguments to instantiate it. + + The service type to register. + First argument that should be passed to the factory delegate to create the instace. + Second argument that should be passed to the factory delegate to create the instace. + The factory delegate to initialize new instances of the service when needed. + The registration object to perform further configuration via its fluent interface. - Registers the given service by providing a factory delegate that receives arguments to - instantiate it. - The service type to register.First argument that should be passed to the factory delegate to create the instace.Second argument that should be passed to the factory delegate to create the instace.Third argument that should be passed to the factory delegate to create the instace.The factory delegate to initialize new instances of the service when needed.The registration object to perform further configuration via its fluent interface. + Registers the given service by providing a factory delegate that receives arguments to instantiate it. + + The service type to register. + First argument that should be passed to the factory delegate to create the instace. + Second argument that should be passed to the factory delegate to create the instace. + Third argument that should be passed to the factory delegate to create the instace. + The factory delegate to initialize new instances of the service when needed. + The registration object to perform further configuration via its fluent interface. - Registers the given service by providing a factory delegate that receives arguments to - instantiate it. - The service type to register.First argument that should be passed to the factory delegate to create the instace.Second argument that should be passed to the factory delegate to create the instace.Third argument that should be passed to the factory delegate to create the instace.Fourth argument that should be passed to the factory delegate to create the instace.The factory delegate to initialize new instances of the service when needed.The registration object to perform further configuration via its fluent interface. + Registers the given service by providing a factory delegate that receives arguments to instantiate it. + + The service type to register. + First argument that should be passed to the factory delegate to create the instace. + Second argument that should be passed to the factory delegate to create the instace. + Third argument that should be passed to the factory delegate to create the instace. + Fourth argument that should be passed to the factory delegate to create the instace. + The factory delegate to initialize new instances of the service when needed. + The registration object to perform further configuration via its fluent interface. - Registers the given service by providing a factory delegate that receives arguments to - instantiate it. - The service type to register.First argument that should be passed to the factory delegate to create the instace.Second argument that should be passed to the factory delegate to create the instace.Third argument that should be passed to the factory delegate to create the instace.Fourth argument that should be passed to the factory delegate to create the instace.Fifth argument that should be passed to the factory delegate to create the instace.The factory delegate to initialize new instances of the service when needed.The registration object to perform further configuration via its fluent interface. + Registers the given service by providing a factory delegate that receives arguments to instantiate it. + + The service type to register. + First argument that should be passed to the factory delegate to create the instace. + Second argument that should be passed to the factory delegate to create the instace. + Third argument that should be passed to the factory delegate to create the instace. + Fourth argument that should be passed to the factory delegate to create the instace. + Fifth argument that should be passed to the factory delegate to create the instace. + The factory delegate to initialize new instances of the service when needed. + The registration object to perform further configuration via its fluent interface. - Registers the given service by providing a factory delegate that receives arguments to - instantiate it. - The service type to register.First argument that should be passed to the factory delegate to create the instace.Second argument that should be passed to the factory delegate to create the instace.Third argument that should be passed to the factory delegate to create the instace.Fourth argument that should be passed to the factory delegate to create the instace.Fifth argument that should be passed to the factory delegate to create the instace.Sixth argument that should be passed to the factory delegate to create the instace.The factory delegate to initialize new instances of the service when needed.The registration object to perform further configuration via its fluent interface. + Registers the given service by providing a factory delegate that receives arguments to instantiate it. + + The service type to register. + First argument that should be passed to the factory delegate to create the instace. + Second argument that should be passed to the factory delegate to create the instace. + Third argument that should be passed to the factory delegate to create the instace. + Fourth argument that should be passed to the factory delegate to create the instace. + Fifth argument that should be passed to the factory delegate to create the instace. + Sixth argument that should be passed to the factory delegate to create the instace. + The factory delegate to initialize new instances of the service when needed. + The registration object to perform further configuration via its fluent interface. - Registers the given named service by providing a factory delegate to - instantiate it. - The service type to register.A name used to differenciate this service registration.The factory delegate to initialize new instances of the service when needed.The registration object to perform further configuration via its fluent interface. + Registers the given named service by providing a factory delegate to instantiate it. + + The service type to register. + A name used to differenciate this service registration. + The factory delegate to initialize new instances of the service when needed. + The registration object to perform further configuration via its fluent interface. - Registers the given named service by providing a factory delegate that receives arguments to - instantiate it. - The service type to register.First argument that should be passed to the factory delegate to create the instace.A name used to differenciate this service registration.The factory delegate to initialize new instances of the service when needed.The registration object to perform further configuration via its fluent interface. + Registers the given named service by providing a factory delegate that receives arguments to instantiate it. + + The service type to register. + First argument that should be passed to the factory delegate to create the instace. + A name used to differenciate this service registration. + The factory delegate to initialize new instances of the service when needed. + The registration object to perform further configuration via its fluent interface. - Registers the given named service by providing a factory delegate that receives arguments to - instantiate it. - The service type to register.First argument that should be passed to the factory delegate to create the instace.Second argument that should be passed to the factory delegate to create the instace.A name used to differenciate this service registration.The factory delegate to initialize new instances of the service when needed.The registration object to perform further configuration via its fluent interface. + Registers the given named service by providing a factory delegate that receives arguments to instantiate it. + + The service type to register. + First argument that should be passed to the factory delegate to create the instace. + Second argument that should be passed to the factory delegate to create the instace. + A name used to differenciate this service registration. + The factory delegate to initialize new instances of the service when needed. + The registration object to perform further configuration via its fluent interface. - Registers the given named service by providing a factory delegate that receives arguments to - instantiate it. - The service type to register.First argument that should be passed to the factory delegate to create the instace.Second argument that should be passed to the factory delegate to create the instace.Third argument that should be passed to the factory delegate to create the instace.A name used to differenciate this service registration.The factory delegate to initialize new instances of the service when needed.The registration object to perform further configuration via its fluent interface. + Registers the given named service by providing a factory delegate that receives arguments to instantiate it. + + The service type to register. + First argument that should be passed to the factory delegate to create the instace. + Second argument that should be passed to the factory delegate to create the instace. + Third argument that should be passed to the factory delegate to create the instace. + A name used to differenciate this service registration. + The factory delegate to initialize new instances of the service when needed. + The registration object to perform further configuration via its fluent interface. - Registers the given named service by providing a factory delegate that receives arguments to - instantiate it. - The service type to register.First argument that should be passed to the factory delegate to create the instace.Second argument that should be passed to the factory delegate to create the instace.Third argument that should be passed to the factory delegate to create the instace.Fourth argument that should be passed to the factory delegate to create the instace.A name used to differenciate this service registration.The factory delegate to initialize new instances of the service when needed.The registration object to perform further configuration via its fluent interface. + Registers the given named service by providing a factory delegate that receives arguments to instantiate it. + + The service type to register. + First argument that should be passed to the factory delegate to create the instace. + Second argument that should be passed to the factory delegate to create the instace. + Third argument that should be passed to the factory delegate to create the instace. + Fouth argument that should be passed to the factory delegate to create the instace. + A name used to differenciate this service registration. + The factory delegate to initialize new instances of the service when needed. + The registration object to perform further configuration via its fluent interface. - Registers the given named service by providing a factory delegate that receives arguments to - instantiate it. - The service type to register.First argument that should be passed to the factory delegate to create the instace.Second argument that should be passed to the factory delegate to create the instace.Third argument that should be passed to the factory delegate to create the instace.Fourth argument that should be passed to the factory delegate to create the instace.Fifth argument that should be passed to the factory delegate to create the instace.A name used to differenciate this service registration.The factory delegate to initialize new instances of the service when needed.The registration object to perform further configuration via its fluent interface. + Registers the given named service by providing a factory delegate that receives arguments to instantiate it. + + The service type to register. + First argument that should be passed to the factory delegate to create the instace. + Second argument that should be passed to the factory delegate to create the instace. + Third argument that should be passed to the factory delegate to create the instace. + Fouth argument that should be passed to the factory delegate to create the instace. + Fifth argument that should be passed to the factory delegate to create the instace. + A name used to differenciate this service registration. + The factory delegate to initialize new instances of the service when needed. + The registration object to perform further configuration via its fluent interface. - Registers the given named service by providing a factory delegate that receives arguments to - instantiate it. - The service type to register.First argument that should be passed to the factory delegate to create the instace.Second argument that should be passed to the factory delegate to create the instace.Third argument that should be passed to the factory delegate to create the instace.Fourth argument that should be passed to the factory delegate to create the instace.Fifth argument that should be passed to the factory delegate to create the instace.Sixth argument that should be passed to the factory delegate to create the instace.A name used to differenciate this service registration.The factory delegate to initialize new instances of the service when needed.The registration object to perform further configuration via its fluent interface. + Registers the given named service by providing a factory delegate that receives arguments to instantiate it. + + The service type to register. + First argument that should be passed to the factory delegate to create the instace. + Second argument that should be passed to the factory delegate to create the instace. + Third argument that should be passed to the factory delegate to create the instace. + Fouth argument that should be passed to the factory delegate to create the instace. + Fifth argument that should be passed to the factory delegate to create the instace. + Sixth argument that should be passed to the factory delegate to create the instace. + A name used to differenciate this service registration. + The factory delegate to initialize new instances of the service when needed. + The registration object to perform further configuration via its fluent interface. - Resolves the given service by type, without passing any arguments for - its construction. - Type of the service to retrieve.The resolved service instance.The given service could not be resolved. + Resolves the given service by type, without passing any arguments for its construction. + + Type of the service to retrieve. + The resolved service instance. + The given service could not be resolved. - Resolves the given service by type, passing the given arguments - for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.The resolved service instance.The given service could not be resolved. + Resolves the given service by type, passing the given arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + The resolved service instance. + The given service could not be resolved. - Resolves the given service by type, passing the given arguments - for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.The resolved service instance.The given service could not be resolved. + Resolves the given service by type, passing the given arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + The resolved service instance. + The given service could not be resolved. - Resolves the given service by type, passing the given arguments - for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.Third argument to pass to the factory delegate that may create the instace.The resolved service instance.The given service could not be resolved. + Resolves the given service by type, passing the given arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + Third argument to pass to the factory delegate that may create the instace. + The resolved service instance. + The given service could not be resolved. - Resolves the given service by type, passing the given arguments - for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.Third argument to pass to the factory delegate that may create the instace.Fourth argument to pass to the factory delegate that may create the instace.The resolved service instance.The given service could not be resolved. + Resolves the given service by type, passing the given arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + Third argument to pass to the factory delegate that may create the instace. + Fourth argument to pass to the factory delegate that may create the instace. + The resolved service instance. + The given service could not be resolved. - Resolves the given service by type, passing the given arguments - for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.Third argument to pass to the factory delegate that may create the instace.Fourth argument to pass to the factory delegate that may create the instace.Fifth argument to pass to the factory delegate that may create the instace.The resolved service instance.The given service could not be resolved. + Resolves the given service by type, passing the given arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + Third argument to pass to the factory delegate that may create the instace. + Fourth argument to pass to the factory delegate that may create the instace. + Fifth argument to pass to the factory delegate that may create the instace. + The resolved service instance. + The given service could not be resolved. - Resolves the given service by type, passing the given arguments - for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.Third argument to pass to the factory delegate that may create the instace.Fourth argument to pass to the factory delegate that may create the instace.Fifth argument to pass to the factory delegate that may create the instace.Sixth argument to pass to the factory delegate that may create the instace.The resolved service instance.The given service could not be resolved. + Resolves the given service by type, passing the given arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + Third argument to pass to the factory delegate that may create the instace. + Fourth argument to pass to the factory delegate that may create the instace. + Fifth argument to pass to the factory delegate that may create the instace. + Sixth argument to pass to the factory delegate that may create the instace. + The resolved service instance. + The given service could not be resolved. - Resolves the given service by type and name, without passing arguments for its initialization. - Type of the service to retrieve.The resolved service instance.The given service could not be resolved. + Resolves the given service by type and name, without passing arguments for its initialization. + + Type of the service to retrieve. + The resolved service instance. + The given service could not be resolved. - Resolves the given service by type and name, passing the given arguments - for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.The resolved service instance.The given service could not be resolved. + Resolves the given service by type and name, passing the given arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + The resolved service instance. + The given service could not be resolved. - Resolves the given service by type and name, passing the given arguments - for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.The resolved service instance.The given service could not be resolved. + Resolves the given service by type and name, passing the given arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + The resolved service instance. + The given service could not be resolved. - Resolves the given service by type and name, passing the given arguments - for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.Third argument to pass to the factory delegate that may create the instace.The resolved service instance.The given service could not be resolved. + Resolves the given service by type and name, passing the given arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + Third argument to pass to the factory delegate that may create the instace. + The resolved service instance. + The given service could not be resolved. - Resolves the given service by type and name, passing the given arguments - for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.Third argument to pass to the factory delegate that may create the instace.Fourth argument to pass to the factory delegate that may create the instace.The resolved service instance.The given service could not be resolved. + Resolves the given service by type and name, passing the given arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + Third argument to pass to the factory delegate that may create the instace. + Fourth argument to pass to the factory delegate that may create the instace. + The resolved service instance. + The given service could not be resolved. - Resolves the given service by type and name, passing the given arguments - for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.Third argument to pass to the factory delegate that may create the instace.Fourth argument to pass to the factory delegate that may create the instace.Fifth argument to pass to the factory delegate that may create the instace.The resolved service instance.The given service could not be resolved. + Resolves the given service by type and name, passing the given arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + Third argument to pass to the factory delegate that may create the instace. + Fourth argument to pass to the factory delegate that may create the instace. + Fifth argument to pass to the factory delegate that may create the instace. + The resolved service instance. + The given service could not be resolved. - Resolves the given service by type and name, passing the given arguments - for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.Third argument to pass to the factory delegate that may create the instace.Fourth argument to pass to the factory delegate that may create the instace.Fifth argument to pass to the factory delegate that may create the instace.Sixth argument to pass to the factory delegate that may create the instace.The resolved service instance.The given service could not be resolved. + Resolves the given service by type and name, passing the given arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + Third argument to pass to the factory delegate that may create the instace. + Fourth argument to pass to the factory delegate that may create the instace. + Fifth argument to pass to the factory delegate that may create the instace. + Sixth argument to pass to the factory delegate that may create the instace. + The resolved service instance. + The given service could not be resolved. - Attempts to resolve the given service by type, without passing arguments for its initialization. - Type of the service to retrieve. - The resolved service instance or if it cannot be resolved. - + Attempts to resolve the given service by type, without passing arguments for its initialization. + + Type of the service to retrieve. + The resolved service instance or null if it cannot be resolved. - Attempts to resolve the given service by type, passing the - given arguments arguments for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace. - The resolved service instance or if it cannot be resolved. - + Attempts to resolve the given service by type, passing the given arguments arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + The resolved service instance or if it cannot be resolved. - Attempts to resolve the given service by type, passing the - given arguments arguments for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace. - The resolved service instance or if it cannot be resolved. - + Attempts to resolve the given service by type, passing the given arguments arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + The resolved service instance or null if it cannot be resolved. - Attempts to resolve the given service by type, passing the - given arguments arguments for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.Third argument to pass to the factory delegate that may create the instace. - The resolved service instance or if it cannot be resolved. - + Attempts to resolve the given service by type, passing the given arguments arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + Third argument to pass to the factory delegate that may create the instace. + The resolved service instance or null if it cannot be resolved. - Attempts to resolve the given service by type, passing the - given arguments arguments for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.Third argument to pass to the factory delegate that may create the instace.Fourth argument to pass to the factory delegate that may create the instace. - The resolved service instance or if it cannot be resolved. - + Attempts to resolve the given service by type, passing the given arguments arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + Third argument to pass to the factory delegate that may create the instace. + Fourth argument to pass to the factory delegate that may create the instace. + The resolved service instance or null if it cannot be resolved. - Attempts to resolve the given service by type, passing the - given arguments arguments for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.Third argument to pass to the factory delegate that may create the instace.Fourth argument to pass to the factory delegate that may create the instace.Fifth argument to pass to the factory delegate that may create the instace. - The resolved service instance or if it cannot be resolved. - + Attempts to resolve the given service by type, passing the given arguments arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + Third argument to pass to the factory delegate that may create the instace. + Fourth argument to pass to the factory delegate that may create the instace. + Fifth argument to pass to the factory delegate that may create the instace. + The resolved service instance or null if it cannot be resolved. - Attempts to resolve the given service by type, passing the - given arguments arguments for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.Third argument to pass to the factory delegate that may create the instace.Fourth argument to pass to the factory delegate that may create the instace.Fifth argument to pass to the factory delegate that may create the instace.Sixth argument to pass to the factory delegate that may create the instace. - The resolved service instance or if it cannot be resolved. - + Attempts to resolve the given service by type, passing the given arguments arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + Third argument to pass to the factory delegate that may create the instace. + Fourth argument to pass to the factory delegate that may create the instace. + Fifth argument to pass to the factory delegate that may create the instace. + Sixth argument to pass to the factory delegate that may create the instace. + The resolved service instance or null if it cannot be resolved. - Attempts to resolve the given service by type and name, without passing - arguments arguments for its initialization. - Type of the service to retrieve. - The resolved service instance or if it cannot be resolved. - + Attempts to resolve the given service by type and name, without passing arguments arguments for its initialization. + + Type of the service to retrieve. + The resolved service instance or null if it cannot be resolved. - Attempts to resolve the given service by type and name, passing the - given arguments arguments for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace. - The resolved service instance or if it cannot be resolved. - + Attempts to resolve the given service by type and name, passing the given arguments arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + The resolved service instance or null if it cannot be resolved. - Attempts to resolve the given service by type and name, passing the - given arguments arguments for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace. - The resolved service instance or if it cannot be resolved. - + Attempts to resolve the given service by type and name, passing the given arguments arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + The resolved service instance or null if it cannot be resolved. - Attempts to resolve the given service by type and name, passing the - given arguments arguments for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.Third argument to pass to the factory delegate that may create the instace. - The resolved service instance or if it cannot be resolved. - + Attempts to resolve the given service by type and name, passing the given arguments arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + Third argument to pass to the factory delegate that may create the instace. + The resolved service instance or null if it cannot be resolved. - Attempts to resolve the given service by type and name, passing the - given arguments arguments for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.Third argument to pass to the factory delegate that may create the instace.Fourth argument to pass to the factory delegate that may create the instace. - The resolved service instance or if it cannot be resolved. - + Attempts to resolve the given service by type and name, passing the given arguments arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + Third argument to pass to the factory delegate that may create the instace. + Fourth argument to pass to the factory delegate that may create the instace. + The resolved service instance or null if it cannot be resolved. - Attempts to resolve the given service by type and name, passing the - given arguments arguments for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.Third argument to pass to the factory delegate that may create the instace.Fourth argument to pass to the factory delegate that may create the instace.Fifth argument to pass to the factory delegate that may create the instace. - The resolved service instance or if it cannot be resolved. - + Attempts to resolve the given service by type and name, passing the given arguments arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + Third argument to pass to the factory delegate that may create the instace. + Fourth argument to pass to the factory delegate that may create the instace. + Fifth argument to pass to the factory delegate that may create the instace. + The resolved service instance or null if it cannot be resolved. - Attempts to resolve the given service by type and name, passing the - given arguments arguments for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.Third argument to pass to the factory delegate that may create the instace.Fourth argument to pass to the factory delegate that may create the instace.Fifth argument to pass to the factory delegate that may create the instace.Sixth argument to pass to the factory delegate that may create the instace. - The resolved service instance or if it cannot be resolved. - + Attempts to resolve the given service by type and name, passing the given arguments arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + Third argument to pass to the factory delegate that may create the instace. + Fourth argument to pass to the factory delegate that may create the instace. + Fifth argument to pass to the factory delegate that may create the instace. + Sixth argument to pass to the factory delegate that may create the instace. + The resolved service instance or null if it cannot be resolved. + + + + Retrieves a function that can be used to lazily resolve an instance of the service of the given type when needed. + + Type of the service to retrieve. + The function that can resolve to the service instance when invoked. + The requested service has not been registered previously. + + + + Retrieves a function that can be used to lazily resolve an instance of the service of the given type and service constructor arguments when needed. + + Type of the service to retrieve. + Type of the one argument to pass to the factory delegate to create the instace. + The function that can resolve to the service instance with the given constructor arguments when invoked. + The requested service with the given constructor arguments has not been registered previously. + + + + Retrieves a function that can be used to lazily resolve an instance of the service of the given type and service constructor arguments when needed. + + Type of the service to retrieve. + Type of the one argument to pass to the factory delegate to create the instace. + Type of the two argument to pass to the factory delegate to create the instace. + The function that can resolve to the service instance with the given constructor arguments when invoked. + The requested service with the given constructor arguments has not been registered previously. + + + + Retrieves a function that can be used to lazily resolve an instance of the service of the given type and service constructor arguments when needed. + + Type of the service to retrieve. + Type of the one argument to pass to the factory delegate to create the instace. + Type of the two argument to pass to the factory delegate to create the instace. + Type of the three argument to pass to the factory delegate to create the instace. + The function that can resolve to the service instance with the given constructor arguments when invoked. + The requested service with the given constructor arguments has not been registered previously. + + + + Retrieves a function that can be used to lazily resolve an instance of the service of the given type and service constructor arguments when needed. + + Type of the service to retrieve. + Type of the one argument to pass to the factory delegate to create the instace. + Type of the two argument to pass to the factory delegate to create the instace. + Type of the three argument to pass to the factory delegate to create the instace. + Type of the four argument to pass to the factory delegate to create the instace. + The function that can resolve to the service instance with the given constructor arguments when invoked. + The requested service with the given constructor arguments has not been registered previously. + + + + Retrieves a function that can be used to lazily resolve an instance of the service of the given type and service constructor arguments when needed. + + Type of the service to retrieve. + Type of the one argument to pass to the factory delegate to create the instace. + Type of the two argument to pass to the factory delegate to create the instace. + Type of the three argument to pass to the factory delegate to create the instace. + Type of the four argument to pass to the factory delegate to create the instace. + Type of the five argument to pass to the factory delegate to create the instace. + The function that can resolve to the service instance with the given constructor arguments when invoked. + The requested service with the given constructor arguments has not been registered previously. + + + + Retrieves a function that can be used to lazily resolve an instance of the service of the given type and service constructor arguments when needed. + + Type of the service to retrieve. + Type of the one argument to pass to the factory delegate to create the instace. + Type of the two argument to pass to the factory delegate to create the instace. + Type of the three argument to pass to the factory delegate to create the instace. + Type of the four argument to pass to the factory delegate to create the instace. + Type of the five argument to pass to the factory delegate to create the instace. + Type of the six argument to pass to the factory delegate to create the instace. + The function that can resolve to the service instance with the given constructor arguments when invoked. + The requested service with the given constructor arguments has not been registered previously. + + + + Retrieves a function that can be used to lazily resolve an instance of the service with the given name when needed. + + Type of the service to retrieve. + Name of the service to retrieve. + The function that can resolve to the service instance with the given name when invoked. + The requested service with the given name has not been registered previously. + + + + Retrieves a function that can be used to lazily resolve an instance of the service of the given type, name and service constructor arguments when needed. + + Type of the service to retrieve. + Type of the one argument to pass to the factory delegate to create the instace. + Name of the service to retrieve. + The function that can resolve to the service instance with the given and service constructor arguments name when invoked. + The requested service with the given name and constructor arguments has not been registered previously. + + + + Retrieves a function that can be used to lazily resolve an instance of the service of the given type, name and service constructor arguments when needed. + + Type of the service to retrieve. + Type of the one argument to pass to the factory delegate to create the instace. + Type of the two argument to pass to the factory delegate to create the instace. + Name of the service to retrieve. + The function that can resolve to the service instance with the given and service constructor arguments name when invoked. + The requested service with the given name and constructor arguments has not been registered previously. + + + + Retrieves a function that can be used to lazily resolve an instance of the service of the given type, name and service constructor arguments when needed. + + Type of the service to retrieve. + Type of the one argument to pass to the factory delegate to create the instace. + Type of the two argument to pass to the factory delegate to create the instace. + Type of the three argument to pass to the factory delegate to create the instace. + Name of the service to retrieve. + The function that can resolve to the service instance with the given and service constructor arguments name when invoked. + The requested service with the given name and constructor arguments has not been registered previously. + + + + Retrieves a function that can be used to lazily resolve an instance of the service of the given type, name and service constructor arguments when needed. + + Type of the service to retrieve. + Type of the one argument to pass to the factory delegate to create the instace. + Type of the two argument to pass to the factory delegate to create the instace. + Type of the three argument to pass to the factory delegate to create the instace. + Type of the four argument to pass to the factory delegate to create the instace. + Name of the service to retrieve. + The function that can resolve to the service instance with the given and service constructor arguments name when invoked. + The requested service with the given name and constructor arguments has not been registered previously. + + + + Retrieves a function that can be used to lazily resolve an instance of the service of the given type, name and service constructor arguments when needed. + + Type of the service to retrieve. + Type of the one argument to pass to the factory delegate to create the instace. + Type of the two argument to pass to the factory delegate to create the instace. + Type of the three argument to pass to the factory delegate to create the instace. + Type of the four argument to pass to the factory delegate to create the instace. + Type of the five argument to pass to the factory delegate to create the instace. + Name of the service to retrieve. + The function that can resolve to the service instance with the given and service constructor arguments name when invoked. + The requested service with the given name and constructor arguments has not been registered previously. + + + + Retrieves a function that can be used to lazily resolve an instance of the service of the given type, name and service constructor arguments when needed. + + Type of the service to retrieve. + Type of the one argument to pass to the factory delegate to create the instace. + Type of the two argument to pass to the factory delegate to create the instace. + Type of the three argument to pass to the factory delegate to create the instace. + Type of the four argument to pass to the factory delegate to create the instace. + Type of the five argument to pass to the factory delegate to create the instace. + Type of the six argument to pass to the factory delegate to create the instace. + Name of the service to retrieve. + The function that can resolve to the service instance with the given and service constructor arguments name when invoked. + The requested service with the given name and constructor arguments has not been registered previously. @@ -6816,18 +7026,6 @@ Visual Studio intellisense experience. - - - - - - - - - - - - Funqlets are a set of components provided as a package @@ -6836,27 +7034,23 @@ - Configure the given container with the - registrations provided by the funqlet. + Configure the given container with the registrations provided by the funqlet. Container to register. - Interface used by plugins to contribute registrations - to an existing container. + Interface used by plugins to contribute registrations to an existing container. - Determines who is responsible for disposing instances - registered with a container. + Determines who is responsible for disposing instances registered with a container. - Container should dispose provided instances when it is disposed. This is the - default. + Container should dispose provided instances when it is disposed. This is the default. @@ -6896,27 +7090,24 @@ - Instances are reused within a container hierarchy. Instances - are created (if necessary) in the container where the registration + Instances are reused within a container hierarchy. Instances are created (if necessary) in the container where the registration was performed, and are reused by all descendent containers. - Instances are reused only at the given container. Descendent - containers do not reuse parent container instances and get + Instances are reused only at the given container. Descendent containers do not reuse parent container instances and get a new instance at their level. - Each request to resolve the dependency will result in a new - instance being returned. + Each request to resolve the dependency will result in a new instance being returned. - Instaces are reused within the given request + Instaces are reused within the given request. @@ -6951,15 +7142,14 @@ visibility of instances across containers and hierarchies. - + The Func delegate that creates instances of the service. - The cached service instance if the scope is or - . + The cached service instance if the scope is or . diff --git a/lib/netstandard2.0/ServiceStack.Client.deps.json b/lib/netstandard2.0/ServiceStack.Client.deps.json index 9f280207..08ef54d1 100644 --- a/lib/netstandard2.0/ServiceStack.Client.deps.json +++ b/lib/netstandard2.0/ServiceStack.Client.deps.json @@ -1,7 +1,7 @@ { "runtimeTarget": { "name": ".NETStandard,Version=v2.0/", - "signature": "adfb9b9cccb1f009435eaec16800602c9c33d841" + "signature": "7462aec951f7071aadd3f8fe28be2f9f9fa90a04" }, "compilationOptions": {}, "targets": { @@ -10,7 +10,7 @@ "ServiceStack.Client/1.0.0": { "dependencies": { "Microsoft.Extensions.Primitives": "2.0.0", - "NETStandard.Library": "2.0.0", + "NETStandard.Library": "2.0.1", "ServiceStack.Interfaces": "1.0.0", "System.Collections.Specialized": "4.3.0", "System.Net.Requests": "4.3.0", @@ -32,7 +32,7 @@ }, "Microsoft.NETCore.Platforms/2.0.0": {}, "Microsoft.NETCore.Targets/1.1.0": {}, - "NETStandard.Library/2.0.0": { + "NETStandard.Library/2.0.1": { "dependencies": { "Microsoft.NETCore.Platforms": "2.0.0" } @@ -730,35 +730,35 @@ "Microsoft.NETCore.Targets/1.1.0": { "type": "package", "serviceable": true, - "sha512": "sha512-vs9c3q7errTVkO1Yh7FoI0eSNvkAIffVpnkygE76Vz8Eo9YtqycOEefrm4iOLMOyMvQIv0Nlw684nt2CDdlzig==", + "sha512": "sha512-aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==", "path": "microsoft.netcore.targets/1.1.0", "hashPath": "microsoft.netcore.targets.1.1.0.nupkg.sha512" }, - "NETStandard.Library/2.0.0": { + "NETStandard.Library/2.0.1": { "type": "package", "serviceable": true, - "sha512": "sha512-7jnbRU+L08FXKMxqUflxEXtVymWvNOrS8yHgu9s6EM8Anr6T/wIX4nZ08j/u3Asz+tCufp3YVwFSEvFTPYmBPA==", - "path": "netstandard.library/2.0.0", - "hashPath": "netstandard.library.2.0.0.nupkg.sha512" + "sha512": "sha512-oA6nwv9MhEKYvLpjZ0ggSpb1g4CQViDVQjLUcDWg598jtvJbpfeP2reqwI1GLW2TbxC/Ml7xL6BBR1HmKPXlTg==", + "path": "netstandard.library/2.0.1", + "hashPath": "netstandard.library.2.0.1.nupkg.sha512" }, "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-XrmXcVFIyqVN6VRAC8NSVkQJ+c87MzDmb6b9+TgzXDmjJrlz5zx0v3RyrLy1Cs3CAWMk5bKQejtd1T0QKnEJUw==", + "sha512": "sha512-HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==", "path": "runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-r15mfA0DanSK+3Z3FyVJxjbTeDnSI8TvXofwii/3dqxHYTAv9Ke7duxTjq8Bo/HUoMOJ0eDbRXjIQ5RvUsJ+Jw==", + "sha512": "sha512-+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==", "path": "runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-LtkpYGXuZ9olCJH/Z7nWBa5nImH9EnRyloaZeHBeyhDRxoTNe4pZBhwR4ta7nHO9UI/82iWlriOL4fdWNNk4wA==", + "sha512": "sha512-c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==", "path": "runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, @@ -786,21 +786,21 @@ "runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-rrVECcoOWyR74djO91XRlxJ+juh/vZsliR6iARqjAFaBKlyPwLJd4aQ5M8tdBJoHLTNTj9QHJfqsSc4Wml3zSQ==", + "sha512": "sha512-NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", "path": "runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-7f8At1xCDhxJuQ1LcLUAa2dK2XZ+HCoEPhIPh9u9pSDO897XA5NP7RnvXYZOEgL+U+hBNvcbefo7OVQluyTLgw==", + "sha512": "sha512-b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==", "path": "runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-qHNQLPqgKifKEOIARxjZUowkJ40aEoSH9VpjDjSFzHRnXH8T+P8zu/FoYFOamn9dqkBzOt4JPAfZaQZQJtxBNA==", + "sha512": "sha512-KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==", "path": "runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, @@ -814,35 +814,35 @@ "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-irmuaiZdNhZu/i6tDDUiZpPrOect9uK0MR4xDkjjY4zWoz4SDXskVPlsD85x1MCxJP5rCAq4wUOWIEeprl2whw==", + "sha512": "sha512-X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==", "path": "runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-gahlletBLrXsMaGBytw1e2whFg+fd9TR0vzR244htAOfp2UHy1XuEdpjqZuUknG8X0r6C8Akk024KYhj9ddmTQ==", + "sha512": "sha512-nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==", "path": "runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-7HajMzjMVtd0+P5HX+Chdnr505E2hKYAq/oTccnEqMRhGzcpWJN0KhPVBRmU7Qy69jdAViFRtyZqUxoBHLkgzw==", + "sha512": "sha512-ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==", "path": "runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-LyZBQqsZ/F4g5itL7TCSotirRSk5hHwrQJomIoasWQnAwCPGGw2p8n/s5Hes8HhjVcypK01k9wMmPw9N+uv+5g==", + "sha512": "sha512-I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==", "path": "runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-ACfI7jQqtQYeO9vJdj+QYGWyoqrNTkFz33GVXPuQvM94/2gwiHkigyA9LZxsqNBHJQ8yPV7xiIQ8ac1SEOLqKQ==", + "sha512": "sha512-VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==", "path": "runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, @@ -856,105 +856,105 @@ "System.Collections/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-1AJbSB9pKc+qhGKTawxCUTAg9lUA8onQMST9tNrIpFit1H2T9Yk1nkW3Gp/lncSQIJ5+ZBlOoL9xjQMPcEmmYw==", + "sha512": "sha512-3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", "path": "system.collections/4.3.0", "hashPath": "system.collections.4.3.0.nupkg.sha512" }, "System.Collections.Concurrent/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-09xY/+b7p5ioslTtGcRxjnzSa06YPihNU6qOE/hWIQkqUV7c/Qs6M/URGkIEbCCALkaaHOI/4ONkoG6jmc9HLg==", + "sha512": "sha512-ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", "path": "system.collections.concurrent/4.3.0", "hashPath": "system.collections.concurrent.4.3.0.nupkg.sha512" }, "System.Collections.NonGeneric/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-ASiGTKJqauqU1YQgHzEo4NL6DJKADvjsTZrNVkTVP9slb5BeMH5F74nIczdJu70jXScELJpQYMhXX+gNVKIlew==", + "sha512": "sha512-prtjIEMhGUnQq6RnPEYLpFt8AtLbp9yq2zxOSrY7KJJZrw25Fi97IzBqY7iqssbM61Ek5b8f3MG/sG1N2sN5KA==", "path": "system.collections.nongeneric/4.3.0", "hashPath": "system.collections.nongeneric.4.3.0.nupkg.sha512" }, "System.Collections.Specialized/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-jQOfOX7848z8dPZEQHPyYwlP5975iTTQ1VczInTpUOe75atEwaoPYDAowLd/OuwFOX2LDLNw0xpLS5enCOXdug==", + "sha512": "sha512-Epx8PoVZR0iuOnJJDzp7pWvdfMMOAvpUo95pC4ScH2mJuXkKA2Y4aR3cG9qt2klHgSons1WFh4kcGW7cSXvrxg==", "path": "system.collections.specialized/4.3.0", "hashPath": "system.collections.specialized.4.3.0.nupkg.sha512" }, "System.Diagnostics.Debug/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-RPkucWK4gQRmV0XUMxXhUir6sJGy9LSDIKm7pBM2c1hBFFFCvwFhFJcLZd81NCpbcHfwXksO/kMzSXUXM2joDQ==", + "sha512": "sha512-ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", "path": "system.diagnostics.debug/4.3.0", "hashPath": "system.diagnostics.debug.4.3.0.nupkg.sha512" }, "System.Diagnostics.DiagnosticSource/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-XjgqzlOJE8H1HhdhVCiK3vu4fen2xwbbe7lEnohBP+xoBN85mFAo78xi5cxkzjlZ1Jup0WLoZc7XpxMnjfbMBQ==", + "sha512": "sha512-tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", "path": "system.diagnostics.diagnosticsource/4.3.0", "hashPath": "system.diagnostics.diagnosticsource.4.3.0.nupkg.sha512" }, "System.Diagnostics.Tracing/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-6r8Ez0r0tyGFBheTZYjkU4qpLJZnhVwAFDDF6GVkyge9jeMFVK6Uu7JXrGTeE2m09GcRNS5STJvsX1vb+Omacg==", + "sha512": "sha512-rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", "path": "system.diagnostics.tracing/4.3.0", "hashPath": "system.diagnostics.tracing.4.3.0.nupkg.sha512" }, "System.Globalization/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-EppWk5+tMzaEzhZkUfaOKuqnC2ECFzQVadE9yBRQtVSWtGOsu9QhfovAhb1Q7FV6X6G9g/a7/8W6ORUjuKxOjQ==", + "sha512": "sha512-kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", "path": "system.globalization/4.3.0", "hashPath": "system.globalization.4.3.0.nupkg.sha512" }, "System.Globalization.Calendars/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-31GxAA4aEL8efY3LcrAbaL52/x5eMREK/uH+QTB62bLG9IeydmvXECS4BYHiyCnTco97YhGkO9CsHJynwPtNUA==", + "sha512": "sha512-GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", "path": "system.globalization.calendars/4.3.0", "hashPath": "system.globalization.calendars.4.3.0.nupkg.sha512" }, "System.Globalization.Extensions/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-Pj6LfslnZNSSZm/8X03IlxU1zA9Zintjviv4GStB0WUxYu2puDwm7qvlwzGy7/FW6Qa9xzmF/IVN0wpvmYN9Lg==", + "sha512": "sha512-FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", "path": "system.globalization.extensions/4.3.0", "hashPath": "system.globalization.extensions.4.3.0.nupkg.sha512" }, "System.IO/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-/wTullO3iTZcj0tbuz1xIcmk+O0/JmkuxcqwAsTfadEEni+sQUQ36JYlSE5D2mSArRtaE1M3bzB75HgcGCJ+tQ==", + "sha512": "sha512-3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", "path": "system.io/4.3.0", "hashPath": "system.io.4.3.0.nupkg.sha512" }, "System.IO.FileSystem/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-bDwE6iQKXXWl0/xvCInd5ao9TCz10XprzDLprOWR+6I3stD082KpbAK5goMsEbM4gXWfT0Im5THeAsZaU8bBlQ==", + "sha512": "sha512-3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", "path": "system.io.filesystem/4.3.0", "hashPath": "system.io.filesystem.4.3.0.nupkg.sha512" }, "System.IO.FileSystem.Primitives/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-fYutRsdDDthwR0+LP7gSrwz50TJFAbQNtQYPXfdjvvVVdJWqW+sGANq338ytNkYjR3eFN4w04hEj5hovZjZQ2Q==", + "sha512": "sha512-6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", "path": "system.io.filesystem.primitives/4.3.0", "hashPath": "system.io.filesystem.primitives.4.3.0.nupkg.sha512" }, "System.Linq/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-JPPJ2d6FK9Z+HcWp8oXjd6ZcLk94OIq+Jgoi5hq62lz+VOLIaE7MXSBO1YVi1w+3RJJYEMDqtIJwQ1BgpuKKsA==", + "sha512": "sha512-5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", "path": "system.linq/4.3.0", "hashPath": "system.linq.4.3.0.nupkg.sha512" }, "System.Net.Http/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-iz1MgqiwRi9uIZGrj7TYWTM6RSiC/6qp3lBMs05Ko1pXQ3fmpZK67Iqj0Vj60YjqYLggDLIkhpo4qV7B/Ms4HQ==", + "sha512": "sha512-sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", "path": "system.net.http/4.3.0", "hashPath": "system.net.http.4.3.0.nupkg.sha512" }, @@ -968,7 +968,7 @@ "System.Net.Primitives/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-AaMayOmbnglWGOkaNbza9FhBNtYRn4zNG8Nnu7Hit+KYA06noogYjz6asLXmF3PpfHjFsMORlyG7nKyGJPW96A==", + "sha512": "sha512-qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", "path": "system.net.primitives/4.3.0", "hashPath": "system.net.primitives.4.3.0.nupkg.sha512" }, @@ -996,7 +996,7 @@ "System.Reflection/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-3uYB1Y9PY+4B/XtCMGiLfnNP9SJU5vovOLiEGabFqBOtBML8PurmWr0OzPKebsrGviYB1acTKrhE1NAIb+P3mQ==", + "sha512": "sha512-KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", "path": "system.reflection/4.3.0", "hashPath": "system.reflection.4.3.0.nupkg.sha512" }, @@ -1010,49 +1010,49 @@ "System.Reflection.Emit/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-GHctkl5J3qRgAvXxc+cQXbYfrw0S7kZswbTbbFgSjvGU/KhTRmH+ZpMNToI8NA/nLCMl0EAgbWpIfp74EnYOJw==", + "sha512": "sha512-228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", "path": "system.reflection.emit/4.3.0", "hashPath": "system.reflection.emit.4.3.0.nupkg.sha512" }, "System.Reflection.Emit.ILGeneration/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-lqTxoVZbRVP84GyXyxOUeB2PdOzrTLAMluaxIkp94WURhQMAKQKlQd5YATL+UnTDtxDzd9HZDKjF7xl2jjQEnA==", + "sha512": "sha512-59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", "path": "system.reflection.emit.ilgeneration/4.3.0", "hashPath": "system.reflection.emit.ilgeneration.4.3.0.nupkg.sha512" }, "System.Reflection.Extensions/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-I2lC6UhAtrIm6D52Mn9dNys56s9Mus94e03FMU/RRqJvLyQ4AyRIPa+5oU73wyQ+pKMFUJU5PeS7nURr6DHG2A==", + "sha512": "sha512-rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", "path": "system.reflection.extensions/4.3.0", "hashPath": "system.reflection.extensions.4.3.0.nupkg.sha512" }, "System.Reflection.Primitives/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-IWUmJcoqCpvsIn0Txobe+5idI096N+08jM3pnbVW1QWBDWQcSZqfQ7nNpMv/eKexrdlODAup0nd9dMRzbfPgSA==", + "sha512": "sha512-5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", "path": "system.reflection.primitives/4.3.0", "hashPath": "system.reflection.primitives.4.3.0.nupkg.sha512" }, "System.Reflection.TypeExtensions/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-bddVPkbwJzLo0+FzvsoEunOBODGVEJ5JRFU1Xjo4MxhCUrpO7JJ5CJCFx7RXIrBtsAUH5Jh94v3pWEM/MLziJw==", + "sha512": "sha512-7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", "path": "system.reflection.typeextensions/4.3.0", "hashPath": "system.reflection.typeextensions.4.3.0.nupkg.sha512" }, "System.Resources.ResourceManager/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-H6KDV29RfZ623UnvI4goq8doHylg0GjNiHfSLuzLibGHmcdXiw1XgCq/gd/LwPvnVgJUcJ9tNKcDnYiDaWm7hA==", + "sha512": "sha512-/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", "path": "system.resources.resourcemanager/4.3.0", "hashPath": "system.resources.resourcemanager.4.3.0.nupkg.sha512" }, "System.Runtime/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-iD01AV/eij/6iIa2UZHXayeOQoyjjP48pSIpP2bgxDVwTftELekKHJmsCTE7kD0BobeK6O2+RzQownNc9Yro9w==", + "sha512": "sha512-JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", "path": "system.runtime/4.3.0", "hashPath": "system.runtime.4.3.0.nupkg.sha512" }, @@ -1066,49 +1066,49 @@ "System.Runtime.Extensions/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-PZGJVsgBNSBnKUF4N9e36W+3ZO7tJ5OtUoZP7mqfKUFwplBShDaGEgehH6j6cuOmtbaZw+N/97cl+GgDSwt0YQ==", + "sha512": "sha512-guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", "path": "system.runtime.extensions/4.3.0", "hashPath": "system.runtime.extensions.4.3.0.nupkg.sha512" }, "System.Runtime.Handles/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-4Psk9sl0VLSE9uPBSeZBJKlf8qQET8+cf8Y0DDyoCUiQ5jp93knJQWfuAJaRxb2Ryar8crjSlMzsUz/jp9aQ1w==", + "sha512": "sha512-OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", "path": "system.runtime.handles/4.3.0", "hashPath": "system.runtime.handles.4.3.0.nupkg.sha512" }, "System.Runtime.InteropServices/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-AFYM6PJsqZVtVWE6jlERrG65+LHOoaYGW6D/TFKvMIwZ4tXgs8qLtGY1jQXrgLABvJMKxfR8Y+WpKR2C9R4h3Q==", + "sha512": "sha512-uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", "path": "system.runtime.interopservices/4.3.0", "hashPath": "system.runtime.interopservices.4.3.0.nupkg.sha512" }, "System.Runtime.Numerics/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-wpA0s4R+cb/6dd6AxzwkQ8A9K9kc/A41DQdpbyNTrV2syqOJk/0LUInhOEgFaarcejrApCpTfvHP4QhaeUC2Uw==", + "sha512": "sha512-yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", "path": "system.runtime.numerics/4.3.0", "hashPath": "system.runtime.numerics.4.3.0.nupkg.sha512" }, "System.Runtime.Serialization.Primitives/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-skc/xdfE6A4vKZL/992b0Jd+4iAye3CTmMitItDzOk6r8hpo+8bDLqMX9brgSg0NZyNE9UI/P8nHRWQUjvKYdQ==", + "sha512": "sha512-Wz+0KOukJGAlXjtKr+5Xpuxf8+c8739RI1C+A2BoQZT+wMCCoMDDdO8/4IRHfaVINqL78GO8dW8G2lW/e45Mcw==", "path": "system.runtime.serialization.primitives/4.3.0", "hashPath": "system.runtime.serialization.primitives.4.3.0.nupkg.sha512" }, "System.Security.Cryptography.Algorithms/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-YQ5ql2EzgxUp6vI+jHxo9lmcH0Iy1RsmxtggtbJ1jy8rt+W3uc7t1iFQri0zNM3BJyCw3P31TF8jxWpxcc1aPQ==", + "sha512": "sha512-W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", "path": "system.security.cryptography.algorithms/4.3.0", "hashPath": "system.security.cryptography.algorithms.4.3.0.nupkg.sha512" }, "System.Security.Cryptography.Cng/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-gmloRV7S66IH/jYbvnaUhaDwMSug1hWjuswsZuZPjmj94SMH/DRHQHU+4zSIQXEhCwRh9zMIQahY6nRfqXHrmA==", + "sha512": "sha512-03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", "path": "system.security.cryptography.cng/4.3.0", "hashPath": "system.security.cryptography.cng.4.3.0.nupkg.sha512" }, @@ -1122,7 +1122,7 @@ "System.Security.Cryptography.Encoding/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-VUhXu1S0kQqHgjBIHmWE1jfgaSRGqH3rL/pmlQrrKzCg9iQanwNIvE5DQmjx0JXT+eUc+/Y0ARu9XxQKS1/rAQ==", + "sha512": "sha512-1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", "path": "system.security.cryptography.encoding/4.3.0", "hashPath": "system.security.cryptography.encoding.4.3.0.nupkg.sha512" }, @@ -1136,14 +1136,14 @@ "System.Security.Cryptography.Primitives/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-MWGvviIh8HKFpphRZxg7chpN1FkeMBP2O+2+yMDc9/kgs72G7hSjOUlBqg4O/cvNahBRJZ0JtulS5jlpR/OREQ==", + "sha512": "sha512-7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", "path": "system.security.cryptography.primitives/4.3.0", "hashPath": "system.security.cryptography.primitives.4.3.0.nupkg.sha512" }, "System.Security.Cryptography.X509Certificates/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-anCRBHYjC2PtfOm8tbs1x5KZ+2/JXuOj3oWNHt0U50YhLQxZv0hFB4NRNFTJt2i7wyJD/Ow2oJ/ti0nHJa6a6w==", + "sha512": "sha512-t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", "path": "system.security.cryptography.x509certificates/4.3.0", "hashPath": "system.security.cryptography.x509certificates.4.3.0.nupkg.sha512" }, @@ -1164,63 +1164,63 @@ "System.Text.Encoding/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-58DKIOFSEnQqFEogJ0lqgGFf1Gr9Zzc9/KmYvOR9uW9lf35DHzGNkki+HpPNsdEIHCjKmnQRJF9sBrovQhYhKw==", + "sha512": "sha512-BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", "path": "system.text.encoding/4.3.0", "hashPath": "system.text.encoding.4.3.0.nupkg.sha512" }, "System.Text.Encoding.Extensions/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-wSIplxLLihOx5TGFa8Nn98eWAmkZbBdslSviLvwfUiqiUEUEuqrsbrV2hE9haNf1BZbbvM4ClrcJ58KUQk96pw==", + "sha512": "sha512-YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", "path": "system.text.encoding.extensions/4.3.0", "hashPath": "system.text.encoding.extensions.4.3.0.nupkg.sha512" }, "System.Text.RegularExpressions/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-M03moZwpMD9vtWFARtrB0QdKPsSxFqJ8oDrAi6s1jY7R4+2fQcu6chC/ULn6/da9MM93fNOMPGURQAay8N8H5Q==", + "sha512": "sha512-RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", "path": "system.text.regularexpressions/4.3.0", "hashPath": "system.text.regularexpressions.4.3.0.nupkg.sha512" }, "System.Threading/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-BYKL/G9muhpJ2TbkTPeaEUKrZ75oKDtoc7u0itkYqASIvRZijCRLYAPfOPOADxDlqsSAMRRCOP5rebN5Zl7p2g==", + "sha512": "sha512-VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", "path": "system.threading/4.3.0", "hashPath": "system.threading.4.3.0.nupkg.sha512" }, "System.Threading.Tasks/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-eYZRKpn/EpgiXlh8QGXI3qnAWmIdbmjZhqyKIuURD4awwTMBJL56b5ykdWRus9TLKRbvAPAdWiPxFc/VBJ+d9A==", + "sha512": "sha512-LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", "path": "system.threading.tasks/4.3.0", "hashPath": "system.threading.tasks.4.3.0.nupkg.sha512" }, "System.Threading.Tasks.Extensions/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-kW7nIBjfW8DzVkmOcckgGMirxC2oDr0/v4ZIokUop6gFCudQVEGR9GoCGstVCSiuN1P9j+FlH9YX2OXxv2dV1A==", + "sha512": "sha512-npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", "path": "system.threading.tasks.extensions/4.3.0", "hashPath": "system.threading.tasks.extensions.4.3.0.nupkg.sha512" }, "System.Xml.ReaderWriter/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-4ghUccqnWLWIYzuYX84Vx6T7/1MSvdAmmqlyMK1DoRyvO2wYq1v5QMsAKjdY1h4iH5nkOh6a50cio/qY9VgRSw==", + "sha512": "sha512-GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", "path": "system.xml.readerwriter/4.3.0", "hashPath": "system.xml.readerwriter.4.3.0.nupkg.sha512" }, "System.Xml.XmlDocument/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-ljbrPCAXEu5ijirKRxzH9eA3+/IhCpyv321JSepyUdM0fCPGo/910BXt/KwMVruLKN8dkIOUdYm2LlqBuIRn1Q==", + "sha512": "sha512-lJ8AxvkX7GQxpC6GFCeBj8ThYVyQczx2+f/cWHJU8tjS7YfI6Cv6bon70jVEgs2CiFbmmM8b9j1oZVx0dSI2Ww==", "path": "system.xml.xmldocument/4.3.0", "hashPath": "system.xml.xmldocument.4.3.0.nupkg.sha512" }, "System.Xml.XmlSerializer/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-pXIz8nVP9y1uc3WCyTdl5LDesu2M6BDlMF7+JZS72oqKSZHXd2Q9PwepKFsFryWDMQEAjkjmyDEFu4FISdYfCw==", + "sha512": "sha512-ZHKYxQIWOh7OtWGCTY+aztU2uSfjUN+P2GyUU+ZwvHzHQOYhLmyuvwmmR1EzmhcnrTFtF3pEM3XXI2KUaboz1Q==", "path": "system.xml.xmlserializer/4.3.0", "hashPath": "system.xml.xmlserializer.4.3.0.nupkg.sha512" }, diff --git a/lib/netstandard2.0/ServiceStack.Client.dll b/lib/netstandard2.0/ServiceStack.Client.dll index 3beb379c..197aa696 100644 Binary files a/lib/netstandard2.0/ServiceStack.Client.dll and b/lib/netstandard2.0/ServiceStack.Client.dll differ diff --git a/lib/netstandard2.0/ServiceStack.Client.xml b/lib/netstandard2.0/ServiceStack.Client.xml index 33fe3e6c..10677a54 100644 --- a/lib/netstandard2.0/ServiceStack.Client.xml +++ b/lib/netstandard2.0/ServiceStack.Client.xml @@ -98,8 +98,10 @@ Namespace of type - Need to provide async request options - http://msdn.microsoft.com/en-us/library/86wf6409(VS.71).aspx + + Makes a client middleware to access remote web service. This is an abstract class. + Needs to provide async request options, http://msdn.microsoft.com/en-us/library/86wf6409(VS.71).aspx. + @@ -120,6 +122,11 @@ Gets the collection of headers to be added to outgoing requests. + + + Initializes a new instance of the ServiceStack.ServiceClientBase class. + + Sets all baseUri properties, using the Format property for the SyncReplyBaseUri and AsyncOneWayBaseUri diff --git a/lib/netstandard2.0/ServiceStack.Common.deps.json b/lib/netstandard2.0/ServiceStack.Common.deps.json index 7dd8e4f9..fc1bfa14 100644 --- a/lib/netstandard2.0/ServiceStack.Common.deps.json +++ b/lib/netstandard2.0/ServiceStack.Common.deps.json @@ -1,7 +1,7 @@ { "runtimeTarget": { "name": ".NETStandard,Version=v2.0/", - "signature": "f819a3335cbb393ad3e29b137d855b47536c3d9b" + "signature": "304ceac106e5bbc5b95a2fbf1a6c65db3389f9cf" }, "compilationOptions": {}, "targets": { @@ -10,7 +10,7 @@ "ServiceStack.Common/1.0.0": { "dependencies": { "Microsoft.Extensions.Primitives": "2.0.0", - "NETStandard.Library": "2.0.0", + "NETStandard.Library": "2.0.1", "ServiceStack.Interfaces": "1.0.0", "System.ComponentModel.Primitives": "4.3.0", "System.Data.Common": "4.3.0", @@ -42,7 +42,7 @@ "System.Runtime": "4.3.0" } }, - "NETStandard.Library/2.0.0": { + "NETStandard.Library/2.0.1": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0" } @@ -789,49 +789,49 @@ "Microsoft.NETCore.Platforms/1.1.0": { "type": "package", "serviceable": true, - "sha512": "sha512-n2QVe1U/8yMdyowo8Z0C4fWPGTJlkvGnqYBw2DFMMPs9uA6mgVDq/xaklZiUl57FVfJm2WcEu1ybdodsRx/gDQ==", + "sha512": "sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==", "path": "microsoft.netcore.platforms/1.1.0", "hashPath": "microsoft.netcore.platforms.1.1.0.nupkg.sha512" }, "Microsoft.NETCore.Targets/1.1.0": { "type": "package", "serviceable": true, - "sha512": "sha512-vs9c3q7errTVkO1Yh7FoI0eSNvkAIffVpnkygE76Vz8Eo9YtqycOEefrm4iOLMOyMvQIv0Nlw684nt2CDdlzig==", + "sha512": "sha512-aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==", "path": "microsoft.netcore.targets/1.1.0", "hashPath": "microsoft.netcore.targets.1.1.0.nupkg.sha512" }, "Microsoft.Win32.Primitives/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-SQ8c0zlY8aw8GZnA8pkKxpE5yDoQ0f123v6Aci8hSrrk9pJWtPgDcdn3KeHZlBtX6YefOUGzJ6Kb+WdwFrooFQ==", + "sha512": "sha512-9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", "path": "microsoft.win32.primitives/4.3.0", "hashPath": "microsoft.win32.primitives.4.3.0.nupkg.sha512" }, - "NETStandard.Library/2.0.0": { + "NETStandard.Library/2.0.1": { "type": "package", "serviceable": true, - "sha512": "sha512-7jnbRU+L08FXKMxqUflxEXtVymWvNOrS8yHgu9s6EM8Anr6T/wIX4nZ08j/u3Asz+tCufp3YVwFSEvFTPYmBPA==", - "path": "netstandard.library/2.0.0", - "hashPath": "netstandard.library.2.0.0.nupkg.sha512" + "sha512": "sha512-oA6nwv9MhEKYvLpjZ0ggSpb1g4CQViDVQjLUcDWg598jtvJbpfeP2reqwI1GLW2TbxC/Ml7xL6BBR1HmKPXlTg==", + "path": "netstandard.library/2.0.1", + "hashPath": "netstandard.library.2.0.1.nupkg.sha512" }, "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-XrmXcVFIyqVN6VRAC8NSVkQJ+c87MzDmb6b9+TgzXDmjJrlz5zx0v3RyrLy1Cs3CAWMk5bKQejtd1T0QKnEJUw==", + "sha512": "sha512-HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==", "path": "runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-r15mfA0DanSK+3Z3FyVJxjbTeDnSI8TvXofwii/3dqxHYTAv9Ke7duxTjq8Bo/HUoMOJ0eDbRXjIQ5RvUsJ+Jw==", + "sha512": "sha512-+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==", "path": "runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-LtkpYGXuZ9olCJH/Z7nWBa5nImH9EnRyloaZeHBeyhDRxoTNe4pZBhwR4ta7nHO9UI/82iWlriOL4fdWNNk4wA==", + "sha512": "sha512-c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==", "path": "runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, @@ -859,21 +859,21 @@ "runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-rrVECcoOWyR74djO91XRlxJ+juh/vZsliR6iARqjAFaBKlyPwLJd4aQ5M8tdBJoHLTNTj9QHJfqsSc4Wml3zSQ==", + "sha512": "sha512-NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", "path": "runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-7f8At1xCDhxJuQ1LcLUAa2dK2XZ+HCoEPhIPh9u9pSDO897XA5NP7RnvXYZOEgL+U+hBNvcbefo7OVQluyTLgw==", + "sha512": "sha512-b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==", "path": "runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-qHNQLPqgKifKEOIARxjZUowkJ40aEoSH9VpjDjSFzHRnXH8T+P8zu/FoYFOamn9dqkBzOt4JPAfZaQZQJtxBNA==", + "sha512": "sha512-KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==", "path": "runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, @@ -887,49 +887,49 @@ "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-irmuaiZdNhZu/i6tDDUiZpPrOect9uK0MR4xDkjjY4zWoz4SDXskVPlsD85x1MCxJP5rCAq4wUOWIEeprl2whw==", + "sha512": "sha512-X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==", "path": "runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-gahlletBLrXsMaGBytw1e2whFg+fd9TR0vzR244htAOfp2UHy1XuEdpjqZuUknG8X0r6C8Akk024KYhj9ddmTQ==", + "sha512": "sha512-nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==", "path": "runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-7HajMzjMVtd0+P5HX+Chdnr505E2hKYAq/oTccnEqMRhGzcpWJN0KhPVBRmU7Qy69jdAViFRtyZqUxoBHLkgzw==", + "sha512": "sha512-ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==", "path": "runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-LyZBQqsZ/F4g5itL7TCSotirRSk5hHwrQJomIoasWQnAwCPGGw2p8n/s5Hes8HhjVcypK01k9wMmPw9N+uv+5g==", + "sha512": "sha512-I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==", "path": "runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-ACfI7jQqtQYeO9vJdj+QYGWyoqrNTkFz33GVXPuQvM94/2gwiHkigyA9LZxsqNBHJQ8yPV7xiIQ8ac1SEOLqKQ==", + "sha512": "sha512-VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==", "path": "runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "System.Collections/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-1AJbSB9pKc+qhGKTawxCUTAg9lUA8onQMST9tNrIpFit1H2T9Yk1nkW3Gp/lncSQIJ5+ZBlOoL9xjQMPcEmmYw==", + "sha512": "sha512-3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", "path": "system.collections/4.3.0", "hashPath": "system.collections.4.3.0.nupkg.sha512" }, "System.Collections.Concurrent/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-09xY/+b7p5ioslTtGcRxjnzSa06YPihNU6qOE/hWIQkqUV7c/Qs6M/URGkIEbCCALkaaHOI/4ONkoG6jmc9HLg==", + "sha512": "sha512-ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", "path": "system.collections.concurrent/4.3.0", "hashPath": "system.collections.concurrent.4.3.0.nupkg.sha512" }, @@ -957,91 +957,91 @@ "System.Diagnostics.Debug/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-RPkucWK4gQRmV0XUMxXhUir6sJGy9LSDIKm7pBM2c1hBFFFCvwFhFJcLZd81NCpbcHfwXksO/kMzSXUXM2joDQ==", + "sha512": "sha512-ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", "path": "system.diagnostics.debug/4.3.0", "hashPath": "system.diagnostics.debug.4.3.0.nupkg.sha512" }, "System.Diagnostics.DiagnosticSource/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-XjgqzlOJE8H1HhdhVCiK3vu4fen2xwbbe7lEnohBP+xoBN85mFAo78xi5cxkzjlZ1Jup0WLoZc7XpxMnjfbMBQ==", + "sha512": "sha512-tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", "path": "system.diagnostics.diagnosticsource/4.3.0", "hashPath": "system.diagnostics.diagnosticsource.4.3.0.nupkg.sha512" }, "System.Diagnostics.Tracing/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-6r8Ez0r0tyGFBheTZYjkU4qpLJZnhVwAFDDF6GVkyge9jeMFVK6Uu7JXrGTeE2m09GcRNS5STJvsX1vb+Omacg==", + "sha512": "sha512-rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", "path": "system.diagnostics.tracing/4.3.0", "hashPath": "system.diagnostics.tracing.4.3.0.nupkg.sha512" }, "System.Dynamic.Runtime/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-Kiu80W6wgVYPLJz6R8kh8GacUuPIDmvew2GaWmKsQVi6DaYKDneg9R1vmAcXDf5hKj1qPzgmFloRzFbUl9jHeg==", + "sha512": "sha512-SNVi1E/vfWUAs/WYKhE9+qlS6KqK0YVhnlT0HQtr8pMIA8YX3lwy3uPMownDwdYISBdmAF/2holEIldVp85Wag==", "path": "system.dynamic.runtime/4.3.0", "hashPath": "system.dynamic.runtime.4.3.0.nupkg.sha512" }, "System.Globalization/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-EppWk5+tMzaEzhZkUfaOKuqnC2ECFzQVadE9yBRQtVSWtGOsu9QhfovAhb1Q7FV6X6G9g/a7/8W6ORUjuKxOjQ==", + "sha512": "sha512-kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", "path": "system.globalization/4.3.0", "hashPath": "system.globalization.4.3.0.nupkg.sha512" }, "System.Globalization.Calendars/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-31GxAA4aEL8efY3LcrAbaL52/x5eMREK/uH+QTB62bLG9IeydmvXECS4BYHiyCnTco97YhGkO9CsHJynwPtNUA==", + "sha512": "sha512-GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", "path": "system.globalization.calendars/4.3.0", "hashPath": "system.globalization.calendars.4.3.0.nupkg.sha512" }, "System.Globalization.Extensions/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-Pj6LfslnZNSSZm/8X03IlxU1zA9Zintjviv4GStB0WUxYu2puDwm7qvlwzGy7/FW6Qa9xzmF/IVN0wpvmYN9Lg==", + "sha512": "sha512-FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", "path": "system.globalization.extensions/4.3.0", "hashPath": "system.globalization.extensions.4.3.0.nupkg.sha512" }, "System.IO/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-/wTullO3iTZcj0tbuz1xIcmk+O0/JmkuxcqwAsTfadEEni+sQUQ36JYlSE5D2mSArRtaE1M3bzB75HgcGCJ+tQ==", + "sha512": "sha512-3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", "path": "system.io/4.3.0", "hashPath": "system.io.4.3.0.nupkg.sha512" }, "System.IO.FileSystem/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-bDwE6iQKXXWl0/xvCInd5ao9TCz10XprzDLprOWR+6I3stD082KpbAK5goMsEbM4gXWfT0Im5THeAsZaU8bBlQ==", + "sha512": "sha512-3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", "path": "system.io.filesystem/4.3.0", "hashPath": "system.io.filesystem.4.3.0.nupkg.sha512" }, "System.IO.FileSystem.Primitives/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-fYutRsdDDthwR0+LP7gSrwz50TJFAbQNtQYPXfdjvvVVdJWqW+sGANq338ytNkYjR3eFN4w04hEj5hovZjZQ2Q==", + "sha512": "sha512-6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", "path": "system.io.filesystem.primitives/4.3.0", "hashPath": "system.io.filesystem.primitives.4.3.0.nupkg.sha512" }, "System.Linq/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-JPPJ2d6FK9Z+HcWp8oXjd6ZcLk94OIq+Jgoi5hq62lz+VOLIaE7MXSBO1YVi1w+3RJJYEMDqtIJwQ1BgpuKKsA==", + "sha512": "sha512-5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", "path": "system.linq/4.3.0", "hashPath": "system.linq.4.3.0.nupkg.sha512" }, "System.Linq.Expressions/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-mvEeo9a4GGe/UdvjLumBajn21DRjZkpcm/HMeLAq5b0E00DKn/f7NoY4nDBdgh6E2o88YTMVtKSbcANvV6QZGg==", + "sha512": "sha512-PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", "path": "system.linq.expressions/4.3.0", "hashPath": "system.linq.expressions.4.3.0.nupkg.sha512" }, "System.Net.Http/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-iz1MgqiwRi9uIZGrj7TYWTM6RSiC/6qp3lBMs05Ko1pXQ3fmpZK67Iqj0Vj60YjqYLggDLIkhpo4qV7B/Ms4HQ==", + "sha512": "sha512-sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", "path": "system.net.http/4.3.0", "hashPath": "system.net.http.4.3.0.nupkg.sha512" }, @@ -1055,7 +1055,7 @@ "System.Net.Primitives/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-AaMayOmbnglWGOkaNbza9FhBNtYRn4zNG8Nnu7Hit+KYA06noogYjz6asLXmF3PpfHjFsMORlyG7nKyGJPW96A==", + "sha512": "sha512-qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", "path": "system.net.primitives/4.3.0", "hashPath": "system.net.primitives.4.3.0.nupkg.sha512" }, @@ -1069,7 +1069,7 @@ "System.Net.Sockets/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-IBP4eAQFdjvJfw+SwegrabtbiHSkGf18N9Nt5YVgT5lKUfulv/HhO3jTVbq14ofQYmIbkBwKzeDkUKb3tRzHKg==", + "sha512": "sha512-m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", "path": "system.net.sockets/4.3.0", "hashPath": "system.net.sockets.4.3.0.nupkg.sha512" }, @@ -1083,70 +1083,70 @@ "System.ObjectModel/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-f9SGFzGsZekQyy3dfgrODqmEB8crsCJTvsUa6pnMnjRwXaQXz0OG3l20iu7SsPFC6mQLWydA5NA5BzeRYlacdw==", + "sha512": "sha512-bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", "path": "system.objectmodel/4.3.0", "hashPath": "system.objectmodel.4.3.0.nupkg.sha512" }, "System.Reflection/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-3uYB1Y9PY+4B/XtCMGiLfnNP9SJU5vovOLiEGabFqBOtBML8PurmWr0OzPKebsrGviYB1acTKrhE1NAIb+P3mQ==", + "sha512": "sha512-KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", "path": "system.reflection/4.3.0", "hashPath": "system.reflection.4.3.0.nupkg.sha512" }, "System.Reflection.Emit/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-GHctkl5J3qRgAvXxc+cQXbYfrw0S7kZswbTbbFgSjvGU/KhTRmH+ZpMNToI8NA/nLCMl0EAgbWpIfp74EnYOJw==", + "sha512": "sha512-228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", "path": "system.reflection.emit/4.3.0", "hashPath": "system.reflection.emit.4.3.0.nupkg.sha512" }, "System.Reflection.Emit.ILGeneration/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-lqTxoVZbRVP84GyXyxOUeB2PdOzrTLAMluaxIkp94WURhQMAKQKlQd5YATL+UnTDtxDzd9HZDKjF7xl2jjQEnA==", + "sha512": "sha512-59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", "path": "system.reflection.emit.ilgeneration/4.3.0", "hashPath": "system.reflection.emit.ilgeneration.4.3.0.nupkg.sha512" }, "System.Reflection.Emit.Lightweight/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-LvX8HS0d2l8lNam0RpJgH3gQM6nSSP3crcE6XlMYCBvhTv41HkZbroA3YsCyC21Eu3hsZu1jJRTxmgsD7dww2g==", + "sha512": "sha512-oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", "path": "system.reflection.emit.lightweight/4.3.0", "hashPath": "system.reflection.emit.lightweight.4.3.0.nupkg.sha512" }, "System.Reflection.Extensions/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-I2lC6UhAtrIm6D52Mn9dNys56s9Mus94e03FMU/RRqJvLyQ4AyRIPa+5oU73wyQ+pKMFUJU5PeS7nURr6DHG2A==", + "sha512": "sha512-rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", "path": "system.reflection.extensions/4.3.0", "hashPath": "system.reflection.extensions.4.3.0.nupkg.sha512" }, "System.Reflection.Primitives/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-IWUmJcoqCpvsIn0Txobe+5idI096N+08jM3pnbVW1QWBDWQcSZqfQ7nNpMv/eKexrdlODAup0nd9dMRzbfPgSA==", + "sha512": "sha512-5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", "path": "system.reflection.primitives/4.3.0", "hashPath": "system.reflection.primitives.4.3.0.nupkg.sha512" }, "System.Reflection.TypeExtensions/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-bddVPkbwJzLo0+FzvsoEunOBODGVEJ5JRFU1Xjo4MxhCUrpO7JJ5CJCFx7RXIrBtsAUH5Jh94v3pWEM/MLziJw==", + "sha512": "sha512-7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", "path": "system.reflection.typeextensions/4.3.0", "hashPath": "system.reflection.typeextensions.4.3.0.nupkg.sha512" }, "System.Resources.ResourceManager/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-H6KDV29RfZ623UnvI4goq8doHylg0GjNiHfSLuzLibGHmcdXiw1XgCq/gd/LwPvnVgJUcJ9tNKcDnYiDaWm7hA==", + "sha512": "sha512-/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", "path": "system.resources.resourcemanager/4.3.0", "hashPath": "system.resources.resourcemanager.4.3.0.nupkg.sha512" }, "System.Runtime/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-iD01AV/eij/6iIa2UZHXayeOQoyjjP48pSIpP2bgxDVwTftELekKHJmsCTE7kD0BobeK6O2+RzQownNc9Yro9w==", + "sha512": "sha512-JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", "path": "system.runtime/4.3.0", "hashPath": "system.runtime.4.3.0.nupkg.sha512" }, @@ -1160,56 +1160,56 @@ "System.Runtime.Extensions/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-PZGJVsgBNSBnKUF4N9e36W+3ZO7tJ5OtUoZP7mqfKUFwplBShDaGEgehH6j6cuOmtbaZw+N/97cl+GgDSwt0YQ==", + "sha512": "sha512-guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", "path": "system.runtime.extensions/4.3.0", "hashPath": "system.runtime.extensions.4.3.0.nupkg.sha512" }, "System.Runtime.Handles/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-4Psk9sl0VLSE9uPBSeZBJKlf8qQET8+cf8Y0DDyoCUiQ5jp93knJQWfuAJaRxb2Ryar8crjSlMzsUz/jp9aQ1w==", + "sha512": "sha512-OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", "path": "system.runtime.handles/4.3.0", "hashPath": "system.runtime.handles.4.3.0.nupkg.sha512" }, "System.Runtime.InteropServices/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-AFYM6PJsqZVtVWE6jlERrG65+LHOoaYGW6D/TFKvMIwZ4tXgs8qLtGY1jQXrgLABvJMKxfR8Y+WpKR2C9R4h3Q==", + "sha512": "sha512-uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", "path": "system.runtime.interopservices/4.3.0", "hashPath": "system.runtime.interopservices.4.3.0.nupkg.sha512" }, "System.Runtime.Numerics/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-wpA0s4R+cb/6dd6AxzwkQ8A9K9kc/A41DQdpbyNTrV2syqOJk/0LUInhOEgFaarcejrApCpTfvHP4QhaeUC2Uw==", + "sha512": "sha512-yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", "path": "system.runtime.numerics/4.3.0", "hashPath": "system.runtime.numerics.4.3.0.nupkg.sha512" }, "System.Runtime.Serialization.Primitives/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-skc/xdfE6A4vKZL/992b0Jd+4iAye3CTmMitItDzOk6r8hpo+8bDLqMX9brgSg0NZyNE9UI/P8nHRWQUjvKYdQ==", + "sha512": "sha512-Wz+0KOukJGAlXjtKr+5Xpuxf8+c8739RI1C+A2BoQZT+wMCCoMDDdO8/4IRHfaVINqL78GO8dW8G2lW/e45Mcw==", "path": "system.runtime.serialization.primitives/4.3.0", "hashPath": "system.runtime.serialization.primitives.4.3.0.nupkg.sha512" }, "System.Security.Claims/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-A4WF5fZ8epDZsBXNe6BkB+weMXPpTHgPLxcb8U9VUjddtmaFA/BH1lV+2ATN5WY1Ex1bSxyO1KnGsX3yvTV0UA==", + "sha512": "sha512-P/+BR/2lnc4PNDHt/TPBAWHVMLMRHsyYZbU1NphW4HIWzCggz8mJbTQQ3MKljFE7LS3WagmVFuBgoLcFzYXlkA==", "path": "system.security.claims/4.3.0", "hashPath": "system.security.claims.4.3.0.nupkg.sha512" }, "System.Security.Cryptography.Algorithms/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-YQ5ql2EzgxUp6vI+jHxo9lmcH0Iy1RsmxtggtbJ1jy8rt+W3uc7t1iFQri0zNM3BJyCw3P31TF8jxWpxcc1aPQ==", + "sha512": "sha512-W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", "path": "system.security.cryptography.algorithms/4.3.0", "hashPath": "system.security.cryptography.algorithms.4.3.0.nupkg.sha512" }, "System.Security.Cryptography.Cng/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-gmloRV7S66IH/jYbvnaUhaDwMSug1hWjuswsZuZPjmj94SMH/DRHQHU+4zSIQXEhCwRh9zMIQahY6nRfqXHrmA==", + "sha512": "sha512-03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", "path": "system.security.cryptography.cng/4.3.0", "hashPath": "system.security.cryptography.cng.4.3.0.nupkg.sha512" }, @@ -1223,7 +1223,7 @@ "System.Security.Cryptography.Encoding/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-VUhXu1S0kQqHgjBIHmWE1jfgaSRGqH3rL/pmlQrrKzCg9iQanwNIvE5DQmjx0JXT+eUc+/Y0ARu9XxQKS1/rAQ==", + "sha512": "sha512-1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", "path": "system.security.cryptography.encoding/4.3.0", "hashPath": "system.security.cryptography.encoding.4.3.0.nupkg.sha512" }, @@ -1237,21 +1237,21 @@ "System.Security.Cryptography.Primitives/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-MWGvviIh8HKFpphRZxg7chpN1FkeMBP2O+2+yMDc9/kgs72G7hSjOUlBqg4O/cvNahBRJZ0JtulS5jlpR/OREQ==", + "sha512": "sha512-7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", "path": "system.security.cryptography.primitives/4.3.0", "hashPath": "system.security.cryptography.primitives.4.3.0.nupkg.sha512" }, "System.Security.Cryptography.X509Certificates/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-anCRBHYjC2PtfOm8tbs1x5KZ+2/JXuOj3oWNHt0U50YhLQxZv0hFB4NRNFTJt2i7wyJD/Ow2oJ/ti0nHJa6a6w==", + "sha512": "sha512-t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", "path": "system.security.cryptography.x509certificates/4.3.0", "hashPath": "system.security.cryptography.x509certificates.4.3.0.nupkg.sha512" }, "System.Security.Principal/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-5X8KoaOCAwdojiiJx4/nKiQnEekIIYYSLR62hbtjkTwsX2dnagMlXral0WZ0Bga8f8/m1qaRJkHjCeS/xuUpfw==", + "sha512": "sha512-I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", "path": "system.security.principal/4.3.0", "hashPath": "system.security.principal.4.3.0.nupkg.sha512" }, @@ -1265,35 +1265,35 @@ "System.Text.Encoding/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-58DKIOFSEnQqFEogJ0lqgGFf1Gr9Zzc9/KmYvOR9uW9lf35DHzGNkki+HpPNsdEIHCjKmnQRJF9sBrovQhYhKw==", + "sha512": "sha512-BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", "path": "system.text.encoding/4.3.0", "hashPath": "system.text.encoding.4.3.0.nupkg.sha512" }, "System.Text.RegularExpressions/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-M03moZwpMD9vtWFARtrB0QdKPsSxFqJ8oDrAi6s1jY7R4+2fQcu6chC/ULn6/da9MM93fNOMPGURQAay8N8H5Q==", + "sha512": "sha512-RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", "path": "system.text.regularexpressions/4.3.0", "hashPath": "system.text.regularexpressions.4.3.0.nupkg.sha512" }, "System.Threading/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-BYKL/G9muhpJ2TbkTPeaEUKrZ75oKDtoc7u0itkYqASIvRZijCRLYAPfOPOADxDlqsSAMRRCOP5rebN5Zl7p2g==", + "sha512": "sha512-VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", "path": "system.threading/4.3.0", "hashPath": "system.threading.4.3.0.nupkg.sha512" }, "System.Threading.Overlapped/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-LRcp7Ir4HQ3I7uIhUb8ypaMDw23W1t3GMCA2+yUxTL3HG9ZrVJtLufoK/mF9zfCG2bxuRBf1Bj8FC9mOPddhIg==", + "sha512": "sha512-/iYOUtmEyUgCmFWGS1QIRtQcqkSrdB7Ky56+Qi/EnIdDrgyHMBq2PBVad0qYeEe2VqerfIENLE1/02EHtdOr6Q==", "path": "system.threading.overlapped/4.3.0", "hashPath": "system.threading.overlapped.4.3.0.nupkg.sha512" }, "System.Threading.Tasks/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-eYZRKpn/EpgiXlh8QGXI3qnAWmIdbmjZhqyKIuURD4awwTMBJL56b5ykdWRus9TLKRbvAPAdWiPxFc/VBJ+d9A==", + "sha512": "sha512-LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", "path": "system.threading.tasks/4.3.0", "hashPath": "system.threading.tasks.4.3.0.nupkg.sha512" }, diff --git a/lib/netstandard2.0/ServiceStack.Common.dll b/lib/netstandard2.0/ServiceStack.Common.dll index dfbe2e39..21b8cbd0 100644 Binary files a/lib/netstandard2.0/ServiceStack.Common.dll and b/lib/netstandard2.0/ServiceStack.Common.dll differ diff --git a/lib/netstandard2.0/ServiceStack.Common.xml b/lib/netstandard2.0/ServiceStack.Common.xml index fd4bef29..118833a7 100644 --- a/lib/netstandard2.0/ServiceStack.Common.xml +++ b/lib/netstandard2.0/ServiceStack.Common.xml @@ -114,6 +114,11 @@ + + + Configure ServiceStack.Text JSON Serializer to use Templates JS parsing + + Creates a Console Logger, that logs all messages to: System.Console @@ -124,8 +129,6 @@ Default logger is to Console.WriteLine - - Made public so its testable @@ -163,8 +166,6 @@ Default logger is to System.Diagnostics.Debug.WriteLine - - Made public so its testable diff --git a/lib/netstandard2.0/ServiceStack.Interfaces.deps.json b/lib/netstandard2.0/ServiceStack.Interfaces.deps.json index ee1e2554..3d071984 100644 --- a/lib/netstandard2.0/ServiceStack.Interfaces.deps.json +++ b/lib/netstandard2.0/ServiceStack.Interfaces.deps.json @@ -1,7 +1,7 @@ { "runtimeTarget": { "name": ".NETStandard,Version=v2.0/", - "signature": "ef95db5aa2a8b34fb52677236f3775186d37bec7" + "signature": "d1fe0fd0fac6ef438cfee812c9047bfaadd0b53a" }, "compilationOptions": {}, "targets": { @@ -9,7 +9,7 @@ ".NETStandard,Version=v2.0/": { "ServiceStack.Interfaces/1.0.0": { "dependencies": { - "NETStandard.Library": "2.0.0", + "NETStandard.Library": "2.0.1", "System.Runtime.Serialization.Primitives": "4.3.0" }, "runtime": { @@ -18,7 +18,7 @@ }, "Microsoft.NETCore.Platforms/1.1.0": {}, "Microsoft.NETCore.Targets/1.1.0": {}, - "NETStandard.Library/2.0.0": { + "NETStandard.Library/2.0.1": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0" } @@ -104,84 +104,84 @@ "Microsoft.NETCore.Platforms/1.1.0": { "type": "package", "serviceable": true, - "sha512": "sha512-n2QVe1U/8yMdyowo8Z0C4fWPGTJlkvGnqYBw2DFMMPs9uA6mgVDq/xaklZiUl57FVfJm2WcEu1ybdodsRx/gDQ==", + "sha512": "sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==", "path": "microsoft.netcore.platforms/1.1.0", "hashPath": "microsoft.netcore.platforms.1.1.0.nupkg.sha512" }, "Microsoft.NETCore.Targets/1.1.0": { "type": "package", "serviceable": true, - "sha512": "sha512-vs9c3q7errTVkO1Yh7FoI0eSNvkAIffVpnkygE76Vz8Eo9YtqycOEefrm4iOLMOyMvQIv0Nlw684nt2CDdlzig==", + "sha512": "sha512-aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==", "path": "microsoft.netcore.targets/1.1.0", "hashPath": "microsoft.netcore.targets.1.1.0.nupkg.sha512" }, - "NETStandard.Library/2.0.0": { + "NETStandard.Library/2.0.1": { "type": "package", "serviceable": true, - "sha512": "sha512-7jnbRU+L08FXKMxqUflxEXtVymWvNOrS8yHgu9s6EM8Anr6T/wIX4nZ08j/u3Asz+tCufp3YVwFSEvFTPYmBPA==", - "path": "netstandard.library/2.0.0", - "hashPath": "netstandard.library.2.0.0.nupkg.sha512" + "sha512": "sha512-oA6nwv9MhEKYvLpjZ0ggSpb1g4CQViDVQjLUcDWg598jtvJbpfeP2reqwI1GLW2TbxC/Ml7xL6BBR1HmKPXlTg==", + "path": "netstandard.library/2.0.1", + "hashPath": "netstandard.library.2.0.1.nupkg.sha512" }, "System.Globalization/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-EppWk5+tMzaEzhZkUfaOKuqnC2ECFzQVadE9yBRQtVSWtGOsu9QhfovAhb1Q7FV6X6G9g/a7/8W6ORUjuKxOjQ==", + "sha512": "sha512-kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", "path": "system.globalization/4.3.0", "hashPath": "system.globalization.4.3.0.nupkg.sha512" }, "System.IO/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-/wTullO3iTZcj0tbuz1xIcmk+O0/JmkuxcqwAsTfadEEni+sQUQ36JYlSE5D2mSArRtaE1M3bzB75HgcGCJ+tQ==", + "sha512": "sha512-3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", "path": "system.io/4.3.0", "hashPath": "system.io.4.3.0.nupkg.sha512" }, "System.Reflection/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-3uYB1Y9PY+4B/XtCMGiLfnNP9SJU5vovOLiEGabFqBOtBML8PurmWr0OzPKebsrGviYB1acTKrhE1NAIb+P3mQ==", + "sha512": "sha512-KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", "path": "system.reflection/4.3.0", "hashPath": "system.reflection.4.3.0.nupkg.sha512" }, "System.Reflection.Primitives/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-IWUmJcoqCpvsIn0Txobe+5idI096N+08jM3pnbVW1QWBDWQcSZqfQ7nNpMv/eKexrdlODAup0nd9dMRzbfPgSA==", + "sha512": "sha512-5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", "path": "system.reflection.primitives/4.3.0", "hashPath": "system.reflection.primitives.4.3.0.nupkg.sha512" }, "System.Resources.ResourceManager/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-H6KDV29RfZ623UnvI4goq8doHylg0GjNiHfSLuzLibGHmcdXiw1XgCq/gd/LwPvnVgJUcJ9tNKcDnYiDaWm7hA==", + "sha512": "sha512-/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", "path": "system.resources.resourcemanager/4.3.0", "hashPath": "system.resources.resourcemanager.4.3.0.nupkg.sha512" }, "System.Runtime/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-iD01AV/eij/6iIa2UZHXayeOQoyjjP48pSIpP2bgxDVwTftELekKHJmsCTE7kD0BobeK6O2+RzQownNc9Yro9w==", + "sha512": "sha512-JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", "path": "system.runtime/4.3.0", "hashPath": "system.runtime.4.3.0.nupkg.sha512" }, "System.Runtime.Serialization.Primitives/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-skc/xdfE6A4vKZL/992b0Jd+4iAye3CTmMitItDzOk6r8hpo+8bDLqMX9brgSg0NZyNE9UI/P8nHRWQUjvKYdQ==", + "sha512": "sha512-Wz+0KOukJGAlXjtKr+5Xpuxf8+c8739RI1C+A2BoQZT+wMCCoMDDdO8/4IRHfaVINqL78GO8dW8G2lW/e45Mcw==", "path": "system.runtime.serialization.primitives/4.3.0", "hashPath": "system.runtime.serialization.primitives.4.3.0.nupkg.sha512" }, "System.Text.Encoding/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-58DKIOFSEnQqFEogJ0lqgGFf1Gr9Zzc9/KmYvOR9uW9lf35DHzGNkki+HpPNsdEIHCjKmnQRJF9sBrovQhYhKw==", + "sha512": "sha512-BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", "path": "system.text.encoding/4.3.0", "hashPath": "system.text.encoding.4.3.0.nupkg.sha512" }, "System.Threading.Tasks/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-eYZRKpn/EpgiXlh8QGXI3qnAWmIdbmjZhqyKIuURD4awwTMBJL56b5ykdWRus9TLKRbvAPAdWiPxFc/VBJ+d9A==", + "sha512": "sha512-LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", "path": "system.threading.tasks/4.3.0", "hashPath": "system.threading.tasks.4.3.0.nupkg.sha512" } diff --git a/lib/netstandard2.0/ServiceStack.Interfaces.dll b/lib/netstandard2.0/ServiceStack.Interfaces.dll index e760cb2d..e86243e8 100644 Binary files a/lib/netstandard2.0/ServiceStack.Interfaces.dll and b/lib/netstandard2.0/ServiceStack.Interfaces.dll differ diff --git a/lib/netstandard2.0/ServiceStack.Interfaces.xml b/lib/netstandard2.0/ServiceStack.Interfaces.xml index fe29cfe7..9b35bf4a 100644 --- a/lib/netstandard2.0/ServiceStack.Interfaces.xml +++ b/lib/netstandard2.0/ServiceStack.Interfaces.xml @@ -445,7 +445,24 @@ Resolve a dependency from the AppHost's IOC - + + + + + + Provides a common interface for Settings providers such as + ConfigurationManager or Azure's RoleEnvironment. The only + requirement is that if the implementation cannot find the + specified key, the return value must be null + + The key for the setting + The string value of the specified key, or null if the key + was invalid + + + + Return all keys in this configuration source. + @@ -518,6 +535,13 @@ Range Key Attribute used to specify which property is the RangeKey, e.g. in DynamoDb. + + + ReturnAttribute + Use to indicate that a property should be included in the + returning/output clause of INSERT sql sentences + + Used to indicate that property is a row version incremented automatically by the database @@ -918,64 +942,45 @@ - Logging API for this library. You can inject your own implementation otherwise - will use the DebugLogFactory to write to System.Diagnostics.Debug + Provides access to loggers. This class cannot be inherited. - Gets or sets the log factory. - Use this to override the factory that is used to create loggers + Gets or sets the log factory used to create loggers. The default value is + . - - - Gets the logger. - - - - - Gets the logger. - - - + - Default logger is to System.Diagnostics.Debug.Print - - Made public so its testable + Creates a empty Logger, that does not log anything. - + - Initializes a new instance of the class. + Initializes a new instance of the class. - + - Initializes a new instance of the class. + Initializes a new instance of the class. - + Logs the specified message. - + Logs the format. - + Logs the specified message. - - - - Creates a Debug Logger, that logs all messages to: System.Diagnostics.Debug - - Made public so its testable - + The message. @@ -983,22 +988,6 @@ Made public so its testable - - - Logs the specified message. - - - - - Logs the format. - - - - - Logs the specified message. - - The message. - Creates a test Logger, that stores all log messages in a member list @@ -1015,7 +1004,7 @@ Initializes a new instance of the class. - The type. + The type. @@ -2286,124 +2275,5 @@ Executes the DTO request with the current HttpRequest and option to Execute Request/Response Filters. - - - Allow the registration of user-defined routes for services - - - - - Maps the specified REST path to the specified request DTO. - - The type of request DTO to map - the path to. - The path to map the request DTO to. - See RouteAttribute.Path - for details on the correct format. - The same instance; - never . - - - - Maps the specified REST path to the specified request DTO, and - specifies the HTTP verbs supported by the path. - - The type of request DTO to map - the path to. - The path to map the request DTO to. - See RouteAttribute.Path - for details on the correct format. - - The comma-delimited list of HTTP verbs supported by the path, - such as "GET,PUT,DELETE". Specify empty or - to indicate that all verbs are supported. - - The same instance; - never . - - - - Maps the specified REST path to the specified request DTO, - specifies the HTTP verbs supported by the path, and indicates - the default MIME type of the returned response. - - - The type of request DTO to map the path to. - - The path to map the request DTO to. - See RouteAttribute.Path - for details on the correct format. - - The comma-delimited list of HTTP verbs supported by the path, - such as "GET,PUT,DELETE". - - The same instance; - never . - - - - Maps the specified REST path to the specified request DTO, - specifies the HTTP verbs supported by the path, and indicates - the default MIME type of the returned response. - - - Used to rank the precedences of route definitions in reverse routing. - i.e. Priorities below 0 are auto-generated have less precedence. - - - - - Maps the specified REST path to the specified request DTO, - specifies the HTTP verbs supported by the path, and indicates - the default MIME type of the returned response. - - - The type of request DTO to map the path to. - - The path to map the request DTO to. - See RouteAttribute.Path - for details on the correct format. - - The comma-delimited list of HTTP verbs supported by the path, - such as "GET,PUT,DELETE". - - - The short summary of what the REST does. - - - The longer text to explain the behaviour of the REST. - - The same instance; - never . - - - - Maps the specified REST path to the specified request DTO, - specifies the HTTP verbs supported by the path, and indicates - the default MIME type of the returned response. - - - The type of request DTO to map the path to. - - The path to map the request DTO to. - See RouteAttribute.Path - for details on the correct format. - - The comma-delimited list of HTTP verbs supported by the path, - such as "GET,PUT,DELETE". - - - The short summary of what the REST does. - - - The longer text to explain the behaviour of the REST. - - - Must match rule defined in Config.RequestRules or Regex expression with format: - "{IHttpRequest.Field} =~ {pattern}", e.g "PathInfo =~ \/[0-9]+$" - - The same instance; - never . - diff --git a/lib/netstandard2.0/ServiceStack.Server.deps.json b/lib/netstandard2.0/ServiceStack.Server.deps.json index fe2b65ff..2ae95246 100644 --- a/lib/netstandard2.0/ServiceStack.Server.deps.json +++ b/lib/netstandard2.0/ServiceStack.Server.deps.json @@ -1,7 +1,7 @@ { "runtimeTarget": { "name": ".NETStandard,Version=v2.0/", - "signature": "cb746168e20a22023ebe48bd1d757550948fcb44" + "signature": "1890b72ef10d50715d03ed60d2e5d48d23ea1e1b" }, "compilationOptions": {}, "targets": { @@ -9,7 +9,7 @@ ".NETStandard,Version=v2.0/": { "ServiceStack.Server/1.0.0": { "dependencies": { - "NETStandard.Library": "2.0.0", + "NETStandard.Library": "2.0.1", "ServiceStack": "1.0.0", "ServiceStack.Client": "1.0.0", "ServiceStack.Common": "1.0.0", @@ -194,7 +194,7 @@ "System.Runtime": "4.3.0" } }, - "NETStandard.Library/2.0.0": { + "NETStandard.Library/2.0.1": { "dependencies": { "Microsoft.NETCore.Platforms": "2.0.0" } @@ -1046,7 +1046,6 @@ "Microsoft.AspNetCore.Http.Extensions": "2.0.0", "Microsoft.Extensions.Configuration.Binder": "2.0.0", "Microsoft.Extensions.DependencyInjection.Abstractions": "2.0.0", - "Microsoft.Extensions.Logging.Abstractions": "2.0.0", "Microsoft.Extensions.Primitives": "2.0.0", "ServiceStack.Client": "1.0.0", "ServiceStack.Common": "1.0.0", @@ -1269,42 +1268,42 @@ "Microsoft.NETCore.Targets/1.1.0": { "type": "package", "serviceable": true, - "sha512": "sha512-vs9c3q7errTVkO1Yh7FoI0eSNvkAIffVpnkygE76Vz8Eo9YtqycOEefrm4iOLMOyMvQIv0Nlw684nt2CDdlzig==", + "sha512": "sha512-aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==", "path": "microsoft.netcore.targets/1.1.0", "hashPath": "microsoft.netcore.targets.1.1.0.nupkg.sha512" }, "Microsoft.Win32.Primitives/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-SQ8c0zlY8aw8GZnA8pkKxpE5yDoQ0f123v6Aci8hSrrk9pJWtPgDcdn3KeHZlBtX6YefOUGzJ6Kb+WdwFrooFQ==", + "sha512": "sha512-9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", "path": "microsoft.win32.primitives/4.3.0", "hashPath": "microsoft.win32.primitives.4.3.0.nupkg.sha512" }, - "NETStandard.Library/2.0.0": { + "NETStandard.Library/2.0.1": { "type": "package", "serviceable": true, - "sha512": "sha512-7jnbRU+L08FXKMxqUflxEXtVymWvNOrS8yHgu9s6EM8Anr6T/wIX4nZ08j/u3Asz+tCufp3YVwFSEvFTPYmBPA==", - "path": "netstandard.library/2.0.0", - "hashPath": "netstandard.library.2.0.0.nupkg.sha512" + "sha512": "sha512-oA6nwv9MhEKYvLpjZ0ggSpb1g4CQViDVQjLUcDWg598jtvJbpfeP2reqwI1GLW2TbxC/Ml7xL6BBR1HmKPXlTg==", + "path": "netstandard.library/2.0.1", + "hashPath": "netstandard.library.2.0.1.nupkg.sha512" }, "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-XrmXcVFIyqVN6VRAC8NSVkQJ+c87MzDmb6b9+TgzXDmjJrlz5zx0v3RyrLy1Cs3CAWMk5bKQejtd1T0QKnEJUw==", + "sha512": "sha512-HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==", "path": "runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-r15mfA0DanSK+3Z3FyVJxjbTeDnSI8TvXofwii/3dqxHYTAv9Ke7duxTjq8Bo/HUoMOJ0eDbRXjIQ5RvUsJ+Jw==", + "sha512": "sha512-+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==", "path": "runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-LtkpYGXuZ9olCJH/Z7nWBa5nImH9EnRyloaZeHBeyhDRxoTNe4pZBhwR4ta7nHO9UI/82iWlriOL4fdWNNk4wA==", + "sha512": "sha512-c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==", "path": "runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, @@ -1332,21 +1331,21 @@ "runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-rrVECcoOWyR74djO91XRlxJ+juh/vZsliR6iARqjAFaBKlyPwLJd4aQ5M8tdBJoHLTNTj9QHJfqsSc4Wml3zSQ==", + "sha512": "sha512-NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", "path": "runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-7f8At1xCDhxJuQ1LcLUAa2dK2XZ+HCoEPhIPh9u9pSDO897XA5NP7RnvXYZOEgL+U+hBNvcbefo7OVQluyTLgw==", + "sha512": "sha512-b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==", "path": "runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-qHNQLPqgKifKEOIARxjZUowkJ40aEoSH9VpjDjSFzHRnXH8T+P8zu/FoYFOamn9dqkBzOt4JPAfZaQZQJtxBNA==", + "sha512": "sha512-KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==", "path": "runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, @@ -1360,35 +1359,35 @@ "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-irmuaiZdNhZu/i6tDDUiZpPrOect9uK0MR4xDkjjY4zWoz4SDXskVPlsD85x1MCxJP5rCAq4wUOWIEeprl2whw==", + "sha512": "sha512-X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==", "path": "runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-gahlletBLrXsMaGBytw1e2whFg+fd9TR0vzR244htAOfp2UHy1XuEdpjqZuUknG8X0r6C8Akk024KYhj9ddmTQ==", + "sha512": "sha512-nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==", "path": "runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-7HajMzjMVtd0+P5HX+Chdnr505E2hKYAq/oTccnEqMRhGzcpWJN0KhPVBRmU7Qy69jdAViFRtyZqUxoBHLkgzw==", + "sha512": "sha512-ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==", "path": "runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-LyZBQqsZ/F4g5itL7TCSotirRSk5hHwrQJomIoasWQnAwCPGGw2p8n/s5Hes8HhjVcypK01k9wMmPw9N+uv+5g==", + "sha512": "sha512-I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==", "path": "runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-ACfI7jQqtQYeO9vJdj+QYGWyoqrNTkFz33GVXPuQvM94/2gwiHkigyA9LZxsqNBHJQ8yPV7xiIQ8ac1SEOLqKQ==", + "sha512": "sha512-VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==", "path": "runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl/4.3.0", "hashPath": "runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" }, @@ -1402,28 +1401,28 @@ "System.Collections/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-1AJbSB9pKc+qhGKTawxCUTAg9lUA8onQMST9tNrIpFit1H2T9Yk1nkW3Gp/lncSQIJ5+ZBlOoL9xjQMPcEmmYw==", + "sha512": "sha512-3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", "path": "system.collections/4.3.0", "hashPath": "system.collections.4.3.0.nupkg.sha512" }, "System.Collections.Concurrent/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-09xY/+b7p5ioslTtGcRxjnzSa06YPihNU6qOE/hWIQkqUV7c/Qs6M/URGkIEbCCALkaaHOI/4ONkoG6jmc9HLg==", + "sha512": "sha512-ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", "path": "system.collections.concurrent/4.3.0", "hashPath": "system.collections.concurrent.4.3.0.nupkg.sha512" }, "System.Collections.NonGeneric/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-ASiGTKJqauqU1YQgHzEo4NL6DJKADvjsTZrNVkTVP9slb5BeMH5F74nIczdJu70jXScELJpQYMhXX+gNVKIlew==", + "sha512": "sha512-prtjIEMhGUnQq6RnPEYLpFt8AtLbp9yq2zxOSrY7KJJZrw25Fi97IzBqY7iqssbM61Ek5b8f3MG/sG1N2sN5KA==", "path": "system.collections.nongeneric/4.3.0", "hashPath": "system.collections.nongeneric.4.3.0.nupkg.sha512" }, "System.Collections.Specialized/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-jQOfOX7848z8dPZEQHPyYwlP5975iTTQ1VczInTpUOe75atEwaoPYDAowLd/OuwFOX2LDLNw0xpLS5enCOXdug==", + "sha512": "sha512-Epx8PoVZR0iuOnJJDzp7pWvdfMMOAvpUo95pC4ScH2mJuXkKA2Y4aR3cG9qt2klHgSons1WFh4kcGW7cSXvrxg==", "path": "system.collections.specialized/4.3.0", "hashPath": "system.collections.specialized.4.3.0.nupkg.sha512" }, @@ -1451,84 +1450,84 @@ "System.Diagnostics.Debug/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-RPkucWK4gQRmV0XUMxXhUir6sJGy9LSDIKm7pBM2c1hBFFFCvwFhFJcLZd81NCpbcHfwXksO/kMzSXUXM2joDQ==", + "sha512": "sha512-ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", "path": "system.diagnostics.debug/4.3.0", "hashPath": "system.diagnostics.debug.4.3.0.nupkg.sha512" }, "System.Diagnostics.DiagnosticSource/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-XjgqzlOJE8H1HhdhVCiK3vu4fen2xwbbe7lEnohBP+xoBN85mFAo78xi5cxkzjlZ1Jup0WLoZc7XpxMnjfbMBQ==", + "sha512": "sha512-tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", "path": "system.diagnostics.diagnosticsource/4.3.0", "hashPath": "system.diagnostics.diagnosticsource.4.3.0.nupkg.sha512" }, "System.Diagnostics.Tracing/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-6r8Ez0r0tyGFBheTZYjkU4qpLJZnhVwAFDDF6GVkyge9jeMFVK6Uu7JXrGTeE2m09GcRNS5STJvsX1vb+Omacg==", + "sha512": "sha512-rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", "path": "system.diagnostics.tracing/4.3.0", "hashPath": "system.diagnostics.tracing.4.3.0.nupkg.sha512" }, "System.Dynamic.Runtime/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-Kiu80W6wgVYPLJz6R8kh8GacUuPIDmvew2GaWmKsQVi6DaYKDneg9R1vmAcXDf5hKj1qPzgmFloRzFbUl9jHeg==", + "sha512": "sha512-SNVi1E/vfWUAs/WYKhE9+qlS6KqK0YVhnlT0HQtr8pMIA8YX3lwy3uPMownDwdYISBdmAF/2holEIldVp85Wag==", "path": "system.dynamic.runtime/4.3.0", "hashPath": "system.dynamic.runtime.4.3.0.nupkg.sha512" }, "System.Globalization/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-EppWk5+tMzaEzhZkUfaOKuqnC2ECFzQVadE9yBRQtVSWtGOsu9QhfovAhb1Q7FV6X6G9g/a7/8W6ORUjuKxOjQ==", + "sha512": "sha512-kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", "path": "system.globalization/4.3.0", "hashPath": "system.globalization.4.3.0.nupkg.sha512" }, "System.Globalization.Calendars/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-31GxAA4aEL8efY3LcrAbaL52/x5eMREK/uH+QTB62bLG9IeydmvXECS4BYHiyCnTco97YhGkO9CsHJynwPtNUA==", + "sha512": "sha512-GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", "path": "system.globalization.calendars/4.3.0", "hashPath": "system.globalization.calendars.4.3.0.nupkg.sha512" }, "System.Globalization.Extensions/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-Pj6LfslnZNSSZm/8X03IlxU1zA9Zintjviv4GStB0WUxYu2puDwm7qvlwzGy7/FW6Qa9xzmF/IVN0wpvmYN9Lg==", + "sha512": "sha512-FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", "path": "system.globalization.extensions/4.3.0", "hashPath": "system.globalization.extensions.4.3.0.nupkg.sha512" }, "System.IO/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-/wTullO3iTZcj0tbuz1xIcmk+O0/JmkuxcqwAsTfadEEni+sQUQ36JYlSE5D2mSArRtaE1M3bzB75HgcGCJ+tQ==", + "sha512": "sha512-3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", "path": "system.io/4.3.0", "hashPath": "system.io.4.3.0.nupkg.sha512" }, "System.IO.FileSystem/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-bDwE6iQKXXWl0/xvCInd5ao9TCz10XprzDLprOWR+6I3stD082KpbAK5goMsEbM4gXWfT0Im5THeAsZaU8bBlQ==", + "sha512": "sha512-3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", "path": "system.io.filesystem/4.3.0", "hashPath": "system.io.filesystem.4.3.0.nupkg.sha512" }, "System.IO.FileSystem.Primitives/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-fYutRsdDDthwR0+LP7gSrwz50TJFAbQNtQYPXfdjvvVVdJWqW+sGANq338ytNkYjR3eFN4w04hEj5hovZjZQ2Q==", + "sha512": "sha512-6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", "path": "system.io.filesystem.primitives/4.3.0", "hashPath": "system.io.filesystem.primitives.4.3.0.nupkg.sha512" }, "System.Linq/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-JPPJ2d6FK9Z+HcWp8oXjd6ZcLk94OIq+Jgoi5hq62lz+VOLIaE7MXSBO1YVi1w+3RJJYEMDqtIJwQ1BgpuKKsA==", + "sha512": "sha512-5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", "path": "system.linq/4.3.0", "hashPath": "system.linq.4.3.0.nupkg.sha512" }, "System.Linq.Expressions/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-mvEeo9a4GGe/UdvjLumBajn21DRjZkpcm/HMeLAq5b0E00DKn/f7NoY4nDBdgh6E2o88YTMVtKSbcANvV6QZGg==", + "sha512": "sha512-PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", "path": "system.linq.expressions/4.3.0", "hashPath": "system.linq.expressions.4.3.0.nupkg.sha512" }, @@ -1542,7 +1541,7 @@ "System.Net.Http/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-iz1MgqiwRi9uIZGrj7TYWTM6RSiC/6qp3lBMs05Ko1pXQ3fmpZK67Iqj0Vj60YjqYLggDLIkhpo4qV7B/Ms4HQ==", + "sha512": "sha512-sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", "path": "system.net.http/4.3.0", "hashPath": "system.net.http.4.3.0.nupkg.sha512" }, @@ -1563,7 +1562,7 @@ "System.Net.Primitives/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-AaMayOmbnglWGOkaNbza9FhBNtYRn4zNG8Nnu7Hit+KYA06noogYjz6asLXmF3PpfHjFsMORlyG7nKyGJPW96A==", + "sha512": "sha512-qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", "path": "system.net.primitives/4.3.0", "hashPath": "system.net.primitives.4.3.0.nupkg.sha512" }, @@ -1577,7 +1576,7 @@ "System.Net.Sockets/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-IBP4eAQFdjvJfw+SwegrabtbiHSkGf18N9Nt5YVgT5lKUfulv/HhO3jTVbq14ofQYmIbkBwKzeDkUKb3tRzHKg==", + "sha512": "sha512-m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", "path": "system.net.sockets/4.3.0", "hashPath": "system.net.sockets.4.3.0.nupkg.sha512" }, @@ -1591,7 +1590,7 @@ "System.ObjectModel/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-f9SGFzGsZekQyy3dfgrODqmEB8crsCJTvsUa6pnMnjRwXaQXz0OG3l20iu7SsPFC6mQLWydA5NA5BzeRYlacdw==", + "sha512": "sha512-bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", "path": "system.objectmodel/4.3.0", "hashPath": "system.objectmodel.4.3.0.nupkg.sha512" }, @@ -1605,7 +1604,7 @@ "System.Reflection/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-3uYB1Y9PY+4B/XtCMGiLfnNP9SJU5vovOLiEGabFqBOtBML8PurmWr0OzPKebsrGviYB1acTKrhE1NAIb+P3mQ==", + "sha512": "sha512-KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", "path": "system.reflection/4.3.0", "hashPath": "system.reflection.4.3.0.nupkg.sha512" }, @@ -1619,56 +1618,56 @@ "System.Reflection.Emit/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-GHctkl5J3qRgAvXxc+cQXbYfrw0S7kZswbTbbFgSjvGU/KhTRmH+ZpMNToI8NA/nLCMl0EAgbWpIfp74EnYOJw==", + "sha512": "sha512-228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", "path": "system.reflection.emit/4.3.0", "hashPath": "system.reflection.emit.4.3.0.nupkg.sha512" }, "System.Reflection.Emit.ILGeneration/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-lqTxoVZbRVP84GyXyxOUeB2PdOzrTLAMluaxIkp94WURhQMAKQKlQd5YATL+UnTDtxDzd9HZDKjF7xl2jjQEnA==", + "sha512": "sha512-59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", "path": "system.reflection.emit.ilgeneration/4.3.0", "hashPath": "system.reflection.emit.ilgeneration.4.3.0.nupkg.sha512" }, "System.Reflection.Emit.Lightweight/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-LvX8HS0d2l8lNam0RpJgH3gQM6nSSP3crcE6XlMYCBvhTv41HkZbroA3YsCyC21Eu3hsZu1jJRTxmgsD7dww2g==", + "sha512": "sha512-oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", "path": "system.reflection.emit.lightweight/4.3.0", "hashPath": "system.reflection.emit.lightweight.4.3.0.nupkg.sha512" }, "System.Reflection.Extensions/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-I2lC6UhAtrIm6D52Mn9dNys56s9Mus94e03FMU/RRqJvLyQ4AyRIPa+5oU73wyQ+pKMFUJU5PeS7nURr6DHG2A==", + "sha512": "sha512-rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", "path": "system.reflection.extensions/4.3.0", "hashPath": "system.reflection.extensions.4.3.0.nupkg.sha512" }, "System.Reflection.Primitives/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-IWUmJcoqCpvsIn0Txobe+5idI096N+08jM3pnbVW1QWBDWQcSZqfQ7nNpMv/eKexrdlODAup0nd9dMRzbfPgSA==", + "sha512": "sha512-5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", "path": "system.reflection.primitives/4.3.0", "hashPath": "system.reflection.primitives.4.3.0.nupkg.sha512" }, "System.Reflection.TypeExtensions/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-bddVPkbwJzLo0+FzvsoEunOBODGVEJ5JRFU1Xjo4MxhCUrpO7JJ5CJCFx7RXIrBtsAUH5Jh94v3pWEM/MLziJw==", + "sha512": "sha512-7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", "path": "system.reflection.typeextensions/4.3.0", "hashPath": "system.reflection.typeextensions.4.3.0.nupkg.sha512" }, "System.Resources.ResourceManager/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-H6KDV29RfZ623UnvI4goq8doHylg0GjNiHfSLuzLibGHmcdXiw1XgCq/gd/LwPvnVgJUcJ9tNKcDnYiDaWm7hA==", + "sha512": "sha512-/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", "path": "system.resources.resourcemanager/4.3.0", "hashPath": "system.resources.resourcemanager.4.3.0.nupkg.sha512" }, "System.Runtime/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-iD01AV/eij/6iIa2UZHXayeOQoyjjP48pSIpP2bgxDVwTftELekKHJmsCTE7kD0BobeK6O2+RzQownNc9Yro9w==", + "sha512": "sha512-JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", "path": "system.runtime/4.3.0", "hashPath": "system.runtime.4.3.0.nupkg.sha512" }, @@ -1682,49 +1681,49 @@ "System.Runtime.Extensions/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-PZGJVsgBNSBnKUF4N9e36W+3ZO7tJ5OtUoZP7mqfKUFwplBShDaGEgehH6j6cuOmtbaZw+N/97cl+GgDSwt0YQ==", + "sha512": "sha512-guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", "path": "system.runtime.extensions/4.3.0", "hashPath": "system.runtime.extensions.4.3.0.nupkg.sha512" }, "System.Runtime.Handles/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-4Psk9sl0VLSE9uPBSeZBJKlf8qQET8+cf8Y0DDyoCUiQ5jp93knJQWfuAJaRxb2Ryar8crjSlMzsUz/jp9aQ1w==", + "sha512": "sha512-OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", "path": "system.runtime.handles/4.3.0", "hashPath": "system.runtime.handles.4.3.0.nupkg.sha512" }, "System.Runtime.InteropServices/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-AFYM6PJsqZVtVWE6jlERrG65+LHOoaYGW6D/TFKvMIwZ4tXgs8qLtGY1jQXrgLABvJMKxfR8Y+WpKR2C9R4h3Q==", + "sha512": "sha512-uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", "path": "system.runtime.interopservices/4.3.0", "hashPath": "system.runtime.interopservices.4.3.0.nupkg.sha512" }, "System.Runtime.Numerics/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-wpA0s4R+cb/6dd6AxzwkQ8A9K9kc/A41DQdpbyNTrV2syqOJk/0LUInhOEgFaarcejrApCpTfvHP4QhaeUC2Uw==", + "sha512": "sha512-yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", "path": "system.runtime.numerics/4.3.0", "hashPath": "system.runtime.numerics.4.3.0.nupkg.sha512" }, "System.Runtime.Serialization.Primitives/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-skc/xdfE6A4vKZL/992b0Jd+4iAye3CTmMitItDzOk6r8hpo+8bDLqMX9brgSg0NZyNE9UI/P8nHRWQUjvKYdQ==", + "sha512": "sha512-Wz+0KOukJGAlXjtKr+5Xpuxf8+c8739RI1C+A2BoQZT+wMCCoMDDdO8/4IRHfaVINqL78GO8dW8G2lW/e45Mcw==", "path": "system.runtime.serialization.primitives/4.3.0", "hashPath": "system.runtime.serialization.primitives.4.3.0.nupkg.sha512" }, "System.Security.Cryptography.Algorithms/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-YQ5ql2EzgxUp6vI+jHxo9lmcH0Iy1RsmxtggtbJ1jy8rt+W3uc7t1iFQri0zNM3BJyCw3P31TF8jxWpxcc1aPQ==", + "sha512": "sha512-W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", "path": "system.security.cryptography.algorithms/4.3.0", "hashPath": "system.security.cryptography.algorithms.4.3.0.nupkg.sha512" }, "System.Security.Cryptography.Cng/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-gmloRV7S66IH/jYbvnaUhaDwMSug1hWjuswsZuZPjmj94SMH/DRHQHU+4zSIQXEhCwRh9zMIQahY6nRfqXHrmA==", + "sha512": "sha512-03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", "path": "system.security.cryptography.cng/4.3.0", "hashPath": "system.security.cryptography.cng.4.3.0.nupkg.sha512" }, @@ -1738,7 +1737,7 @@ "System.Security.Cryptography.Encoding/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-VUhXu1S0kQqHgjBIHmWE1jfgaSRGqH3rL/pmlQrrKzCg9iQanwNIvE5DQmjx0JXT+eUc+/Y0ARu9XxQKS1/rAQ==", + "sha512": "sha512-1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", "path": "system.security.cryptography.encoding/4.3.0", "hashPath": "system.security.cryptography.encoding.4.3.0.nupkg.sha512" }, @@ -1752,14 +1751,14 @@ "System.Security.Cryptography.Primitives/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-MWGvviIh8HKFpphRZxg7chpN1FkeMBP2O+2+yMDc9/kgs72G7hSjOUlBqg4O/cvNahBRJZ0JtulS5jlpR/OREQ==", + "sha512": "sha512-7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", "path": "system.security.cryptography.primitives/4.3.0", "hashPath": "system.security.cryptography.primitives.4.3.0.nupkg.sha512" }, "System.Security.Cryptography.X509Certificates/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-anCRBHYjC2PtfOm8tbs1x5KZ+2/JXuOj3oWNHt0U50YhLQxZv0hFB4NRNFTJt2i7wyJD/Ow2oJ/ti0nHJa6a6w==", + "sha512": "sha512-t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", "path": "system.security.cryptography.x509certificates/4.3.0", "hashPath": "system.security.cryptography.x509certificates.4.3.0.nupkg.sha512" }, @@ -1780,14 +1779,14 @@ "System.Text.Encoding/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-58DKIOFSEnQqFEogJ0lqgGFf1Gr9Zzc9/KmYvOR9uW9lf35DHzGNkki+HpPNsdEIHCjKmnQRJF9sBrovQhYhKw==", + "sha512": "sha512-BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", "path": "system.text.encoding/4.3.0", "hashPath": "system.text.encoding.4.3.0.nupkg.sha512" }, "System.Text.Encoding.Extensions/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-wSIplxLLihOx5TGFa8Nn98eWAmkZbBdslSviLvwfUiqiUEUEuqrsbrV2hE9haNf1BZbbvM4ClrcJ58KUQk96pw==", + "sha512": "sha512-YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", "path": "system.text.encoding.extensions/4.3.0", "hashPath": "system.text.encoding.extensions.4.3.0.nupkg.sha512" }, @@ -1801,35 +1800,35 @@ "System.Text.RegularExpressions/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-M03moZwpMD9vtWFARtrB0QdKPsSxFqJ8oDrAi6s1jY7R4+2fQcu6chC/ULn6/da9MM93fNOMPGURQAay8N8H5Q==", + "sha512": "sha512-RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", "path": "system.text.regularexpressions/4.3.0", "hashPath": "system.text.regularexpressions.4.3.0.nupkg.sha512" }, "System.Threading/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-BYKL/G9muhpJ2TbkTPeaEUKrZ75oKDtoc7u0itkYqASIvRZijCRLYAPfOPOADxDlqsSAMRRCOP5rebN5Zl7p2g==", + "sha512": "sha512-VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", "path": "system.threading/4.3.0", "hashPath": "system.threading.4.3.0.nupkg.sha512" }, "System.Threading.Overlapped/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-LRcp7Ir4HQ3I7uIhUb8ypaMDw23W1t3GMCA2+yUxTL3HG9ZrVJtLufoK/mF9zfCG2bxuRBf1Bj8FC9mOPddhIg==", + "sha512": "sha512-/iYOUtmEyUgCmFWGS1QIRtQcqkSrdB7Ky56+Qi/EnIdDrgyHMBq2PBVad0qYeEe2VqerfIENLE1/02EHtdOr6Q==", "path": "system.threading.overlapped/4.3.0", "hashPath": "system.threading.overlapped.4.3.0.nupkg.sha512" }, "System.Threading.Tasks/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-eYZRKpn/EpgiXlh8QGXI3qnAWmIdbmjZhqyKIuURD4awwTMBJL56b5ykdWRus9TLKRbvAPAdWiPxFc/VBJ+d9A==", + "sha512": "sha512-LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", "path": "system.threading.tasks/4.3.0", "hashPath": "system.threading.tasks.4.3.0.nupkg.sha512" }, "System.Threading.Tasks.Extensions/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-kW7nIBjfW8DzVkmOcckgGMirxC2oDr0/v4ZIokUop6gFCudQVEGR9GoCGstVCSiuN1P9j+FlH9YX2OXxv2dV1A==", + "sha512": "sha512-npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", "path": "system.threading.tasks.extensions/4.3.0", "hashPath": "system.threading.tasks.extensions.4.3.0.nupkg.sha512" }, @@ -1850,21 +1849,21 @@ "System.Xml.ReaderWriter/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-4ghUccqnWLWIYzuYX84Vx6T7/1MSvdAmmqlyMK1DoRyvO2wYq1v5QMsAKjdY1h4iH5nkOh6a50cio/qY9VgRSw==", + "sha512": "sha512-GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", "path": "system.xml.readerwriter/4.3.0", "hashPath": "system.xml.readerwriter.4.3.0.nupkg.sha512" }, "System.Xml.XmlDocument/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-ljbrPCAXEu5ijirKRxzH9eA3+/IhCpyv321JSepyUdM0fCPGo/910BXt/KwMVruLKN8dkIOUdYm2LlqBuIRn1Q==", + "sha512": "sha512-lJ8AxvkX7GQxpC6GFCeBj8ThYVyQczx2+f/cWHJU8tjS7YfI6Cv6bon70jVEgs2CiFbmmM8b9j1oZVx0dSI2Ww==", "path": "system.xml.xmldocument/4.3.0", "hashPath": "system.xml.xmldocument.4.3.0.nupkg.sha512" }, "System.Xml.XmlSerializer/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-pXIz8nVP9y1uc3WCyTdl5LDesu2M6BDlMF7+JZS72oqKSZHXd2Q9PwepKFsFryWDMQEAjkjmyDEFu4FISdYfCw==", + "sha512": "sha512-ZHKYxQIWOh7OtWGCTY+aztU2uSfjUN+P2GyUU+ZwvHzHQOYhLmyuvwmmR1EzmhcnrTFtF3pEM3XXI2KUaboz1Q==", "path": "system.xml.xmlserializer/4.3.0", "hashPath": "system.xml.xmlserializer.4.3.0.nupkg.sha512" }, diff --git a/lib/netstandard2.0/ServiceStack.Server.dll b/lib/netstandard2.0/ServiceStack.Server.dll index 082d63c8..16ca23b5 100644 Binary files a/lib/netstandard2.0/ServiceStack.Server.dll and b/lib/netstandard2.0/ServiceStack.Server.dll differ diff --git a/lib/netstandard2.0/ServiceStack.Text.deps.json b/lib/netstandard2.0/ServiceStack.Text.deps.json index 1f45f075..4c8897c2 100644 --- a/lib/netstandard2.0/ServiceStack.Text.deps.json +++ b/lib/netstandard2.0/ServiceStack.Text.deps.json @@ -1,17 +1,17 @@ { "runtimeTarget": { "name": ".NETStandard,Version=v2.0/", - "signature": "3adc12bffbd422090fc8d06f36917353721f6fe5" + "signature": "269c10cc22c054b838cf51d8715c61016217b027" }, "compilationOptions": {}, "targets": { ".NETStandard,Version=v2.0": {}, ".NETStandard,Version=v2.0/": { - "ServiceStack.Text/1.0.0": { + "ServiceStack.Text/5.1.0": { "dependencies": { "Microsoft.CSharp": "4.4.1", "Microsoft.Extensions.Primitives": "2.0.0", - "NETStandard.Library": "2.0.0", + "NETStandard.Library": "2.0.1", "System.Reflection.Emit": "4.3.0", "System.Reflection.Emit.Lightweight": "4.3.0", "System.Runtime": "4.3.0" @@ -35,7 +35,7 @@ }, "Microsoft.NETCore.Platforms/1.1.0": {}, "Microsoft.NETCore.Targets/1.1.0": {}, - "NETStandard.Library/2.0.0": { + "NETStandard.Library/2.0.1": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0" } @@ -126,7 +126,7 @@ } }, "libraries": { - "ServiceStack.Text/1.0.0": { + "ServiceStack.Text/5.1.0": { "type": "project", "serviceable": false, "sha512": "" @@ -148,70 +148,70 @@ "Microsoft.NETCore.Platforms/1.1.0": { "type": "package", "serviceable": true, - "sha512": "sha512-n2QVe1U/8yMdyowo8Z0C4fWPGTJlkvGnqYBw2DFMMPs9uA6mgVDq/xaklZiUl57FVfJm2WcEu1ybdodsRx/gDQ==", + "sha512": "sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==", "path": "microsoft.netcore.platforms/1.1.0", "hashPath": "microsoft.netcore.platforms.1.1.0.nupkg.sha512" }, "Microsoft.NETCore.Targets/1.1.0": { "type": "package", "serviceable": true, - "sha512": "sha512-vs9c3q7errTVkO1Yh7FoI0eSNvkAIffVpnkygE76Vz8Eo9YtqycOEefrm4iOLMOyMvQIv0Nlw684nt2CDdlzig==", + "sha512": "sha512-aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==", "path": "microsoft.netcore.targets/1.1.0", "hashPath": "microsoft.netcore.targets.1.1.0.nupkg.sha512" }, - "NETStandard.Library/2.0.0": { + "NETStandard.Library/2.0.1": { "type": "package", "serviceable": true, - "sha512": "sha512-7jnbRU+L08FXKMxqUflxEXtVymWvNOrS8yHgu9s6EM8Anr6T/wIX4nZ08j/u3Asz+tCufp3YVwFSEvFTPYmBPA==", - "path": "netstandard.library/2.0.0", - "hashPath": "netstandard.library.2.0.0.nupkg.sha512" + "sha512": "sha512-oA6nwv9MhEKYvLpjZ0ggSpb1g4CQViDVQjLUcDWg598jtvJbpfeP2reqwI1GLW2TbxC/Ml7xL6BBR1HmKPXlTg==", + "path": "netstandard.library/2.0.1", + "hashPath": "netstandard.library.2.0.1.nupkg.sha512" }, "System.IO/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-/wTullO3iTZcj0tbuz1xIcmk+O0/JmkuxcqwAsTfadEEni+sQUQ36JYlSE5D2mSArRtaE1M3bzB75HgcGCJ+tQ==", + "sha512": "sha512-3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", "path": "system.io/4.3.0", "hashPath": "system.io.4.3.0.nupkg.sha512" }, "System.Reflection/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-3uYB1Y9PY+4B/XtCMGiLfnNP9SJU5vovOLiEGabFqBOtBML8PurmWr0OzPKebsrGviYB1acTKrhE1NAIb+P3mQ==", + "sha512": "sha512-KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", "path": "system.reflection/4.3.0", "hashPath": "system.reflection.4.3.0.nupkg.sha512" }, "System.Reflection.Emit/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-GHctkl5J3qRgAvXxc+cQXbYfrw0S7kZswbTbbFgSjvGU/KhTRmH+ZpMNToI8NA/nLCMl0EAgbWpIfp74EnYOJw==", + "sha512": "sha512-228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", "path": "system.reflection.emit/4.3.0", "hashPath": "system.reflection.emit.4.3.0.nupkg.sha512" }, "System.Reflection.Emit.ILGeneration/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-lqTxoVZbRVP84GyXyxOUeB2PdOzrTLAMluaxIkp94WURhQMAKQKlQd5YATL+UnTDtxDzd9HZDKjF7xl2jjQEnA==", + "sha512": "sha512-59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", "path": "system.reflection.emit.ilgeneration/4.3.0", "hashPath": "system.reflection.emit.ilgeneration.4.3.0.nupkg.sha512" }, "System.Reflection.Emit.Lightweight/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-LvX8HS0d2l8lNam0RpJgH3gQM6nSSP3crcE6XlMYCBvhTv41HkZbroA3YsCyC21Eu3hsZu1jJRTxmgsD7dww2g==", + "sha512": "sha512-oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", "path": "system.reflection.emit.lightweight/4.3.0", "hashPath": "system.reflection.emit.lightweight.4.3.0.nupkg.sha512" }, "System.Reflection.Primitives/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-IWUmJcoqCpvsIn0Txobe+5idI096N+08jM3pnbVW1QWBDWQcSZqfQ7nNpMv/eKexrdlODAup0nd9dMRzbfPgSA==", + "sha512": "sha512-5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", "path": "system.reflection.primitives/4.3.0", "hashPath": "system.reflection.primitives.4.3.0.nupkg.sha512" }, "System.Runtime/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-iD01AV/eij/6iIa2UZHXayeOQoyjjP48pSIpP2bgxDVwTftELekKHJmsCTE7kD0BobeK6O2+RzQownNc9Yro9w==", + "sha512": "sha512-JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", "path": "system.runtime/4.3.0", "hashPath": "system.runtime.4.3.0.nupkg.sha512" }, @@ -225,14 +225,14 @@ "System.Text.Encoding/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-58DKIOFSEnQqFEogJ0lqgGFf1Gr9Zzc9/KmYvOR9uW9lf35DHzGNkki+HpPNsdEIHCjKmnQRJF9sBrovQhYhKw==", + "sha512": "sha512-BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", "path": "system.text.encoding/4.3.0", "hashPath": "system.text.encoding.4.3.0.nupkg.sha512" }, "System.Threading.Tasks/4.3.0": { "type": "package", "serviceable": true, - "sha512": "sha512-eYZRKpn/EpgiXlh8QGXI3qnAWmIdbmjZhqyKIuURD4awwTMBJL56b5ykdWRus9TLKRbvAPAdWiPxFc/VBJ+d9A==", + "sha512": "sha512-LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", "path": "system.threading.tasks/4.3.0", "hashPath": "system.threading.tasks.4.3.0.nupkg.sha512" } diff --git a/lib/netstandard2.0/ServiceStack.Text.dll b/lib/netstandard2.0/ServiceStack.Text.dll index c14df493..b6aa5b4b 100644 Binary files a/lib/netstandard2.0/ServiceStack.Text.dll and b/lib/netstandard2.0/ServiceStack.Text.dll differ diff --git a/lib/netstandard2.0/ServiceStack.Text.xml b/lib/netstandard2.0/ServiceStack.Text.xml index 70987c13..2bfe25ba 100644 --- a/lib/netstandard2.0/ServiceStack.Text.xml +++ b/lib/netstandard2.0/ServiceStack.Text.xml @@ -78,6 +78,12 @@ + + + Gets or sets the default character encoding using in A system.IO.Stream + to write data or read data. The default value is PclExport.Instance.GetUseEncoding(false). + + A fast, standards-based, serialization-issue free DateTime serailizer. @@ -333,6 +339,12 @@ Creates an instance of a Type from a string value + + + Gets or sets the default character encoding using in A system.IO.Stream to write data or read data. + The default value is PclExport.Instance.GetUseEncoding(false). + + Parses the specified value. @@ -1051,16 +1063,6 @@ Allow Type to be deserialized into late-bould object Types using __type info - - - Reusable StringBuilder ThreadStatic Cache - - - - - Alternative Reusable StringBuilder ThreadStatic Cache - - Reusable StringWriter ThreadStatic Cache @@ -1165,11 +1167,6 @@ Print Dump to Console.WriteLine - - - Print string.Format to Console.WriteLine - - Parses the specified value. @@ -1177,6 +1174,111 @@ The value. + + + Serializes and deserializes objects into and from XML strings. ServiceStack.Text.XmlSerializer enables you to control + how objects are encoded into XML. + + + + + Gets an default System.Xml.XmlWriterSettings instance providing a set of features to support on the System.Xml.XmlWriter object + created by the Overload:System.Xml.XmlWriter.Create method. + + + + + Gets an System.Xml.XmlReaderSettings instance providing a set of features to support on the System.Xml.XmlReader object + created by the Overload:System.Xml.XmlReader.Create method. + + + + + Deserializes the XML string with an System.IO.TextReader into an instance of object. + + The System.IO.TextReader used to read the XML string. + The supplied data contract type of the object that are deserialized. + The settings for the new System.Xml.XmlReader, if the value is null use the default + . + The deserialized object. + + + + Deserializes the XML string with an System.IO.TextReader into an instance of the specified type. + + The supplied data contract type of the instance that are deserialized. + The System.IO.TextReader used to read the XML string. + The settings for the new System.Xml.XmlReader, if the value is null use the default + . + The deserialized instance of the specified type. + + + + Deserializes the XML string into an instance of object. + + The XML string to deserialize. + The supplied data contract type of the object that are deserialized. + The settings for the new System.Xml.XmlReader, if the value is null use the default + . + The deserialized object. + + + + Deserializes the XML string into an instance of the specified type. + + The supplied data contract type of the instance that are deserialized. + The XML string to deserialize. + The settings for the new System.Xml.XmlReader, if the value is null use the default + . + The deserialized instance of the specified type. + + + + Deserializes the XML stream with an System.IO.Stream into an instance of object. + + The System.IO.Stream used to read the XML stream. + The supplied data contract type of the object that are deserialized. + The settings for the new System.Xml.XmlReader, if the value is null use the default + . + The deserialized object. + + + + Deserializes the XML stream with an System.IO.Stream into an instance of the specified type. + + The supplied data contract type of the instance that are deserialized. + The System.IO.Stream used to read the XML stream. + The settings for the new System.Xml.XmlReader, if the value is null use the default + . + The deserialized instance of the specified type. + + + + Serializes the specified System.Object and writes the XML string to a instance of System.IO.TextWriter. + + The supplied data contract object that contains the data to write to the stream. + The System.IO.Writer used to write the XML string. + The settings for the new System.Xml.XmlWriter, if the value is null use the default + . + + + + Serializes the specified System.Object and writes the XML string to a instance of System.IO.Stream. + + The supplied data contract object that contains the data to write to the stream. + The System.IO.Stream used to write the XML string. + The settings for the new System.Xml.XmlWriter, if the value is null use the default + . + + + + Serializes the specified System.Object into the XML string. + + The supplied data contract object that are serialized. + The settings for the new System.Xml.XmlWriter, if the value is null use the default + . + The XML string of the serialized object. + Populate an object with Example data. @@ -1192,6 +1294,188 @@ Tracks how deeply nested we are + + + Provides methods for the HTTP-specific request to a Uniform Resource Identifier (URI). + + + + + Gets the string representation response from the Internet resource to an HTTP-specific request, whose + Accept HTTP header is . + + A URL string that identifies the Internet resource. + The request method to use to contact the Internet resource. The default value is GET. + The optional request body associated with the Http-specific request. + The value of the Content-type HTTP header. The default value is null. + The method to filter the HTTP-specific request. + The method to filter the response to the HTTP-specific request. + The string representation response to the HTTP-specific request. + The URL specified in urlString is not a valid URL. + System.Net.HttpWebRequest.Abort was previously called.-or- The time-out period + for the request expired.-or- An error occurred while processing the request. + + + + Gets the string representation response from the Internet resource to an HTTP-specific request as an asynchronous operation, + whose Accept HTTP header is . + + A URL string that identifies the Internet resource. + The request method to use to contact the Internet resource. The default value is GET. + The optional request body associated with the Http-specific request. + The value of the Content-type HTTP header. The default value is null. + The method to filter the HTTP-specific request. + The method to filter the response to the HTTP-specific request. + Returns System.Threading.Tasks`1. The task object representing the asynchronous operation. + + + + Gets the string representation response from the Internet resource to an HTTP-specific request, whose + Accept HTTP header is . + + A URL string that identifies the Internet resource. + The request method to use to contact the Internet resource. The default value is GET. + The optional request body associated with the Http-specific request. + The value of the Content-type HTTP header. The default value is null. + The method to filter the HTTP-specific request. + The method to filter the response to the HTTP-specific request. + The string representation response to the HTTP-specific request. + The URL specified in urlString is not a valid URL. + System.Net.HttpWebRequest.Abort was previously called.-or- The time-out period + for the request expired.-or- An error occurred while processing the request. + + + + Gets the string representation response from the Internet resource to an HTTP-specific request as an asynchronous operation, + whose Accept HTTP header is . + + A URL string that identifies the Internet resource. + The request method to use to contact the Internet resource. The default value is GET. + The optional request body associated with the Http-specific request. + The value of the Content-type HTTP header. The default value is null. + The method to filter the HTTP-specific request. + The method to filter the response to the HTTP-specific request. + Returns System.Threading.Tasks`1. The task object representing the asynchronous operation. + + + + Gets the string representation response from the Internet resource to an HTTP-specific request, whose + Accept HTTP header is . + + A URL string that identifies the Internet resource. + The request method to use to contact the Internet resource. The default value is GET. + The optional request body associated with the Http-specific request. + The value of the Content-type HTTP header. The default value is null. + The method to filter the HTTP-specific request. + The method to filter the response to the HTTP-specific request. + The string representation response to the HTTP-specific request. + The URL specified in urlString is not a valid URL. + System.Net.HttpWebRequest.Abort was previously called.-or- The time-out period + for the request expired.-or- An error occurred while processing the request. + + + + Gets the string representation response from the Internet resource to an HTTP-specific request as an asynchronous operation, + whose Accept HTTP header is . + + A URL string that identifies the Internet resource. + The request method to use to contact the Internet resource. The default value is GET. + The optional request body associated with the Http-specific request. + The value of the Content-type HTTP header. The default value is null. + The method to filter the HTTP-specific request. + The method to filter the response to the HTTP-specific request. + Returns System.Threading.Tasks`1. The task object representing the asynchronous operation. + + + + Gets the string representation response from the Internet resource to an HTTP-specific request, whose + Accept HTTP header is . + + A URL string that identifies the Internet resource. + The request method to use to contact the Internet resource. The default value is GET. + The optional request body associated with the Http-specific request. + The value of the Content-type HTTP header. The default value is null. + The method to filter the HTTP-specific request. + The method to filter the response to the HTTP-specific request. + The string representation response to the HTTP-specific request. + The URL specified in urlString is not a valid URL. + System.Net.HttpWebRequest.Abort was previously called.-or- The time-out period + for the request expired.-or- An error occurred while processing the request. + + + + Gets the string representation response from the Internet resource to an HTTP-specific request as an asynchronous operation, + whose Accept HTTP header is . + + A URL string that identifies the Internet resource. + The request method to use to contact the Internet resource. The default value is GET. + The optional request body associated with the Http-specific request. + The value of the Content-type HTTP header. The default value is null. + The method to filter the HTTP-specific request. + The method to filter the response to the HTTP-specific request. + Returns System.Threading.Tasks`1. The task object representing the asynchronous operation. + + + + Gets the string representation response from the Internet resource to an HTTP-specific request using the specified request options. + + A URL string that identifies the Internet resource. + The request method to use to contact the Internet resource. The default value is GET. + The optional request body associated with the Http-specific request. + The value of the Content-type HTTP header. The default value is null. + The value of the Accept HTTP header. The default value is "*/*". + The method to filter the HTTP-specific request. + The method to filter the response to the HTTP-specific request. + The string representation response to the HTTP-specific request. + The URL specified in urlString is not a valid URL. + System.Net.HttpWebRequest.Abort was previously called.-or- The time-out period + for the request expired.-or- An error occurred while processing the request. + + + + Gets the string representation response from the Internet resource to an HTTP-specific request as an asynchronous operation using the specified request options. + + A URL string that identifies the Internet resource. + The request method to use to contact the Internet resource. The default value is GET. + The optional request body associated with the Http-specific request. + The value of the Content-type HTTP header. The default value is null. + The value of the Accept HTTP header. The default value is "*/*". + The method to filter the HTTP-specific request. + The method to filter the response to the HTTP-specific request. + Returns System.Threading.Tasks`1. The task object representing the asynchronous operation. + + + + Reads all characters from the current position to the end of the data stream from the Internet response. + + The response from an Uniform Resource Identifier (URI). + The rest of the data stream from the Internet response as a string. If + the current position is at the end of the stream, returns an empty string. + + + + Reads all lines of characters from the current position to the end of the data stream from the Internet response. + + The response from an Uniform Resource Identifier (URI). + An System.Collections.Generic.IEnumerable`1 that contains System.String elements from the Internet response. + + + + Gets a response from the Internet resource to an HTTP-specific request. + + A URL string that identifies the Internet resource. + A containing the response to the Internet request. + The URL specified in urlString is not a valid URL. + System.Net.HttpWebRequest.Abort was previously called.-or- The time-out period + for the request expired.-or- An error occurred while processing the request. + + + + Gets a response from the Internet resource to an HTTP-specific request as an asynchronous operation. + + A URL string that identifies the Internet resource. + Returns System.Threading.Tasks`1. The task object representing the asynchronous operation. + Public Code API to register commercial license for ServiceStack. @@ -1202,6 +1486,11 @@ Internal Utilities to verify licensing + + + Provides extension methods on System.String instances that contain file or directory path information or uri. + + Maps the path of a file in the context of a VS project in a Console App @@ -1236,6 +1525,59 @@ the absolute path Assumes static content is in the parent folder of the /bin/ directory + + + Combines the path elements in a specified System.String array into an base path. + + The base path to combine. + An string array that contains the path elements to combine. + The combined paths string. + + + + Combines the path elements in a specified System.String array. + + An string array that contains the path elements to combine. + The combined paths string. + + + + When overridden in a descendant class, writes a message followed by a line terminator, to the platform-specific output stream. + The default is . + + A message to write. + + + + When overridden in a descendant class, writes a formatted message followed by a line terminator, to the platform-specific output stream. + The default is . + + A composite format string (see Remarks) that contains text intermixed with zero or more format items, + which correspond to objects in the args array. + An object array that contains zero or more objects to format. + + + + When overridden in a descendant class, provides a instance of the class. A parameter + specifies whether to provide a Unicode byte order mark. + + true to specify that the method returns + a Unicode byte order mark; otherwise, false. See the Remarks section for more information. + A System.Text.Encoding instance. + + + + When overridden in a descendant class, Initializes a new System.Net.HttpWebRequest instance for the specified URI scheme. + + A URI string that identifies the Internet resource. + A System.Net.HttpWebRequest instance for the specific URI scheme. + The uriString is null. + The request scheme specified in uriString has not been registered. + The caller does not have permission to connect to the requested URI or a URI + that the request is redirected to. + The request scheme specified in uriString is the http or https scheme. + The URI specified in uriString is not a valid URI. + Add a Property attribute at runtime. @@ -1344,6 +1686,11 @@ Same as ReadExactly, but without the argument checks. + + + Provides a set of static methods for object. + + Converts from base: 0 - 62 @@ -1353,6 +1700,46 @@ To. + + + Converts a uri component to its escaped representation using the specified upperCase. + + The uri component to escape. + true to perform an uppercase escaping, other then false. The default value is false. + A System.String that contains the escaped representation of uriComponent. + + + + Replaces the letter of the specified string with the letter 13 letters after it in the alphabet. + + A string to replace. + a Rot13 string. + + + + Appends a copy of the specified uriComponent without character escaping to the base URI. + + The base System.Uri, represented as a System.String. + The uri component to add to the base System.Uri. + A string representation for a System.Uri instance. + + + + Appends the uri component elements without character escaping in a specified System.String array to the base URI. + + The base System.Uri, represented as a System.String. + An string array that contains the uri component elements. + A string representation for a System.Uri instance. + + + + Appends the uri component elements in a specified System.String array to the base URI, with explicit control of character escaping. + + The base System.Uri, represented as a System.String. + An string array that contains the uri component elements. + true if escape the uri components; otherwise, false. + A string representation for a System.Uri instance. + Skip the encoding process for 'safe strings' @@ -1360,5 +1747,48 @@ + + + Replaces the format item in a specified string with the string representation of a corresponding object in a specified array. + + A composite format string. + An object array that contains zero or more objects to format. + A copy of format in which the format items have been replaced by the string representation + of the corresponding objects in args. + format is invalid.-or- The index of a format item is less than zero, or greater + than or equal to the length of the args array. + + + + Indicates whether the specified string is null or an System.String.Empty string. + + The string to be tested. + true if the value parameter is null or an empty string (""); otherwise, false. + + + + Removes all leading occurrences of a set of characters specified in an array from the current System.String object. + + The string to be trimed. + An array of Unicode characters to remove, or null. + The string that remains after all occurrences of characters in the trimChars parameter are removed from the start of the current string. + If trimChars is null or an empty array, white-space characters are removed instead. + + + + Removes the leading occurrences of the first matched string specified in an array from the current System.String object. + + The string to be trimed. + An array of strings to match, or null. + The string that remains after the first matched string is removed from the start of the current string. + + + + Prints a formatted message. + + A composite format string (see Remarks) that contains format intermixed with zero or more format items, + which correspond to objects in the args array. + An object array that contains zero or more objects to format. + diff --git a/lib/netstandard2.0/ServiceStack.dll b/lib/netstandard2.0/ServiceStack.dll index 838de28f..58a51675 100644 Binary files a/lib/netstandard2.0/ServiceStack.dll and b/lib/netstandard2.0/ServiceStack.dll differ diff --git a/lib/netstandard2.0/ServiceStack.xml b/lib/netstandard2.0/ServiceStack.xml index f1a5d846..a0a68ce6 100644 --- a/lib/netstandard2.0/ServiceStack.xml +++ b/lib/netstandard2.0/ServiceStack.xml @@ -59,6 +59,12 @@ Should UserName or Emails be saved in AuthRepository in LowerCase + + + Override with Custom Validation logic to Assert if User is allowed to Authenticate. + Returning a non-null response invalidates Authentication with IHttpResult response returned to client. + + The Interface Auth Repositories need to implement to support API Keys @@ -129,26 +135,6 @@ Whether to allow API Keys in 'apikey' QueryString or FormData - - - Inject logic into existing services by introspecting the request and injecting your own - validation logic. Exceptions thrown will have the same behaviour as if the service threw it. - - If a non-null object is returned the request will short-circuit and return that response. - - The instance of the service - GET,POST,PUT,DELETE - - Response DTO; non-null will short-circuit execution and return that response - - - - Get AuthProviders Registered in AuthFeature Plugin. - - specific provider, or null for all providers - - - Get specific AuthProvider @@ -484,12 +470,7 @@ - Create new Registration - - - - - Logic to update UserAuth from Registration info, not enabled on PUT because of security. + Create new Registration @@ -971,26 +952,38 @@ - More familiar name for the new crowd. + Provides access to the System.Configuration.AppSettingsSection data for the current application's default configuration. - The tier lets you specify a retrieving a setting with the tier prefix first before falling back to the original key. + Initializes a new instance of the ServiceStack.Configuration.AppSettings class. + + The tier used to retrieve a setting. The default value is null. + + + + Provides a collection of keys and values that contains application settings. This is an abstract class. + + + + + Gets or sets the prefix of key, which lets you retrieve a setting with the tier first before falling back to the original key. E.g a tier of 'Live' looks for 'Live.{Key}' or if not found falls back to '{Key}'. - + - Returns string if exists, otherwise null + Initializes a new instance of the ServiceStack.Configuration.AppSettingsBase class using the specified settings reader. - - + The instance of class to read the settings. - + - Would've preferred to use [assembly: ContractNamespace] attribute but it is not supported in Mono + Gets the string value associated with the specified key. + The specified key. + The string value associated with the specified key. If the specified key is not found, return null. @@ -1027,23 +1020,6 @@ Gets the dictionary from app setting. - - - Provides a common interface for Settings providers such as - ConfigurationManager or Azure's RoleEnvironment. The only - requirement is that if the implementation cannot find the - specified key, the return value must be null - - The key for the setting - The string value of the specified key, or null if the key - was invalid - - - - Return all keys in this configuration source. - - - Represents a builder for the class. @@ -4662,7 +4638,7 @@ - Execute a Service with a Request DTO. See ExecuteAsync for a non-blocking alternative. + External HTTP Request called from HTTP handlers @@ -4894,7 +4870,7 @@ string value or null if it doesn't exist - + * Input: http://localhost:96/Cambia3/Temp/Test.aspx/path/info?q=item#fragment @@ -5053,6 +5029,21 @@ The assemblies reflected to find api services provided in the AppHost constructor + + + The AppHost config + + + + + The AppHost AppSettings. Defaults to App or Web.config appSettings. + + + + + Access Service Controller for ServiceStack + + Register dependency in AppHost IOC on Startup @@ -5193,6 +5184,11 @@ Add alternative HTML View Engines + + + Register additional Virtual File Sources + + Provide an exception handler for unhandled exceptions @@ -5248,16 +5244,6 @@ Provide a custom model minder for a specific Request DTO - - - The AppHost config - - - - - The AppHost AppSettings. Defaults to App or Web.config appSettings. - - Allow specific configuration to be overridden at runtime in multi-tenancy Applications @@ -5299,11 +5285,6 @@ Read/Write Virtual FileSystem. Defaults to FileSystemVirtualPathProvider - - - Register additional Virtual File Sources - - Create a service runner for IService actions @@ -5325,11 +5306,6 @@ Execute MQ Message in ServiceStack - - - Access Service Controller for ServiceStack - - A convenient repository base class you can inherit from to reduce the boilerplate @@ -5369,6 +5345,23 @@ + + + Inject logic into existing services by introspecting the request and injecting your own + validation logic. Exceptions thrown will have the same behaviour as if the service threw it. + + If a non-null object is returned the request will short-circuit and return that response. + + The instance of the service + GET,POST,PUT,DELETE + + Response DTO; non-null will short-circuit execution and return that response + + + + Allow the registration of user-defined routes for services + + Encapsulates creating a new message handler @@ -5691,12 +5684,10 @@ can only execute, if the user has specific roles. - + Check all session is in all supplied roles otherwise a 401 HttpError is thrown - - @@ -5825,57 +5816,26 @@ The same instance; never . - + - When the AppHost was instantiated. + The AppHost.Container. Note: it is not thread safe to register dependencies after AppStart. - + - When the Init function was done. - Called at begin of + Initializes the AppHost. + Calls the method. + Should be called before start. - + - When all configuration was completed. - Called at the end of + Collection of added plugins. - If app currently runs for unit tests. - Used for overwritting AuthSession. - - - - - The assemblies reflected to find api services. - These can be provided in the constructor call. - - - - - Wether AppHost configuration is done. - Note: It doesn't mean the start function was called. - - - - - Wether AppHost is ready configured and either ready to run or already running. - Equals - - - - - Set the host config of the AppHost. - - - - - Initializes the AppHost. - Calls the method. - Should be called before start. + If app currently runs for unit tests. Used for overwritting AuthSession. @@ -5890,11 +5850,6 @@ Url to listen to - - - The AppHost.Container. Note: it is not thread safe to register dependencies after AppStart. - - Collection of PreRequest filters. @@ -5927,11 +5882,6 @@ If view is needed list is looped until view is found. - - - Collection of added plugins. - - Executed immediately before a Service is executed. Use return to change the request DTO used, must be of the same type. @@ -5987,11 +5937,6 @@ Apply PreRequest Filters for participating Custom Handlers, e.g. RazorFormat, MarkdownFormat, etc - - - Apply PreAuthenticate Filters from IAuthWithRequest AuthProviders - - Applies the raw request filters. Returns whether or not the request has been handled @@ -6036,11 +5981,6 @@ Provided by services and pageView, can be helpfull when overriding this method - - - If they don't have an ICacheClient configured use an In Memory one. - - Tries to resolve through Ioc container. @@ -6081,13 +6021,13 @@ Configure ServiceStack to have ISession support - + Create the active Session or Permanent Session Id cookie. - + Create both Permanent and Session Id cookies and return the active sessionId @@ -6154,9 +6094,8 @@ - Main container class for components, supporting container hierarchies and - lifetime management of instances. - + Main container class for components, supporting container hierarchies and lifetime management of instances. + @@ -6220,389 +6159,660 @@ - Initializes a new empty container. - + Initializes a new empty container. + - Default owner for new registrations. by default. - + Default owner for new registrations. by default. + - Default reuse scope for new registrations. by default. - + Default reuse scope for new registrations. by default. + - Creates a child container of the current one, which exposes its - current service registration to the new child container. - - - - - Disposes the container and all instances owned by it (see - ), as well as all child containers - created through . - + Creates a child container of the current one, which exposes its current service registration to the new child container. + - Registers a service instance with the container. This instance - will have and - behavior. - Service instance to use. + Registers a service instance with the container. This instance will have and + behavior. + + Service instance to use. - Registers a named service instance with the container. This instance - will have and - behavior. - Name of the service to register.Service instance to use. - - - - Retrieves a function that can be used to lazily resolve an instance - of the service when needed. - Type of the service to retrieve.The function that can resolve to the service instance when invoked.The requested service has not been registered previously. - - - - - - - - - - - - - - - - - - - - - - Retrieves a function that can be used to lazily resolve an instance - of the service with the given name when needed. - Type of the service to retrieve.Name of the service to retrieve.The function that can resolve to the service instance with the given name when invoked.The requested service with the given name has not been registered previously. - - - - Retrieves a function that can be used to lazily resolve an instance - of the service of the given type, name and service constructor arguments when needed. - Name of the service to retrieve.The function that can resolve to the service instance with the given and service constructor arguments name when invoked.The requested service with the given name and constructor arguments has not been registered previously. - - - - Retrieves a function that can be used to lazily resolve an instance - of the service of the given type, name and service constructor arguments when needed. - Name of the service to retrieve.The function that can resolve to the service instance with the given and service constructor arguments name when invoked.The requested service with the given name and constructor arguments has not been registered previously. - - - - Retrieves a function that can be used to lazily resolve an instance - of the service of the given type, name and service constructor arguments when needed. - Name of the service to retrieve.The function that can resolve to the service instance with the given and service constructor arguments name when invoked.The requested service with the given name and constructor arguments has not been registered previously. - - - - Retrieves a function that can be used to lazily resolve an instance - of the service of the given type, name and service constructor arguments when needed. - Name of the service to retrieve.The function that can resolve to the service instance with the given and service constructor arguments name when invoked.The requested service with the given name and constructor arguments has not been registered previously. - - - - Retrieves a function that can be used to lazily resolve an instance - of the service of the given type, name and service constructor arguments when needed. - Name of the service to retrieve.The function that can resolve to the service instance with the given and service constructor arguments name when invoked.The requested service with the given name and constructor arguments has not been registered previously. + Registers a named service instance with the container. This instance + will have and behavior. + + Name of the service to register. + Service instance to use. - + - Retrieves a function that can be used to lazily resolve an instance - of the service of the given type, name and service constructor arguments when needed. - Name of the service to retrieve.The function that can resolve to the service instance with the given and service constructor arguments name when invoked.The requested service with the given name and constructor arguments has not been registered previously. + Disposes the container and all instances owned by it (), as well as all child containers + created through . + - Registers the given service by providing a factory delegate to - instantiate it. - The service type to register.The factory delegate to initialize new instances of the service when needed.The registration object to perform further configuration via its fluent interface. + Registers the given service by providing a factory delegate to instantiate it. + + The service type to register. + The factory delegate to initialize new instances of the service when needed. + The registration object to perform further configuration via its fluent interface. - Registers the given service by providing a factory delegate that receives arguments to - instantiate it. - The service type to register.First argument that should be passed to the factory delegate to create the instace.The factory delegate to initialize new instances of the service when needed.The registration object to perform further configuration via its fluent interface. + Registers the given service by providing a factory delegate that receives arguments to instantiate it. + + The service type to register. + First argument that should be passed to the factory delegate to create the instace. + The factory delegate to initialize new instances of the service when needed. + The registration object to perform further configuration via its fluent interface. - Registers the given service by providing a factory delegate that receives arguments to - instantiate it. - The service type to register.First argument that should be passed to the factory delegate to create the instace.Second argument that should be passed to the factory delegate to create the instace.The factory delegate to initialize new instances of the service when needed.The registration object to perform further configuration via its fluent interface. + Registers the given service by providing a factory delegate that receives arguments to instantiate it. + + The service type to register. + First argument that should be passed to the factory delegate to create the instace. + Second argument that should be passed to the factory delegate to create the instace. + The factory delegate to initialize new instances of the service when needed. + The registration object to perform further configuration via its fluent interface. - Registers the given service by providing a factory delegate that receives arguments to - instantiate it. - The service type to register.First argument that should be passed to the factory delegate to create the instace.Second argument that should be passed to the factory delegate to create the instace.Third argument that should be passed to the factory delegate to create the instace.The factory delegate to initialize new instances of the service when needed.The registration object to perform further configuration via its fluent interface. + Registers the given service by providing a factory delegate that receives arguments to instantiate it. + + The service type to register. + First argument that should be passed to the factory delegate to create the instace. + Second argument that should be passed to the factory delegate to create the instace. + Third argument that should be passed to the factory delegate to create the instace. + The factory delegate to initialize new instances of the service when needed. + The registration object to perform further configuration via its fluent interface. - Registers the given service by providing a factory delegate that receives arguments to - instantiate it. - The service type to register.First argument that should be passed to the factory delegate to create the instace.Second argument that should be passed to the factory delegate to create the instace.Third argument that should be passed to the factory delegate to create the instace.Fourth argument that should be passed to the factory delegate to create the instace.The factory delegate to initialize new instances of the service when needed.The registration object to perform further configuration via its fluent interface. + Registers the given service by providing a factory delegate that receives arguments to instantiate it. + + The service type to register. + First argument that should be passed to the factory delegate to create the instace. + Second argument that should be passed to the factory delegate to create the instace. + Third argument that should be passed to the factory delegate to create the instace. + Fourth argument that should be passed to the factory delegate to create the instace. + The factory delegate to initialize new instances of the service when needed. + The registration object to perform further configuration via its fluent interface. - Registers the given service by providing a factory delegate that receives arguments to - instantiate it. - The service type to register.First argument that should be passed to the factory delegate to create the instace.Second argument that should be passed to the factory delegate to create the instace.Third argument that should be passed to the factory delegate to create the instace.Fourth argument that should be passed to the factory delegate to create the instace.Fifth argument that should be passed to the factory delegate to create the instace.The factory delegate to initialize new instances of the service when needed.The registration object to perform further configuration via its fluent interface. + Registers the given service by providing a factory delegate that receives arguments to instantiate it. + + The service type to register. + First argument that should be passed to the factory delegate to create the instace. + Second argument that should be passed to the factory delegate to create the instace. + Third argument that should be passed to the factory delegate to create the instace. + Fourth argument that should be passed to the factory delegate to create the instace. + Fifth argument that should be passed to the factory delegate to create the instace. + The factory delegate to initialize new instances of the service when needed. + The registration object to perform further configuration via its fluent interface. - Registers the given service by providing a factory delegate that receives arguments to - instantiate it. - The service type to register.First argument that should be passed to the factory delegate to create the instace.Second argument that should be passed to the factory delegate to create the instace.Third argument that should be passed to the factory delegate to create the instace.Fourth argument that should be passed to the factory delegate to create the instace.Fifth argument that should be passed to the factory delegate to create the instace.Sixth argument that should be passed to the factory delegate to create the instace.The factory delegate to initialize new instances of the service when needed.The registration object to perform further configuration via its fluent interface. + Registers the given service by providing a factory delegate that receives arguments to instantiate it. + + The service type to register. + First argument that should be passed to the factory delegate to create the instace. + Second argument that should be passed to the factory delegate to create the instace. + Third argument that should be passed to the factory delegate to create the instace. + Fourth argument that should be passed to the factory delegate to create the instace. + Fifth argument that should be passed to the factory delegate to create the instace. + Sixth argument that should be passed to the factory delegate to create the instace. + The factory delegate to initialize new instances of the service when needed. + The registration object to perform further configuration via its fluent interface. - Registers the given named service by providing a factory delegate to - instantiate it. - The service type to register.A name used to differenciate this service registration.The factory delegate to initialize new instances of the service when needed.The registration object to perform further configuration via its fluent interface. + Registers the given named service by providing a factory delegate to instantiate it. + + The service type to register. + A name used to differenciate this service registration. + The factory delegate to initialize new instances of the service when needed. + The registration object to perform further configuration via its fluent interface. - Registers the given named service by providing a factory delegate that receives arguments to - instantiate it. - The service type to register.First argument that should be passed to the factory delegate to create the instace.A name used to differenciate this service registration.The factory delegate to initialize new instances of the service when needed.The registration object to perform further configuration via its fluent interface. + Registers the given named service by providing a factory delegate that receives arguments to instantiate it. + + The service type to register. + First argument that should be passed to the factory delegate to create the instace. + A name used to differenciate this service registration. + The factory delegate to initialize new instances of the service when needed. + The registration object to perform further configuration via its fluent interface. - Registers the given named service by providing a factory delegate that receives arguments to - instantiate it. - The service type to register.First argument that should be passed to the factory delegate to create the instace.Second argument that should be passed to the factory delegate to create the instace.A name used to differenciate this service registration.The factory delegate to initialize new instances of the service when needed.The registration object to perform further configuration via its fluent interface. + Registers the given named service by providing a factory delegate that receives arguments to instantiate it. + + The service type to register. + First argument that should be passed to the factory delegate to create the instace. + Second argument that should be passed to the factory delegate to create the instace. + A name used to differenciate this service registration. + The factory delegate to initialize new instances of the service when needed. + The registration object to perform further configuration via its fluent interface. - Registers the given named service by providing a factory delegate that receives arguments to - instantiate it. - The service type to register.First argument that should be passed to the factory delegate to create the instace.Second argument that should be passed to the factory delegate to create the instace.Third argument that should be passed to the factory delegate to create the instace.A name used to differenciate this service registration.The factory delegate to initialize new instances of the service when needed.The registration object to perform further configuration via its fluent interface. + Registers the given named service by providing a factory delegate that receives arguments to instantiate it. + + The service type to register. + First argument that should be passed to the factory delegate to create the instace. + Second argument that should be passed to the factory delegate to create the instace. + Third argument that should be passed to the factory delegate to create the instace. + A name used to differenciate this service registration. + The factory delegate to initialize new instances of the service when needed. + The registration object to perform further configuration via its fluent interface. - Registers the given named service by providing a factory delegate that receives arguments to - instantiate it. - The service type to register.First argument that should be passed to the factory delegate to create the instace.Second argument that should be passed to the factory delegate to create the instace.Third argument that should be passed to the factory delegate to create the instace.Fourth argument that should be passed to the factory delegate to create the instace.A name used to differenciate this service registration.The factory delegate to initialize new instances of the service when needed.The registration object to perform further configuration via its fluent interface. + Registers the given named service by providing a factory delegate that receives arguments to instantiate it. + + The service type to register. + First argument that should be passed to the factory delegate to create the instace. + Second argument that should be passed to the factory delegate to create the instace. + Third argument that should be passed to the factory delegate to create the instace. + Fouth argument that should be passed to the factory delegate to create the instace. + A name used to differenciate this service registration. + The factory delegate to initialize new instances of the service when needed. + The registration object to perform further configuration via its fluent interface. - Registers the given named service by providing a factory delegate that receives arguments to - instantiate it. - The service type to register.First argument that should be passed to the factory delegate to create the instace.Second argument that should be passed to the factory delegate to create the instace.Third argument that should be passed to the factory delegate to create the instace.Fourth argument that should be passed to the factory delegate to create the instace.Fifth argument that should be passed to the factory delegate to create the instace.A name used to differenciate this service registration.The factory delegate to initialize new instances of the service when needed.The registration object to perform further configuration via its fluent interface. + Registers the given named service by providing a factory delegate that receives arguments to instantiate it. + + The service type to register. + First argument that should be passed to the factory delegate to create the instace. + Second argument that should be passed to the factory delegate to create the instace. + Third argument that should be passed to the factory delegate to create the instace. + Fouth argument that should be passed to the factory delegate to create the instace. + Fifth argument that should be passed to the factory delegate to create the instace. + A name used to differenciate this service registration. + The factory delegate to initialize new instances of the service when needed. + The registration object to perform further configuration via its fluent interface. - Registers the given named service by providing a factory delegate that receives arguments to - instantiate it. - The service type to register.First argument that should be passed to the factory delegate to create the instace.Second argument that should be passed to the factory delegate to create the instace.Third argument that should be passed to the factory delegate to create the instace.Fourth argument that should be passed to the factory delegate to create the instace.Fifth argument that should be passed to the factory delegate to create the instace.Sixth argument that should be passed to the factory delegate to create the instace.A name used to differenciate this service registration.The factory delegate to initialize new instances of the service when needed.The registration object to perform further configuration via its fluent interface. + Registers the given named service by providing a factory delegate that receives arguments to instantiate it. + + The service type to register. + First argument that should be passed to the factory delegate to create the instace. + Second argument that should be passed to the factory delegate to create the instace. + Third argument that should be passed to the factory delegate to create the instace. + Fouth argument that should be passed to the factory delegate to create the instace. + Fifth argument that should be passed to the factory delegate to create the instace. + Sixth argument that should be passed to the factory delegate to create the instace. + A name used to differenciate this service registration. + The factory delegate to initialize new instances of the service when needed. + The registration object to perform further configuration via its fluent interface. - Resolves the given service by type, without passing any arguments for - its construction. - Type of the service to retrieve.The resolved service instance.The given service could not be resolved. + Resolves the given service by type, without passing any arguments for its construction. + + Type of the service to retrieve. + The resolved service instance. + The given service could not be resolved. - Resolves the given service by type, passing the given arguments - for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.The resolved service instance.The given service could not be resolved. + Resolves the given service by type, passing the given arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + The resolved service instance. + The given service could not be resolved. - Resolves the given service by type, passing the given arguments - for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.The resolved service instance.The given service could not be resolved. + Resolves the given service by type, passing the given arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + The resolved service instance. + The given service could not be resolved. - Resolves the given service by type, passing the given arguments - for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.Third argument to pass to the factory delegate that may create the instace.The resolved service instance.The given service could not be resolved. + Resolves the given service by type, passing the given arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + Third argument to pass to the factory delegate that may create the instace. + The resolved service instance. + The given service could not be resolved. - Resolves the given service by type, passing the given arguments - for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.Third argument to pass to the factory delegate that may create the instace.Fourth argument to pass to the factory delegate that may create the instace.The resolved service instance.The given service could not be resolved. + Resolves the given service by type, passing the given arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + Third argument to pass to the factory delegate that may create the instace. + Fourth argument to pass to the factory delegate that may create the instace. + The resolved service instance. + The given service could not be resolved. - Resolves the given service by type, passing the given arguments - for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.Third argument to pass to the factory delegate that may create the instace.Fourth argument to pass to the factory delegate that may create the instace.Fifth argument to pass to the factory delegate that may create the instace.The resolved service instance.The given service could not be resolved. + Resolves the given service by type, passing the given arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + Third argument to pass to the factory delegate that may create the instace. + Fourth argument to pass to the factory delegate that may create the instace. + Fifth argument to pass to the factory delegate that may create the instace. + The resolved service instance. + The given service could not be resolved. - Resolves the given service by type, passing the given arguments - for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.Third argument to pass to the factory delegate that may create the instace.Fourth argument to pass to the factory delegate that may create the instace.Fifth argument to pass to the factory delegate that may create the instace.Sixth argument to pass to the factory delegate that may create the instace.The resolved service instance.The given service could not be resolved. + Resolves the given service by type, passing the given arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + Third argument to pass to the factory delegate that may create the instace. + Fourth argument to pass to the factory delegate that may create the instace. + Fifth argument to pass to the factory delegate that may create the instace. + Sixth argument to pass to the factory delegate that may create the instace. + The resolved service instance. + The given service could not be resolved. - Resolves the given service by type and name, without passing arguments for its initialization. - Type of the service to retrieve.The resolved service instance.The given service could not be resolved. + Resolves the given service by type and name, without passing arguments for its initialization. + + Type of the service to retrieve. + The resolved service instance. + The given service could not be resolved. - Resolves the given service by type and name, passing the given arguments - for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.The resolved service instance.The given service could not be resolved. + Resolves the given service by type and name, passing the given arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + The resolved service instance. + The given service could not be resolved. - Resolves the given service by type and name, passing the given arguments - for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.The resolved service instance.The given service could not be resolved. + Resolves the given service by type and name, passing the given arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + The resolved service instance. + The given service could not be resolved. - Resolves the given service by type and name, passing the given arguments - for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.Third argument to pass to the factory delegate that may create the instace.The resolved service instance.The given service could not be resolved. + Resolves the given service by type and name, passing the given arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + Third argument to pass to the factory delegate that may create the instace. + The resolved service instance. + The given service could not be resolved. - Resolves the given service by type and name, passing the given arguments - for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.Third argument to pass to the factory delegate that may create the instace.Fourth argument to pass to the factory delegate that may create the instace.The resolved service instance.The given service could not be resolved. + Resolves the given service by type and name, passing the given arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + Third argument to pass to the factory delegate that may create the instace. + Fourth argument to pass to the factory delegate that may create the instace. + The resolved service instance. + The given service could not be resolved. - Resolves the given service by type and name, passing the given arguments - for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.Third argument to pass to the factory delegate that may create the instace.Fourth argument to pass to the factory delegate that may create the instace.Fifth argument to pass to the factory delegate that may create the instace.The resolved service instance.The given service could not be resolved. + Resolves the given service by type and name, passing the given arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + Third argument to pass to the factory delegate that may create the instace. + Fourth argument to pass to the factory delegate that may create the instace. + Fifth argument to pass to the factory delegate that may create the instace. + The resolved service instance. + The given service could not be resolved. - Resolves the given service by type and name, passing the given arguments - for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.Third argument to pass to the factory delegate that may create the instace.Fourth argument to pass to the factory delegate that may create the instace.Fifth argument to pass to the factory delegate that may create the instace.Sixth argument to pass to the factory delegate that may create the instace.The resolved service instance.The given service could not be resolved. + Resolves the given service by type and name, passing the given arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + Third argument to pass to the factory delegate that may create the instace. + Fourth argument to pass to the factory delegate that may create the instace. + Fifth argument to pass to the factory delegate that may create the instace. + Sixth argument to pass to the factory delegate that may create the instace. + The resolved service instance. + The given service could not be resolved. - Attempts to resolve the given service by type, without passing arguments for its initialization. - Type of the service to retrieve. - The resolved service instance or if it cannot be resolved. - + Attempts to resolve the given service by type, without passing arguments for its initialization. + + Type of the service to retrieve. + The resolved service instance or null if it cannot be resolved. - Attempts to resolve the given service by type, passing the - given arguments arguments for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace. - The resolved service instance or if it cannot be resolved. - + Attempts to resolve the given service by type, passing the given arguments arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + The resolved service instance or if it cannot be resolved. - Attempts to resolve the given service by type, passing the - given arguments arguments for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace. - The resolved service instance or if it cannot be resolved. - + Attempts to resolve the given service by type, passing the given arguments arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + The resolved service instance or null if it cannot be resolved. - Attempts to resolve the given service by type, passing the - given arguments arguments for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.Third argument to pass to the factory delegate that may create the instace. - The resolved service instance or if it cannot be resolved. - + Attempts to resolve the given service by type, passing the given arguments arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + Third argument to pass to the factory delegate that may create the instace. + The resolved service instance or null if it cannot be resolved. - Attempts to resolve the given service by type, passing the - given arguments arguments for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.Third argument to pass to the factory delegate that may create the instace.Fourth argument to pass to the factory delegate that may create the instace. - The resolved service instance or if it cannot be resolved. - + Attempts to resolve the given service by type, passing the given arguments arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + Third argument to pass to the factory delegate that may create the instace. + Fourth argument to pass to the factory delegate that may create the instace. + The resolved service instance or null if it cannot be resolved. - Attempts to resolve the given service by type, passing the - given arguments arguments for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.Third argument to pass to the factory delegate that may create the instace.Fourth argument to pass to the factory delegate that may create the instace.Fifth argument to pass to the factory delegate that may create the instace. - The resolved service instance or if it cannot be resolved. - + Attempts to resolve the given service by type, passing the given arguments arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + Third argument to pass to the factory delegate that may create the instace. + Fourth argument to pass to the factory delegate that may create the instace. + Fifth argument to pass to the factory delegate that may create the instace. + The resolved service instance or null if it cannot be resolved. - Attempts to resolve the given service by type, passing the - given arguments arguments for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.Third argument to pass to the factory delegate that may create the instace.Fourth argument to pass to the factory delegate that may create the instace.Fifth argument to pass to the factory delegate that may create the instace.Sixth argument to pass to the factory delegate that may create the instace. - The resolved service instance or if it cannot be resolved. - + Attempts to resolve the given service by type, passing the given arguments arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + Third argument to pass to the factory delegate that may create the instace. + Fourth argument to pass to the factory delegate that may create the instace. + Fifth argument to pass to the factory delegate that may create the instace. + Sixth argument to pass to the factory delegate that may create the instace. + The resolved service instance or null if it cannot be resolved. - Attempts to resolve the given service by type and name, without passing - arguments arguments for its initialization. - Type of the service to retrieve. - The resolved service instance or if it cannot be resolved. - + Attempts to resolve the given service by type and name, without passing arguments arguments for its initialization. + + Type of the service to retrieve. + The resolved service instance or null if it cannot be resolved. - Attempts to resolve the given service by type and name, passing the - given arguments arguments for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace. - The resolved service instance or if it cannot be resolved. - + Attempts to resolve the given service by type and name, passing the given arguments arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + The resolved service instance or null if it cannot be resolved. - Attempts to resolve the given service by type and name, passing the - given arguments arguments for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace. - The resolved service instance or if it cannot be resolved. - + Attempts to resolve the given service by type and name, passing the given arguments arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + The resolved service instance or null if it cannot be resolved. - Attempts to resolve the given service by type and name, passing the - given arguments arguments for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.Third argument to pass to the factory delegate that may create the instace. - The resolved service instance or if it cannot be resolved. - + Attempts to resolve the given service by type and name, passing the given arguments arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + Third argument to pass to the factory delegate that may create the instace. + The resolved service instance or null if it cannot be resolved. - Attempts to resolve the given service by type and name, passing the - given arguments arguments for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.Third argument to pass to the factory delegate that may create the instace.Fourth argument to pass to the factory delegate that may create the instace. - The resolved service instance or if it cannot be resolved. - + Attempts to resolve the given service by type and name, passing the given arguments arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + Third argument to pass to the factory delegate that may create the instace. + Fourth argument to pass to the factory delegate that may create the instace. + The resolved service instance or null if it cannot be resolved. - Attempts to resolve the given service by type and name, passing the - given arguments arguments for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.Third argument to pass to the factory delegate that may create the instace.Fourth argument to pass to the factory delegate that may create the instace.Fifth argument to pass to the factory delegate that may create the instace. - The resolved service instance or if it cannot be resolved. - + Attempts to resolve the given service by type and name, passing the given arguments arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + Third argument to pass to the factory delegate that may create the instace. + Fourth argument to pass to the factory delegate that may create the instace. + Fifth argument to pass to the factory delegate that may create the instace. + The resolved service instance or null if it cannot be resolved. - Attempts to resolve the given service by type and name, passing the - given arguments arguments for its initialization. - Type of the service to retrieve.First argument to pass to the factory delegate that may create the instace.Second argument to pass to the factory delegate that may create the instace.Third argument to pass to the factory delegate that may create the instace.Fourth argument to pass to the factory delegate that may create the instace.Fifth argument to pass to the factory delegate that may create the instace.Sixth argument to pass to the factory delegate that may create the instace. - The resolved service instance or if it cannot be resolved. - + Attempts to resolve the given service by type and name, passing the given arguments arguments for its initialization. + + Type of the service to retrieve. + First argument to pass to the factory delegate that may create the instace. + Second argument to pass to the factory delegate that may create the instace. + Third argument to pass to the factory delegate that may create the instace. + Fourth argument to pass to the factory delegate that may create the instace. + Fifth argument to pass to the factory delegate that may create the instace. + Sixth argument to pass to the factory delegate that may create the instace. + The resolved service instance or null if it cannot be resolved. + + + + Retrieves a function that can be used to lazily resolve an instance of the service of the given type when needed. + + Type of the service to retrieve. + The function that can resolve to the service instance when invoked. + The requested service has not been registered previously. + + + + Retrieves a function that can be used to lazily resolve an instance of the service of the given type and service constructor arguments when needed. + + Type of the service to retrieve. + Type of the one argument to pass to the factory delegate to create the instace. + The function that can resolve to the service instance with the given constructor arguments when invoked. + The requested service with the given constructor arguments has not been registered previously. + + + + Retrieves a function that can be used to lazily resolve an instance of the service of the given type and service constructor arguments when needed. + + Type of the service to retrieve. + Type of the one argument to pass to the factory delegate to create the instace. + Type of the two argument to pass to the factory delegate to create the instace. + The function that can resolve to the service instance with the given constructor arguments when invoked. + The requested service with the given constructor arguments has not been registered previously. + + + + Retrieves a function that can be used to lazily resolve an instance of the service of the given type and service constructor arguments when needed. + + Type of the service to retrieve. + Type of the one argument to pass to the factory delegate to create the instace. + Type of the two argument to pass to the factory delegate to create the instace. + Type of the three argument to pass to the factory delegate to create the instace. + The function that can resolve to the service instance with the given constructor arguments when invoked. + The requested service with the given constructor arguments has not been registered previously. + + + + Retrieves a function that can be used to lazily resolve an instance of the service of the given type and service constructor arguments when needed. + + Type of the service to retrieve. + Type of the one argument to pass to the factory delegate to create the instace. + Type of the two argument to pass to the factory delegate to create the instace. + Type of the three argument to pass to the factory delegate to create the instace. + Type of the four argument to pass to the factory delegate to create the instace. + The function that can resolve to the service instance with the given constructor arguments when invoked. + The requested service with the given constructor arguments has not been registered previously. + + + + Retrieves a function that can be used to lazily resolve an instance of the service of the given type and service constructor arguments when needed. + + Type of the service to retrieve. + Type of the one argument to pass to the factory delegate to create the instace. + Type of the two argument to pass to the factory delegate to create the instace. + Type of the three argument to pass to the factory delegate to create the instace. + Type of the four argument to pass to the factory delegate to create the instace. + Type of the five argument to pass to the factory delegate to create the instace. + The function that can resolve to the service instance with the given constructor arguments when invoked. + The requested service with the given constructor arguments has not been registered previously. + + + + Retrieves a function that can be used to lazily resolve an instance of the service of the given type and service constructor arguments when needed. + + Type of the service to retrieve. + Type of the one argument to pass to the factory delegate to create the instace. + Type of the two argument to pass to the factory delegate to create the instace. + Type of the three argument to pass to the factory delegate to create the instace. + Type of the four argument to pass to the factory delegate to create the instace. + Type of the five argument to pass to the factory delegate to create the instace. + Type of the six argument to pass to the factory delegate to create the instace. + The function that can resolve to the service instance with the given constructor arguments when invoked. + The requested service with the given constructor arguments has not been registered previously. + + + + Retrieves a function that can be used to lazily resolve an instance of the service with the given name when needed. + + Type of the service to retrieve. + Name of the service to retrieve. + The function that can resolve to the service instance with the given name when invoked. + The requested service with the given name has not been registered previously. + + + + Retrieves a function that can be used to lazily resolve an instance of the service of the given type, name and service constructor arguments when needed. + + Type of the service to retrieve. + Type of the one argument to pass to the factory delegate to create the instace. + Name of the service to retrieve. + The function that can resolve to the service instance with the given and service constructor arguments name when invoked. + The requested service with the given name and constructor arguments has not been registered previously. + + + + Retrieves a function that can be used to lazily resolve an instance of the service of the given type, name and service constructor arguments when needed. + + Type of the service to retrieve. + Type of the one argument to pass to the factory delegate to create the instace. + Type of the two argument to pass to the factory delegate to create the instace. + Name of the service to retrieve. + The function that can resolve to the service instance with the given and service constructor arguments name when invoked. + The requested service with the given name and constructor arguments has not been registered previously. + + + + Retrieves a function that can be used to lazily resolve an instance of the service of the given type, name and service constructor arguments when needed. + + Type of the service to retrieve. + Type of the one argument to pass to the factory delegate to create the instace. + Type of the two argument to pass to the factory delegate to create the instace. + Type of the three argument to pass to the factory delegate to create the instace. + Name of the service to retrieve. + The function that can resolve to the service instance with the given and service constructor arguments name when invoked. + The requested service with the given name and constructor arguments has not been registered previously. + + + + Retrieves a function that can be used to lazily resolve an instance of the service of the given type, name and service constructor arguments when needed. + + Type of the service to retrieve. + Type of the one argument to pass to the factory delegate to create the instace. + Type of the two argument to pass to the factory delegate to create the instace. + Type of the three argument to pass to the factory delegate to create the instace. + Type of the four argument to pass to the factory delegate to create the instace. + Name of the service to retrieve. + The function that can resolve to the service instance with the given and service constructor arguments name when invoked. + The requested service with the given name and constructor arguments has not been registered previously. + + + + Retrieves a function that can be used to lazily resolve an instance of the service of the given type, name and service constructor arguments when needed. + + Type of the service to retrieve. + Type of the one argument to pass to the factory delegate to create the instace. + Type of the two argument to pass to the factory delegate to create the instace. + Type of the three argument to pass to the factory delegate to create the instace. + Type of the four argument to pass to the factory delegate to create the instace. + Type of the five argument to pass to the factory delegate to create the instace. + Name of the service to retrieve. + The function that can resolve to the service instance with the given and service constructor arguments name when invoked. + The requested service with the given name and constructor arguments has not been registered previously. + + + + Retrieves a function that can be used to lazily resolve an instance of the service of the given type, name and service constructor arguments when needed. + + Type of the service to retrieve. + Type of the one argument to pass to the factory delegate to create the instace. + Type of the two argument to pass to the factory delegate to create the instace. + Type of the three argument to pass to the factory delegate to create the instace. + Type of the four argument to pass to the factory delegate to create the instace. + Type of the five argument to pass to the factory delegate to create the instace. + Type of the six argument to pass to the factory delegate to create the instace. + Name of the service to retrieve. + The function that can resolve to the service instance with the given and service constructor arguments name when invoked. + The requested service with the given name and constructor arguments has not been registered previously. @@ -6629,18 +6839,6 @@ Visual Studio intellisense experience. - - - - - - - - - - - - Funqlets are a set of components provided as a package @@ -6649,27 +6847,23 @@ - Configure the given container with the - registrations provided by the funqlet. + Configure the given container with the registrations provided by the funqlet. Container to register. - Interface used by plugins to contribute registrations - to an existing container. + Interface used by plugins to contribute registrations to an existing container. - Determines who is responsible for disposing instances - registered with a container. + Determines who is responsible for disposing instances registered with a container. - Container should dispose provided instances when it is disposed. This is the - default. + Container should dispose provided instances when it is disposed. This is the default. @@ -6709,27 +6903,24 @@ - Instances are reused within a container hierarchy. Instances - are created (if necessary) in the container where the registration + Instances are reused within a container hierarchy. Instances are created (if necessary) in the container where the registration was performed, and are reused by all descendent containers. - Instances are reused only at the given container. Descendent - containers do not reuse parent container instances and get + Instances are reused only at the given container. Descendent containers do not reuse parent container instances and get a new instance at their level. - Each request to resolve the dependency will result in a new - instance being returned. + Each request to resolve the dependency will result in a new instance being returned. - Instaces are reused within the given request + Instaces are reused within the given request. @@ -6764,15 +6955,14 @@ visibility of instances across containers and hierarchies. - + The Func delegate that creates instances of the service. - The cached service instance if the scope is or - . + The cached service instance if the scope is or . diff --git a/src/ServiceStack.Redis.sln.DotSettings b/src/ServiceStack.Redis.sln.DotSettings deleted file mode 100644 index 11f2c267..00000000 --- a/src/ServiceStack.Redis.sln.DotSettings +++ /dev/null @@ -1,3 +0,0 @@ - - <data><IncludeFilters /><ExcludeFilters /></data> - <data /> \ No newline at end of file diff --git a/src/ServiceStack.Redis/BasicRedisClientManager.cs b/src/ServiceStack.Redis/BasicRedisClientManager.cs index 7938ff23..c67c662f 100644 --- a/src/ServiceStack.Redis/BasicRedisClientManager.cs +++ b/src/ServiceStack.Redis/BasicRedisClientManager.cs @@ -80,9 +80,6 @@ public BasicRedisClientManager( RedisResolver = new RedisResolver(readWriteHosts, readOnlyHosts); this.OnFailover = new List>(); - - JsConfig.InitStatics(); - this.OnStart(); } @@ -126,7 +123,7 @@ private RedisClient InitNewClient(RedisClient client) if (this.NamespacePrefix != null) client.NamespacePrefix = NamespacePrefix; if (Db != null && client.Db != Db) //Reset database to default if changed - client.ChangeDb(Db.Value); + client.Select(Db.Value); return client; } diff --git a/src/ServiceStack.Redis/Commands.cs b/src/ServiceStack.Redis/Commands.cs index bf4c7e62..8835b961 100644 --- a/src/ServiceStack.Redis/Commands.cs +++ b/src/ServiceStack.Redis/Commands.cs @@ -1,5 +1,4 @@ using System; -using ServiceStack.Text; namespace ServiceStack.Redis { diff --git a/src/ServiceStack.Redis/Generic/RedisTypedClient.cs b/src/ServiceStack.Redis/Generic/RedisTypedClient.cs index bfa10976..3773e276 100644 --- a/src/ServiceStack.Redis/Generic/RedisTypedClient.cs +++ b/src/ServiceStack.Redis/Generic/RedisTypedClient.cs @@ -21,30 +21,29 @@ namespace ServiceStack.Redis.Generic { + public abstract class RedisTypedClient + { + internal protected static HashSet __uniqueTypes = new HashSet(); + } + /// /// Allows you to get Redis value operations to operate against POCO types. /// /// - public partial class RedisTypedClient - : IRedisTypedClient + public partial class RedisTypedClient : RedisTypedClient, IRedisTypedClient { static RedisTypedClient() { - Redis.RedisClient.__uniqueTypes.Add(typeof(T)); + __uniqueTypes.Add(typeof(T)); + LicenseUtils.AssertValidUsage(LicenseFeature.Redis, QuotaType.Types, __uniqueTypes.Count); } readonly ITypeSerializer serializer = new JsonSerializer(); - private readonly RedisClient client; - public IRedisClient RedisClient - { - get { return client; } - } + private readonly RedisClient client; + public IRedisClient RedisClient { get { return client; } } - public IRedisNativeClient NativeClient - { - get { return client; } - } + public IRedisNativeClient NativeClient { get { return client; } } /// /// Use this to share the same redis connection with another diff --git a/src/ServiceStack.Redis/Generic/RedisTypedClient_SortedSet.cs b/src/ServiceStack.Redis/Generic/RedisTypedClient_SortedSet.cs index 31113595..9cc7b09d 100644 --- a/src/ServiceStack.Redis/Generic/RedisTypedClient_SortedSet.cs +++ b/src/ServiceStack.Redis/Generic/RedisTypedClient_SortedSet.cs @@ -21,8 +21,7 @@ public partial class RedisTypedClient { public IHasNamed> SortedSets { get; set; } - internal class RedisClientSortedSets - : IHasNamed> + internal class RedisClientSortedSets : IHasNamed> { private readonly RedisTypedClient client; diff --git a/src/ServiceStack.Redis/Pipeline/RedisAllPurposePipeline.cs b/src/ServiceStack.Redis/Pipeline/RedisAllPurposePipeline.cs index 9b08b858..1bfa7a0b 100644 --- a/src/ServiceStack.Redis/Pipeline/RedisAllPurposePipeline.cs +++ b/src/ServiceStack.Redis/Pipeline/RedisAllPurposePipeline.cs @@ -10,11 +10,9 @@ public class RedisAllPurposePipeline : RedisCommandQueue, IRedisPipeline /// General purpose pipeline /// /// - public RedisAllPurposePipeline(RedisClient redisClient) - : base(redisClient) + public RedisAllPurposePipeline(RedisClient redisClient) : base(redisClient) { Init(); - } protected virtual void Init() @@ -48,7 +46,7 @@ public void Flush() { // The connection cannot be reused anymore. All queued commands have been sent to redis. Even if a new command is executed, the next response read from the // network stream can be the response of one of the queued commands, depending on when the exception occurred. This response would be invalid for the new command. - RedisClient.DisposeConnection(); + RedisClient.Dispose(); throw; } diff --git a/src/ServiceStack.Redis/PooledRedisClientManager.cs b/src/ServiceStack.Redis/PooledRedisClientManager.cs index 53a0b0a9..1702f1b5 100644 --- a/src/ServiceStack.Redis/PooledRedisClientManager.cs +++ b/src/ServiceStack.Redis/PooledRedisClientManager.cs @@ -140,8 +140,6 @@ public PooledRedisClientManager( ? poolTimeOutSeconds * 1000 : 2000; //Default Timeout - JsConfig.InitStatics(); - if (this.Config.AutoStart) { this.OnStart(); @@ -507,7 +505,7 @@ private RedisClient InitClient(RedisClient client) if (this.NamespacePrefix != null) client.NamespacePrefix = NamespacePrefix; if (Db != null && client.Db != Db) //Reset database to default if changed - client.ChangeDb(Db.Value); + client.Select(Db.Value); return client; } @@ -756,7 +754,7 @@ protected void Dispose(RedisClient redisClient) if (redisClient == null) return; try { - redisClient.DisposeConnection(); + redisClient.Dispose(); } catch (Exception ex) { diff --git a/src/ServiceStack.Redis/Properties/AssemblyInfo.cs b/src/ServiceStack.Redis/Properties/AssemblyInfo.cs index d58a4563..e4b49875 100644 --- a/src/ServiceStack.Redis/Properties/AssemblyInfo.cs +++ b/src/ServiceStack.Redis/Properties/AssemblyInfo.cs @@ -33,4 +33,4 @@ // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("5.0.0.0")] -[assembly: AssemblyFileVersion("5.0.0.0")] +[assembly: AssemblyFileVersion("5.1.0.0")] diff --git a/src/ServiceStack.Redis/RedisClient.ICacheClient.cs b/src/ServiceStack.Redis/RedisClient.ICacheClient.cs index 26ff6681..bbf735e0 100644 --- a/src/ServiceStack.Redis/RedisClient.ICacheClient.cs +++ b/src/ServiceStack.Redis/RedisClient.ICacheClient.cs @@ -19,8 +19,7 @@ namespace ServiceStack.Redis { - public partial class RedisClient - : ICacheClient + public partial class RedisClient : ICacheClient { public T Exec(Func action) { diff --git a/src/ServiceStack.Redis/RedisClient.cs b/src/ServiceStack.Redis/RedisClient.cs index 26b79066..33b125ba 100644 --- a/src/ServiceStack.Redis/RedisClient.cs +++ b/src/ServiceStack.Redis/RedisClient.cs @@ -30,76 +30,48 @@ namespace ServiceStack.Redis /// e.g. RedisClient.Lists => IList[string] /// RedisClient.Sets => ICollection[string] /// - public partial class RedisClient - : RedisNativeClient, IRedisClient, IRemoveByPattern // IRemoveByPattern is implemented in this file. + public partial class RedisClient : RedisNativeClient, IRedisClient, IRemoveByPattern // IRemoveByPattern is implemented in this file. { - public RedisClient() + private static Func> convertToHashFn; + public static Func> ConvertToHashFn { - Init(); + get { return convertToHashFn ?? (convertToHashFn = x => x.ToJson().FromJson>()); } + set { convertToHashFn = value; } } - internal static HashSet __uniqueTypes = new HashSet(); - - public static Func NewFactoryFn = () => new RedisClient(); - - public static Func> ConvertToHashFn = - x => x.ToJson().FromJson>(); + private static Func newFactoryFn; + public static Func NewFactoryFn + { + get { return newFactoryFn ?? (newFactoryFn = () => new RedisClient()); } + set { newFactoryFn = value; } + } /// /// Creates a new instance of the Redis Client from NewFactoryFn. /// - public static RedisClient New() - { - return NewFactoryFn(); - } + public static RedisClient New() => NewFactoryFn(); - public RedisClient(string host) - : base(host) - { - Init(); - } - - public RedisClient(RedisEndpoint config) - : base(config) - { - Init(); - } + public RedisClient() => Init(); - public RedisClient(string host, int port) - : base(host, port) - { - Init(); - } + public RedisClient(string host) : base(host) => Init(); public RedisClient(string host, int port, string password = null, long db = RedisConfig.DefaultDb) - : base(host, port, password, db) - { - Init(); - } + : base(host, port, password, db) => Init(); - public RedisClient(Uri uri) - : base(uri.Host, uri.Port) - { - var password = !string.IsNullOrEmpty(uri.UserInfo) ? uri.UserInfo.Split(':').Last() : null; - Password = password; - Init(); - } + public RedisClient(Uri uri) + : base(uri.Host, uri.Port, string.IsNullOrEmpty(uri.UserInfo) ? uri.UserInfo.Split(':').Last() : null) => Init(); + + public RedisClient(RedisEndpoint redisEndpoint) : base(redisEndpoint) => Init(); - public void Init() + private void Init() { this.Lists = new RedisClientLists(this); + this.Hashes = new RedisClientHashes(this); this.Sets = new RedisClientSets(this); this.SortedSets = new RedisClientSortedSets(this); - this.Hashes = new RedisClientHashes(this); - } - - public string this[string key] - { - get { return GetValue(key); } - set { SetValue(key, value); } } - public override void OnConnected() { } + public string this[string key] { get { return GetValue(key); } set { SetValue(key, value); } } public RedisText Custom(params object[] cmdWithArgs) { @@ -122,11 +94,7 @@ public RedisText Custom(params object[] cmdWithArgs) public void SetValue(string key, string value) { - var bytesValue = value != null - ? value.ToUtf8Bytes() - : null; - - base.Set(key, bytesValue); + base.Set(key, value.ToUtf8Bytes()); } public bool SetValue(byte[] key, byte[] value, TimeSpan expireIn) @@ -145,9 +113,7 @@ public bool SetValue(byte[] key, byte[] value, TimeSpan expireIn) public void SetValue(string key, string value, TimeSpan expireIn) { - var bytesValue = value != null - ? value.ToUtf8Bytes() - : null; + var bytesValue = value.ToUtf8Bytes(); if (AssertServerVersionNumber() >= 2610) { @@ -244,10 +210,7 @@ public void SetAll(Dictionary map) public string GetValue(string key) { - var bytes = Get(key); - return bytes == null - ? null - : bytes.FromUtf8Bytes(); + return Get(key).FromUtf8Bytes(); } public string GetAndSetValue(string key, string value) @@ -381,9 +344,7 @@ public IRedisTypedClient As() { try { - var typedClient = new RedisTypedClient(this); - LicenseUtils.AssertValidUsage(LicenseFeature.Redis, QuotaType.Types, __uniqueTypes.Count); - return typedClient; + return new RedisTypedClient(this); } catch (TypeInitializationException ex) { diff --git a/src/ServiceStack.Redis/RedisClientList.cs b/src/ServiceStack.Redis/RedisClientList.cs index 8d80b101..5ffd5b51 100644 --- a/src/ServiceStack.Redis/RedisClientList.cs +++ b/src/ServiceStack.Redis/RedisClientList.cs @@ -19,8 +19,7 @@ namespace ServiceStack.Redis /// /// Wrap the common redis list operations under a IList[string] interface. /// - internal class RedisClientList - : IRedisList + internal class RedisClientList : IRedisList { private readonly RedisClient client; private readonly string listId; diff --git a/src/ServiceStack.Redis/RedisClientSortedSet.cs b/src/ServiceStack.Redis/RedisClientSortedSet.cs index 78086aec..8cd25d59 100644 --- a/src/ServiceStack.Redis/RedisClientSortedSet.cs +++ b/src/ServiceStack.Redis/RedisClientSortedSet.cs @@ -144,12 +144,12 @@ public void RemoveRangeByScore(double fromScore, double toScore) public void StoreFromIntersect(params IRedisSortedSet[] ofSets) { - client.StoreIntersectFromSortedSets(setId, ofSets.GetIds()); + client.StoreIntersectFromSortedSets(setId, ofSets.GetIds()); } public void StoreFromUnion(params IRedisSortedSet[] ofSets) { - client.StoreUnionFromSortedSets(setId, ofSets.GetIds()); + client.StoreUnionFromSortedSets(setId, ofSets.GetIds()); } public long GetItemIndex(string value) diff --git a/src/ServiceStack.Redis/RedisClient_Admin.cs b/src/ServiceStack.Redis/RedisClient_Admin.cs index 0dc7e3f1..846b40ef 100644 --- a/src/ServiceStack.Redis/RedisClient_Admin.cs +++ b/src/ServiceStack.Redis/RedisClient_Admin.cs @@ -17,8 +17,7 @@ namespace ServiceStack.Redis { - public partial class RedisClient - : IRedisClient + public partial class RedisClient : IRedisClient { public void SetConfig(string configItem, string value) { @@ -32,7 +31,7 @@ public RedisText GetServerRoleInfo() public string GetConfig(string configItem) { - var sb = StringBuilderCache.Allocate(); + var sb = new StringBuilder(); var byteArray = base.ConfigGet(configItem); const int startAt = 1; //skip repeating config name for (var i = startAt; i < byteArray.Length; i++) @@ -43,7 +42,7 @@ public string GetConfig(string configItem) sb.Append(bytes.FromUtf8Bytes()); } - return StringBuilderCache.ReturnAndFree(sb); + return sb.ToString(); } public void SaveConfig() diff --git a/src/ServiceStack.Redis/RedisClient_Set.cs b/src/ServiceStack.Redis/RedisClient_Set.cs index 8b18f169..21ea524b 100644 --- a/src/ServiceStack.Redis/RedisClient_Set.cs +++ b/src/ServiceStack.Redis/RedisClient_Set.cs @@ -13,21 +13,17 @@ using System; using System.Collections.Generic; using System.Linq; -using ServiceStack.Common; using ServiceStack.Model; using ServiceStack.Redis.Generic; using ServiceStack.Redis.Pipeline; -using ServiceStack.Text; namespace ServiceStack.Redis { - public partial class RedisClient - : IRedisClient + public partial class RedisClient : IRedisClient { public IHasNamed Sets { get; set; } - internal class RedisClientSets - : IHasNamed + internal class RedisClientSets : IHasNamed { private readonly RedisClient client; diff --git a/src/ServiceStack.Redis/RedisClient_Slowlog.cs b/src/ServiceStack.Redis/RedisClient_Slowlog.cs index eb36f3b9..79508b6a 100644 --- a/src/ServiceStack.Redis/RedisClient_Slowlog.cs +++ b/src/ServiceStack.Redis/RedisClient_Slowlog.cs @@ -18,8 +18,7 @@ namespace ServiceStack.Redis { - public partial class RedisClient - : IRedisClient + public partial class RedisClient : IRedisClient { public IEnumerable GetSlowlog(int? numberOfRecords = null) { diff --git a/src/ServiceStack.Redis/RedisClient_SortedSet.cs b/src/ServiceStack.Redis/RedisClient_SortedSet.cs index fd909c57..277ff198 100644 --- a/src/ServiceStack.Redis/RedisClient_SortedSet.cs +++ b/src/ServiceStack.Redis/RedisClient_SortedSet.cs @@ -24,8 +24,7 @@ public partial class RedisClient : IRedisClient { public IHasNamed SortedSets { get; set; } - internal class RedisClientSortedSets - : IHasNamed + internal class RedisClientSortedSets : IHasNamed { private readonly RedisClient client; @@ -51,7 +50,7 @@ public IRedisSortedSet this[string setId] public static double GetLexicalScore(string value) { - if (String.IsNullOrEmpty(value)) + if (string.IsNullOrEmpty(value)) return 0; var lexicalValue = 0; diff --git a/src/ServiceStack.Redis/RedisEndpoint.cs b/src/ServiceStack.Redis/RedisEndpoint.cs index 4ec125d2..80c27a58 100644 --- a/src/ServiceStack.Redis/RedisEndpoint.cs +++ b/src/ServiceStack.Redis/RedisEndpoint.cs @@ -1,34 +1,25 @@ using System; using System.Collections.Generic; -using System.ComponentModel; using System.Text; -using ServiceStack.IO; -using ServiceStack.Text; namespace ServiceStack.Redis { - public class RedisEndpoint : IEndpoint + public sealed class RedisEndpoint { - public RedisEndpoint() - { - Host = RedisConfig.DefaultHost; - Port = RedisConfig.DefaultPort; - Db = RedisConfig.DefaultDb; - - ConnectTimeout = RedisConfig.DefaultConnectTimeout; - SendTimeout = RedisConfig.DefaultSendTimeout; - ReceiveTimeout = RedisConfig.DefaultReceiveTimeout; - RetryTimeout = RedisConfig.DefaultRetryTimeout; - IdleTimeOutSecs = RedisConfig.DefaultIdleTimeOutSecs; - } + public RedisEndpoint() : this(RedisConfig.DefaultHost, RedisConfig.DefaultPort) { } public RedisEndpoint(string host, int port, string password = null, long db = RedisConfig.DefaultDb) - : this() { this.Host = host; this.Port = port; this.Password = password; this.Db = db; + + ConnectTimeout = RedisConfig.DefaultConnectTimeout; + SendTimeout = RedisConfig.DefaultSendTimeout; + ReceiveTimeout = RedisConfig.DefaultReceiveTimeout; + RetryTimeout = RedisConfig.DefaultRetryTimeout; + IdleTimeOutSecs = RedisConfig.DefaultIdleTimeOutSecs; } public string Host { get; set; } @@ -47,7 +38,7 @@ public RedisEndpoint(string host, int port, string password = null, long db = Re public override string ToString() { - var sb = StringBuilderCache.Allocate(); + var sb = new StringBuilder(); sb.AppendFormat("{0}:{1}", Host, Port); var args = new List(); @@ -75,7 +66,7 @@ public override string ToString() if (args.Count > 0) sb.Append("?").Append(string.Join("&", args)); - return StringBuilderCache.ReturnAndFree(sb); + return sb.ToString(); } protected bool Equals(RedisEndpoint other) diff --git a/src/ServiceStack.Redis/RedisException.cs b/src/ServiceStack.Redis/RedisException.cs index 1ac91259..6533e9b0 100644 --- a/src/ServiceStack.Redis/RedisException.cs +++ b/src/ServiceStack.Redis/RedisException.cs @@ -5,16 +5,10 @@ namespace ServiceStack.Redis /// /// Redis-specific exception. Thrown if unable to connect to Redis server due to socket exception, for example. /// - public class RedisException - : Exception - { - public RedisException(string message) - : base(message) - { - } - public RedisException(string message, Exception innerException) - : base(message, innerException) - { - } - } + public class RedisException : Exception + { + public RedisException(string message) : base(message) { } + + public RedisException(string message, Exception innerException) : base(message, innerException) { } + } } \ No newline at end of file diff --git a/src/ServiceStack.Redis/RedisExtensions.cs b/src/ServiceStack.Redis/RedisExtensions.cs index f3193ebe..a7a01030 100644 --- a/src/ServiceStack.Redis/RedisExtensions.cs +++ b/src/ServiceStack.Redis/RedisExtensions.cs @@ -16,7 +16,6 @@ using System.Linq; using System.Net.Sockets; using ServiceStack.Model; -using ServiceStack.Text; namespace ServiceStack.Redis { @@ -31,8 +30,9 @@ public static List ToRedisEndPoints(this IEnumerable host public static RedisEndpoint ToRedisEndpoint(this string connectionString, int? defaultPort = null) { - if (connectionString == null) - throw new ArgumentNullException("connectionString"); + if (connectionString.IsNullOrEmpty()) + throw new ArgumentException("The value of argument can not be null or empty.", nameof(connectionString)); + if (connectionString.StartsWith("redis://")) connectionString = connectionString.Substring("redis://".Length); diff --git a/src/ServiceStack.Redis/RedisLock.cs b/src/ServiceStack.Redis/RedisLock.cs index e5a60215..ec5512da 100644 --- a/src/ServiceStack.Redis/RedisLock.cs +++ b/src/ServiceStack.Redis/RedisLock.cs @@ -1,11 +1,9 @@ using System; -using ServiceStack.Common; using ServiceStack.Text; namespace ServiceStack.Redis { - public class RedisLock - : IDisposable + public class RedisLock : IDisposable { private readonly RedisClient redisClient; private readonly string key; diff --git a/src/ServiceStack.Redis/RedisManagerPool.cs b/src/ServiceStack.Redis/RedisManagerPool.cs index 9379664d..1d2d34cb 100644 --- a/src/ServiceStack.Redis/RedisManagerPool.cs +++ b/src/ServiceStack.Redis/RedisManagerPool.cs @@ -7,7 +7,6 @@ using System.Threading; using ServiceStack.Caching; using ServiceStack.Logging; -using ServiceStack.Text; namespace ServiceStack.Redis { @@ -19,7 +18,7 @@ public class RedisPoolConfig /// /// Default pool size used by every new instance of . (default: 40) /// - public static int DefaultMaxPoolSize = 40; + public const int DefaultMaxPoolSize = 40; public RedisPoolConfig() { @@ -36,10 +35,9 @@ public RedisPoolConfig() /// /// Provides thread-safe pooling of redis client connections. All connections are treaded as read and write hosts. /// - public partial class RedisManagerPool - : IRedisClientsManager, IRedisFailover, IHandleClientDispose, IHasRedisResolver + public partial class RedisManagerPool : IRedisClientsManager, IRedisFailover, IHandleClientDispose, IHasRedisResolver { - private static readonly ILog Log = LogManager.GetLogger(typeof(RedisManagerPool)); + private static readonly ILog Logger = LogManager.GetLogger(typeof(RedisManagerPool)); private const string PoolTimeoutError = "Redis Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use."; @@ -68,22 +66,14 @@ public RedisManagerPool(IEnumerable hosts) : this(hosts, null) { } public RedisManagerPool(IEnumerable hosts, RedisPoolConfig config) { - if (hosts == null) - throw new ArgumentNullException("hosts"); - RedisResolver = new RedisResolver(hosts, null); - if (config == null) - config = new RedisPoolConfig(); - - this.OnFailover = new List>(); + OnFailover = new List>(); - this.MaxPoolSize = config.MaxPoolSize; + MaxPoolSize = (config ?? new RedisPoolConfig()).MaxPoolSize; clients = new RedisClient[MaxPoolSize]; poolIndex = 0; - - JsConfig.InitStatics(); } public void FailoverTo(params string[] readWriteHosts) @@ -113,7 +103,7 @@ public void FailoverTo(params string[] readWriteHosts) } catch (Exception ex) { - Log.Error("Error firing OnFailover callback(): ", ex); + Logger.Error("Error firing OnFailover callback(): ", ex); } } } @@ -176,8 +166,8 @@ public IRedisClient GetClient() clients[inactivePoolIndex] == existingClient; if (inactivePoolIndex == -1 || !stillReserved) { - if (Log.IsDebugEnabled) - Log.Debug("clients[inactivePoolIndex] != existingClient: {0}".Fmt(!stillReserved ? "!stillReserved" : "-1")); + if (Logger.IsDebugEnabled) + Logger.Debug("clients[inactivePoolIndex] != existingClient: {0}".Fmt(!stillReserved ? "!stillReserved" : "-1")); Interlocked.Increment(ref RedisState.TotalClientsCreatedOutsidePool); @@ -355,7 +345,7 @@ public Dictionary GetStats() private void AssertValidPool() { - if (clients.Length < 1) + if (clients == null || clients.Length < 1) throw new InvalidOperationException("Need a minimum pool size of 1"); } @@ -405,7 +395,7 @@ protected virtual void Dispose(bool disposing) } catch (Exception ex) { - Log.Error("Error when trying to dispose of PooledRedisClientManager", ex); + Logger.Error("Error when trying to dispose of PooledRedisClientManager", ex); } RedisState.DisposeAllDeactivatedClients(); @@ -418,11 +408,11 @@ protected void Dispose(RedisClient redisClient) if (redisClient == null) return; try { - redisClient.DisposeConnection(); + redisClient.Dispose(); } catch (Exception ex) { - Log.Error(string.Format( + Logger.Error(string.Format( "Error when trying to dispose of RedisClient to host {0}:{1}", redisClient.Host, redisClient.Port), ex); } diff --git a/src/ServiceStack.Redis/RedisNativeClient.cs b/src/ServiceStack.Redis/RedisNativeClient.cs index a3586447..cfc2f7e0 100644 --- a/src/ServiceStack.Redis/RedisNativeClient.cs +++ b/src/ServiceStack.Redis/RedisNativeClient.cs @@ -34,14 +34,13 @@ namespace ServiceStack.Redis /// that commands are not executed properly by redis and Servicestack wont be able to (json) serialize /// the data that comes back. /// - public partial class RedisNativeClient - : IRedisNativeClient + public partial class RedisNativeClient : IRedisNativeClient { - private static readonly ILog log = LogManager.GetLogger(typeof(RedisNativeClient)); + private static readonly ILog Logger = LogManager.GetLogger(typeof(RedisNativeClient)); internal const int Success = 1; internal const int OneGb = 1073741824; - private readonly byte[] endData = new[] { (byte)'\r', (byte)'\n' }; + private readonly byte[] endData = { (byte)'\r', (byte)'\n' }; private int clientPort; private string lastCommand; @@ -84,7 +83,7 @@ internal bool Active internal IHandleClientDispose ClientManager { get; set; } - internal long LastConnectedAtTimestamp; + public long LastConnectedAtTimestamp { get; private set; } public long Id { get; set; } @@ -106,8 +105,6 @@ public int RetryTimeout public int RetryCount { get; set; } public int SendTimeout { get; set; } public int ReceiveTimeout { get; set; } - public string Password { get; set; } - public string Client { get; set; } public int IdleTimeOutSecs { get; set; } public Action ConnectionFilter { get; set; } @@ -145,79 +142,65 @@ internal void EndPipeline() } } - public RedisNativeClient(string connectionString) - : this(connectionString.ToRedisEndpoint()) { } + public RedisNativeClient() : this(RedisConfig.DefaultHost, RedisConfig.DefaultPort) { } - public RedisNativeClient(RedisEndpoint config) - { - Init(config); - } - - public RedisNativeClient(string host, int port) - : this(host, port, null) { } - - public RedisNativeClient(string host, int port, string password = null, long db = RedisConfig.DefaultDb) - { - if (host == null) - throw new ArgumentNullException("host"); + public RedisNativeClient(string connectionString) : this(connectionString.ToRedisEndpoint()) { } - Init(new RedisEndpoint(host, port, password, db)); - } + public RedisNativeClient(string host, int port, string password = null, long db = RedisConfig.DefaultDb) : this(new RedisEndpoint(host, port, password, db)) { } - private void Init(RedisEndpoint config) + public RedisNativeClient(RedisEndpoint redisEndpoint) { - Host = config.Host; - Port = config.Port; - ConnectTimeout = config.ConnectTimeout; - SendTimeout = config.SendTimeout; - ReceiveTimeout = config.ReceiveTimeout; - RetryTimeout = config.RetryTimeout; - Password = config.Password; - NamespacePrefix = config.NamespacePrefix; - Client = config.Client; - Db = config.Db; - Ssl = config.Ssl; - IdleTimeOutSecs = config.IdleTimeOutSecs; + Host = redisEndpoint.Host; + Port = redisEndpoint.Port; + ConnectTimeout = redisEndpoint.ConnectTimeout; + SendTimeout = redisEndpoint.SendTimeout; + ReceiveTimeout = redisEndpoint.ReceiveTimeout; + RetryTimeout = redisEndpoint.RetryTimeout; + NamespacePrefix = redisEndpoint.NamespacePrefix; + Ssl = redisEndpoint.Ssl; + IdleTimeOutSecs = redisEndpoint.IdleTimeOutSecs; ServerVersionNumber = RedisConfig.AssumeServerVersion.GetValueOrDefault(); - JsConfig.InitStatics(); + this.db = redisEndpoint.Db; + this.password = redisEndpoint.Password; + this.client = redisEndpoint.Client; + Connect(); } - public RedisNativeClient() - : this(RedisConfig.DefaultHost, RedisConfig.DefaultPort) { } - #region Common Operations - long db; - public long Db + private long db; + public long Db { get { return db; } set { Select(value); } } + + public void Select(long db) { - get => db; + SendExpectSuccess(Commands.Select, db.ToUtf8Bytes()); + this.db = db; + } - set - { - db = value; + private string password; + public string Password { get { return password; } set { Auth(value); } } - if (HasConnected) - { - ChangeDb(db); - } - } + public void Auth(string password) + { + SendUnmanagedExpectSuccess(Commands.Auth, password.ToUtf8Bytes()); + this.password = password; } - public void ChangeDb(long db) + public long DbSize { - this.db = db; - SendExpectSuccess(Commands.Select, db.ToUtf8Bytes()); + get + { + return SendExpectLong(Commands.DbSize); + } } - public long DbSize => SendExpectLong(Commands.DbSize); - public DateTime LastSave { get { var t = SendExpectLong(Commands.LastSave); return t.FromUnixTime(); - } + } } public Dictionary Info @@ -227,8 +210,7 @@ public Dictionary Info var lines = SendExpectString(Commands.Info); var info = new Dictionary(); - foreach (var line in lines - .Split(new[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries)) + foreach (var line in lines.Split(new[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries)) { var p = line.IndexOf(':'); if (p == -1) continue; @@ -344,7 +326,7 @@ public void DebugSleep(double durationSecs) public byte[] Dump(string key) { if (key == null) - throw new ArgumentNullException("key"); + throw new ArgumentNullException(nameof(key)); return SendExpectData(Commands.Dump, key.ToUtf8Bytes()); } @@ -352,7 +334,7 @@ public byte[] Dump(string key) public byte[] Restore(string key, long expireMs, byte[] dumpValue) { if (key == null) - throw new ArgumentNullException("key"); + throw new ArgumentNullException(nameof(key)); return SendExpectData(Commands.Restore, key.ToUtf8Bytes(), expireMs.ToUtf8Bytes(), dumpValue); } @@ -360,7 +342,7 @@ public byte[] Restore(string key, long expireMs, byte[] dumpValue) public void Migrate(string host, int port, string key, int destinationDb, long timeoutMs) { if (key == null) - throw new ArgumentNullException("key"); + throw new ArgumentNullException(nameof(key)); SendExpectSuccess(Commands.Migrate, host.ToUtf8Bytes(), port.ToUtf8Bytes(), key.ToUtf8Bytes(), destinationDb.ToUtf8Bytes(), timeoutMs.ToUtf8Bytes()); } @@ -368,7 +350,7 @@ public void Migrate(string host, int port, string key, int destinationDb, long t public bool Move(string key, int db) { if (key == null) - throw new ArgumentNullException("key"); + throw new ArgumentNullException(nameof(key)); return SendExpectLong(Commands.Move, key.ToUtf8Bytes(), db.ToUtf8Bytes()) == Success; } @@ -376,7 +358,7 @@ public bool Move(string key, int db) public long ObjectIdleTime(string key) { if (key == null) - throw new ArgumentNullException("key"); + throw new ArgumentNullException(nameof(key)); return SendExpectLong(Commands.Object, Commands.IdleTime, key.ToUtf8Bytes()); } @@ -384,7 +366,7 @@ public long ObjectIdleTime(string key) public string Type(string key) { if (key == null) - throw new ArgumentNullException("key"); + throw new ArgumentNullException(nameof(key)); return SendExpectCode(Commands.Type, key.ToUtf8Bytes()); } @@ -412,7 +394,7 @@ public RedisKeyType GetEntryType(string key) public long StrLen(string key) { if (key == null) - throw new ArgumentNullException("key"); + throw new ArgumentNullException(nameof(key)); return SendExpectLong(Commands.StrLen, key.ToUtf8Bytes()); } @@ -420,7 +402,8 @@ public long StrLen(string key) public void Set(string key, byte[] value) { if (key == null) - throw new ArgumentNullException("key"); + throw new ArgumentNullException(nameof(key)); + value = value ?? TypeConstants.EmptyByteArray; if (value.Length > OneGb) @@ -562,7 +545,7 @@ public void SlowlogReset() public byte[] GetBytes(string key) { if (key == null) - throw new ArgumentNullException("key"); + throw new ArgumentNullException(nameof(key)); return SendExpectData(Commands.Get, key.ToUtf8Bytes()); } @@ -570,7 +553,7 @@ public byte[] GetBytes(string key) public byte[] GetSet(string key, byte[] value) { if (key == null) - throw new ArgumentNullException("key"); + throw new ArgumentNullException(nameof(key)); value = value ?? TypeConstants.EmptyByteArray; @@ -770,7 +753,7 @@ public bool ExpireAt(string key, long unixTime) public bool PExpireAt(string key, long unixTimeMs) { if (key == null) - throw new ArgumentNullException("key"); + throw new ArgumentNullException(nameof(key)); return SendExpectLong(Commands.PExpireAt, key.ToUtf8Bytes(), unixTimeMs.ToUtf8Bytes()) == Success; } @@ -778,7 +761,7 @@ public bool PExpireAt(string key, long unixTimeMs) public long Ttl(string key) { if (key == null) - throw new ArgumentNullException("key"); + throw new ArgumentNullException(nameof(key)); return SendExpectLong(Commands.Ttl, key.ToUtf8Bytes()); } @@ -786,7 +769,7 @@ public long Ttl(string key) public long PTtl(string key) { if (key == null) - throw new ArgumentNullException("key"); + throw new ArgumentNullException(nameof(key)); return SendExpectLong(Commands.PTtl, key.ToUtf8Bytes()); } @@ -841,20 +824,18 @@ public RedisText Role() return SendExpectComplexResponse(Commands.Role).ToRedisText(); } + private string client; + public string Client { get { return client; } set { ClientSetName(value); } } + public string ClientGetName() { - return SendExpectString(Commands.Client, Commands.GetName); + return (client = SendExpectString(Commands.Client, Commands.GetName)); } public void ClientSetName(string name) { - if (string.IsNullOrEmpty(name)) - throw new ArgumentException("Name cannot be null or empty"); - - if (name.Contains(" ")) - throw new ArgumentException("Name cannot contain spaces"); - SendExpectSuccess(Commands.Client, Commands.SetName, name.ToUtf8Bytes()); + this.client = name; } public void ClientPause(int timeOutMs) @@ -1071,7 +1052,6 @@ public void PfMerge(string toKeyId, params string[] fromKeys) #endregion - #region Set Operations public byte[][] SMembers(string setId) @@ -1222,7 +1202,6 @@ public byte[][] SRandMember(string setId, int count) #endregion - #region List Operations public byte[][] LRange(string listId, int startingFrom, int endingAt) @@ -1947,7 +1926,6 @@ public long ZRemRangeByLex(string setId, string min, string max) #endregion - #region Hash Operations private static void AssertHashIdAndKey(object hashId, byte[] key) @@ -2371,10 +2349,12 @@ public List GeoRadiusByMember(string key, string member, double #endregion - internal bool IsDisposed { get; set; } + # region IDisposable public bool IsManagedClient => ClientManager != null; + public bool IsDisposed { get; private set; } + public virtual void Dispose() { Dispose(true); @@ -2401,7 +2381,7 @@ protected virtual void Dispose(bool disposing) } } - internal void DisposeConnection() + private void DisposeConnection() { if (IsDisposed) return; IsDisposed = true; @@ -2414,7 +2394,7 @@ internal void DisposeConnection() } catch (Exception ex) { - log.Error("Error when trying to Quit()", ex); + Logger.Error("Error when trying to Quit()", ex); } finally { @@ -2445,5 +2425,7 @@ private void SafeConnectionClose() sslStream = null; socket = null; } + + #endregion } } diff --git a/src/ServiceStack.Redis/RedisNativeClient_Utils.cs b/src/ServiceStack.Redis/RedisNativeClient_Utils.cs index 3a148a06..f7aabfca 100644 --- a/src/ServiceStack.Redis/RedisNativeClient_Utils.cs +++ b/src/ServiceStack.Redis/RedisNativeClient_Utils.cs @@ -208,7 +208,7 @@ private void Connect() } catch (SocketException) { - log.Error(ErrorConnect.Fmt(Host, Port)); + Logger.Error(ErrorConnect.Fmt(Host, Port)); throw; } } @@ -232,7 +232,7 @@ protected string ReadLine() break; sb.Append((char)c); } - return StringBuilderCache.ReturnAndFree(sb); + return StringBuilderCache.Retrieve(sb); } public bool HasConnected @@ -259,7 +259,7 @@ internal bool AssertConnectedSocket() } catch (SocketException ex) { - log.Error(ErrorConnect.Fmt(Host, Port)); + Logger.Error(ErrorConnect.Fmt(Host, Port)); if (socket != null) socket.Close(); @@ -269,7 +269,7 @@ internal bool AssertConnectedSocket() DeactivatedAt = DateTime.UtcNow; var message = Host + ":" + Port; var throwEx = new RedisException(message, ex); - log.Error(throwEx.Message, ex); + Logger.Error(throwEx.Message, ex); throw throwEx; } } @@ -321,7 +321,7 @@ private RedisResponseException CreateResponseError(string error) } var throwEx = new RedisResponseException(error); - log.Error(error); + Logger.Error(error); return throwEx; } @@ -338,7 +338,7 @@ private RedisRetryableException CreateRetryableResponseError(string error) var throwEx = new RedisRetryableException(string.Format("[{0}] {1}, sPort: {2}, LastCommand: {3}", DateTime.UtcNow.ToString("HH:mm:ss.fff"), error, clientPort, safeLastCommand)); - log.Error(throwEx.Message); + Logger.Error(throwEx.Message); throw throwEx; } @@ -350,7 +350,7 @@ private RedisException CreateConnectionError(Exception originalEx) clientPort, originalEx != null ? ", Error: " + originalEx.Message + "\n" + originalEx.StackTrace : ""), originalEx ?? lastSocketException); - log.Error(throwEx.Message); + Logger.Error(throwEx.Message); throw throwEx; } @@ -385,7 +385,7 @@ protected void WriteCommandToSendBuffer(params byte[][] cmdWithBinaryArgs) LicenseUtils.AssertValidUsage(LicenseFeature.Redis, QuotaType.RequestsPerHour, __requestsPerHour); } - if (log.IsDebugEnabled && !RedisConfig.DisableVerboseLogging) + if (Logger.IsDebugEnabled && !RedisConfig.DisableVerboseLogging) CmdLog(cmdWithBinaryArgs); //Total command lines count @@ -609,7 +609,7 @@ private RedisException CreateRetryTimeoutException(TimeSpan retryTimeout, Except { DeactivatedAt = DateTime.UtcNow; var message = "Exceeded timeout of {0}".Fmt(retryTimeout); - log.Error(message); + Logger.Error(message); return new RedisException(message, originalEx); } @@ -622,7 +622,7 @@ private Exception GetRetryableException(Exception outerEx) if (socketEx == null) return null; - log.Error("SocketException in SendReceive, retrying...", socketEx); + Logger.Error("SocketException in SendReceive, retrying...", socketEx); lastSocketException = socketEx; if (socket != null) @@ -742,7 +742,7 @@ protected void Log(string fmt, params object[] args) if (RedisConfig.DisableVerboseLogging) return; - log.DebugFormat("{0}", string.Format(fmt, args).Trim()); + Logger.DebugFormat("{0}", string.Format(fmt, args).Trim()); } protected void CmdLog(byte[][] args) @@ -761,13 +761,13 @@ protected void CmdLog(byte[][] args) if (sb.Length > 100) break; } - this.lastCommand = StringBuilderCache.ReturnAndFree(sb); + this.lastCommand = StringBuilderCache.Retrieve(sb); if (this.lastCommand.Length > 100) { this.lastCommand = this.lastCommand.Substring(0, 100) + "..."; } - log.Debug("S: " + this.lastCommand); + Logger.Debug("S: " + this.lastCommand); } //Turn Action into Func Hack @@ -785,7 +785,7 @@ protected void ExpectSuccess() var s = ReadLine(); - if (log.IsDebugEnabled) + if (Logger.IsDebugEnabled) Log((char)c + s); if (c == '-') @@ -800,7 +800,7 @@ private void ExpectWord(string word) var s = ReadLine(); - if (log.IsDebugEnabled) + if (Logger.IsDebugEnabled) Log((char)c + s); if (c == '-') @@ -818,7 +818,7 @@ private string ExpectCode() var s = ReadLine(); - if (log.IsDebugEnabled) + if (Logger.IsDebugEnabled) Log((char)c + s); if (c == '-') @@ -845,7 +845,7 @@ public long ReadLong() var s = ReadLine(); - if (log.IsDebugEnabled) + if (Logger.IsDebugEnabled) Log("R: {0}", s); if (c == '-') @@ -884,7 +884,7 @@ private byte[] ReadData() private byte[] ParseSingleLine(string r) { - if (log.IsDebugEnabled) + if (Logger.IsDebugEnabled) Log("R: {0}", r); if (r.Length == 0) throw CreateResponseError("Zero length response"); @@ -937,7 +937,7 @@ private byte[][] ReadMultiData() throw CreateNoMoreDataError(); var s = ReadLine(); - if (log.IsDebugEnabled) + if (Logger.IsDebugEnabled) Log("R: {0}", s); switch (c) @@ -987,7 +987,7 @@ private object ReadDeeplyNestedMultiDataItem() throw CreateNoMoreDataError(); var s = ReadLine(); - if (log.IsDebugEnabled) + if (Logger.IsDebugEnabled) Log("R: {0}", s); switch (c) @@ -1026,7 +1026,7 @@ internal RedisData ReadComplexResponse() throw CreateNoMoreDataError(); var s = ReadLine(); - if (log.IsDebugEnabled) + if (Logger.IsDebugEnabled) Log("R: {0}", s); switch (c) @@ -1068,7 +1068,7 @@ internal int ReadMultiDataResultCount() throw CreateNoMoreDataError(); var s = ReadLine(); - if (log.IsDebugEnabled) + if (Logger.IsDebugEnabled) Log("R: {0}", s); if (c == '-') throw CreateResponseError(s.StartsWith("ERR") ? s.Substring(4) : s); diff --git a/src/ServiceStack.Redis/RedisPubSubServer.cs b/src/ServiceStack.Redis/RedisPubSubServer.cs index c5abe43f..431d92c9 100644 --- a/src/ServiceStack.Redis/RedisPubSubServer.cs +++ b/src/ServiceStack.Redis/RedisPubSubServer.cs @@ -10,7 +10,8 @@ namespace ServiceStack.Redis { public class RedisPubSubServer : IRedisPubSubServer { - private static ILog Log = LogManager.GetLogger(typeof(RedisPubSubServer)); + private static readonly ILog Logger = LogManager.GetLogger(typeof(RedisPubSubServer)); + private DateTime serverTimeAtStart; private Stopwatch startedAt; @@ -114,13 +115,13 @@ public IRedisPubSubServer Start() Name = "RedisPubSubServer " + Interlocked.Increment(ref bgThreadCount) }; bgThread.Start(); - if (Log.IsDebugEnabled) - Log.Debug("Started Background Thread: " + bgThread.Name); + if (Logger.IsDebugEnabled) + Logger.Debug("Started Background Thread: " + bgThread.Name); } else { - if (Log.IsDebugEnabled) - Log.Debug("Retrying RunLoop() on Thread: " + bgThread.Name); + if (Logger.IsDebugEnabled) + Logger.Debug("Retrying RunLoop() on Thread: " + bgThread.Name); RunLoop(); } } @@ -250,14 +251,14 @@ private void RunLoop() switch (op) { case Operation.Stop: - if (Log.IsDebugEnabled) - Log.Debug("Stop Command Issued"); + if (Logger.IsDebugEnabled) + Logger.Debug("Stop Command Issued"); Interlocked.CompareExchange(ref status, Status.Stopping, Status.Started); try { - if (Log.IsDebugEnabled) - Log.Debug("UnSubscribe From All Channels..."); + if (Logger.IsDebugEnabled) + Logger.Debug("UnSubscribe From All Channels..."); subscription.UnSubscribeFromAllChannels(); //Un block thread. } @@ -334,8 +335,8 @@ private void Stop(bool shouldRestart) if (Interlocked.CompareExchange(ref status, Status.Stopping, Status.Started) == Status.Started) { - if (Log.IsDebugEnabled) - Log.Debug("Stopping RedisPubSubServer..."); + if (Logger.IsDebugEnabled) + Logger.Debug("Stopping RedisPubSubServer..."); //Unblock current bgthread by issuing StopCommand SendControlCommand(Operation.Stop); @@ -367,7 +368,7 @@ private void NotifyAllSubscribers(string commandType=null) catch (Exception ex) { OnError?.Invoke(ex); - Log.Warn("Could not send '{0}' message to bg thread: {1}".Fmt(msg, ex.Message)); + Logger.Warn("Could not send '{0}' message to bg thread: {1}".Fmt(msg, ex.Message)); } } @@ -397,15 +398,15 @@ private void HandleFailover(IRedisClientsManager clientsManager) catch (Exception ex) { OnError?.Invoke(ex); - Log.Warn("Error trying to UnSubscribeFromChannels in OnFailover. Restarting...", ex); + Logger.Warn("Error trying to UnSubscribeFromChannels in OnFailover. Restarting...", ex); Restart(); } } void HandleUnSubscribe(string channel) { - if (Log.IsDebugEnabled) - Log.Debug("OnUnSubscribe: " + channel); + if (Logger.IsDebugEnabled) + Logger.Debug("OnUnSubscribe: " + channel); OnUnSubscribe?.Invoke(channel); } @@ -424,11 +425,11 @@ private void KillBgThreadIfExists() { #if !NETSTANDARD2_0 //Ideally we shouldn't get here, but lets try our hardest to clean it up - Log.Warn("Interrupting previous Background Thread: " + bgThread.Name); + Logger.Warn("Interrupting previous Background Thread: " + bgThread.Name); bgThread.Interrupt(); if (!bgThread.Join(TimeSpan.FromSeconds(3))) { - Log.Warn(bgThread.Name + " just wont die, so we're now aborting it..."); + Logger.Warn(bgThread.Name + " just wont die, so we're now aborting it..."); bgThread.Abort(); } #endif @@ -447,8 +448,8 @@ private void SleepBackOffMultiplier(int continuousErrorsCount) rand.Next((int)Math.Pow(continuousErrorsCount, 3), (int)Math.Pow(continuousErrorsCount + 1, 3) + 1), MaxSleepMs); - if (Log.IsDebugEnabled) - Log.Debug("Sleeping for {0}ms after {1} continuous errors".Fmt(nextTry, continuousErrorsCount)); + if (Logger.IsDebugEnabled) + Logger.Debug("Sleeping for {0}ms after {1} continuous errors".Fmt(nextTry, continuousErrorsCount)); TaskUtils.Sleep(nextTry); } @@ -513,7 +514,7 @@ public string GetStatus() public string GetStatsDescription() { - var sb = StringBuilderCache.Allocate(); + var sb = new StringBuilder(); sb.AppendLine("==============="); sb.AppendLine("Current Status: " + GetStatus()); sb.AppendLine("Times Started: " + Interlocked.CompareExchange(ref timesStarted, 0, 0)); @@ -521,7 +522,7 @@ public string GetStatsDescription() sb.AppendLine("Num of Continuous Errors: " + Interlocked.CompareExchange(ref noOfContinuousErrors, 0, 0)); sb.AppendLine("Last ErrorMsg: " + lastExMsg); sb.AppendLine("==============="); - return StringBuilderCache.ReturnAndFree(sb); + return sb.ToString(); } public virtual void Dispose() @@ -540,7 +541,7 @@ public virtual void Dispose() } catch (Exception ex) { - Log.Error("Error OnDispose(): ", ex); + Logger.Error("Error OnDispose(): ", ex); } try diff --git a/src/ServiceStack.Redis/RedisResolver.cs b/src/ServiceStack.Redis/RedisResolver.cs index bbd149e7..ab7ff3f6 100644 --- a/src/ServiceStack.Redis/RedisResolver.cs +++ b/src/ServiceStack.Redis/RedisResolver.cs @@ -3,13 +3,12 @@ using System.Linq; using System.Threading; using ServiceStack.Logging; -using ServiceStack.Text; namespace ServiceStack.Redis { public class RedisResolver : IRedisResolver, IRedisResolverExtended { - static ILog log = LogManager.GetLogger(typeof(RedisResolver)); + private static readonly ILog Logger = LogManager.GetLogger(typeof(RedisResolver)); public Func ClientFactory { get; set; } @@ -31,11 +30,9 @@ public RedisEndpoint[] Slaves get { return slaves; } } - public RedisResolver() - : this(TypeConstants.EmptyArray, TypeConstants.EmptyArray) {} + public RedisResolver() : this(new[] { RedisConfig.DefaultHost }, TypeConstants.EmptyStringArray) { } - public RedisResolver(IEnumerable masters, IEnumerable slaves) - : this(masters.ToRedisEndPoints(), slaves.ToRedisEndPoints()){} + public RedisResolver(IEnumerable masters, IEnumerable slaves) : this(masters.ToRedisEndPoints(), slaves.ToRedisEndPoints()) { } public RedisResolver(IEnumerable masters, IEnumerable slaves) { @@ -52,14 +49,14 @@ public virtual void ResetMasters(IEnumerable hosts) public virtual void ResetMasters(List newMasters) { if (newMasters == null || newMasters.Count == 0) - throw new Exception("Must provide at least 1 master"); + throw new ArgumentException("Must provide at least 1 master", nameof(newMasters)); masters = newMasters.ToArray(); ReadWriteHostsCount = masters.Length; newMasters.Each(x => allHosts.Add(x)); - if (log.IsDebugEnabled) - log.Debug("New Redis Masters: " + string.Join(", ", masters.Map(x => x.GetHostString()))); + if (Logger.IsDebugEnabled) + Logger.Debug("New Redis Masters: " + string.Join(", ", masters.Map(x => x.GetHostString()))); } public virtual void ResetSlaves(IEnumerable hosts) @@ -73,13 +70,13 @@ public virtual void ResetSlaves(List newSlaves) ReadOnlyHostsCount = slaves.Length; newSlaves.Each(x => allHosts.Add(x)); - if (log.IsDebugEnabled) - log.Debug("New Redis Slaves: " + string.Join(", ", slaves.Map(x => x.GetHostString()))); + if (Logger.IsDebugEnabled) + Logger.Debug("New Redis Slaves: " + string.Join(", ", slaves.Map(x => x.GetHostString()))); } - public virtual RedisClient CreateRedisClient(RedisEndpoint config, bool master) + public virtual RedisClient CreateRedisClient(RedisEndpoint redisEP, bool master) { - var client = ClientFactory(config); + var client = ClientFactory(redisEP); if (master && RedisConfig.VerifyMasterConnections) { @@ -87,7 +84,7 @@ public virtual RedisClient CreateRedisClient(RedisEndpoint config, bool master) if (role != RedisServerRole.Master) { Interlocked.Increment(ref RedisState.TotalInvalidMasters); - log.Error("Redis Master Host '{0}' is {1}. Resetting allHosts...".Fmt(config.GetHostString(), role)); + Logger.Error("Redis Master Host '{0}' is {1}. Resetting allHosts...".Fmt(redisEP.GetHostString(), role)); var newMasters = new List(); var newSlaves = new List(); RedisClient masterClient = null; @@ -118,7 +115,7 @@ public virtual RedisClient CreateRedisClient(RedisEndpoint config, bool master) { Interlocked.Increment(ref RedisState.TotalNoMastersFound); var errorMsg = "No master found in: " + string.Join(", ", allHosts.Map(x => x.GetHostString())); - log.Error(errorMsg); + Logger.Error(errorMsg); throw new Exception(errorMsg); } diff --git a/src/ServiceStack.Redis/RedisResponseException.cs b/src/ServiceStack.Redis/RedisResponseException.cs index 00e5c537..987dbc15 100644 --- a/src/ServiceStack.Redis/RedisResponseException.cs +++ b/src/ServiceStack.Redis/RedisResponseException.cs @@ -12,8 +12,7 @@ namespace ServiceStack.Redis { - public class RedisResponseException - : RedisException + public class RedisResponseException : RedisException { public RedisResponseException(string message) : base(message) diff --git a/src/ServiceStack.Redis/RedisState.cs b/src/ServiceStack.Redis/RedisState.cs index 3c6c7b13..5d581cbc 100644 --- a/src/ServiceStack.Redis/RedisState.cs +++ b/src/ServiceStack.Redis/RedisState.cs @@ -12,7 +12,7 @@ namespace ServiceStack.Redis /// internal static class RedisState { - private static ILog log = LogManager.GetLogger(typeof(RedisState)); + private readonly static ILog Logger = LogManager.GetLogger(typeof(RedisState)); internal static long TotalCommandsSent = 0; internal static long TotalFailovers = 0; @@ -37,7 +37,7 @@ internal static void DeactivateClient(RedisClient client) if (RedisConfig.DeactivatedClientsExpiry == TimeSpan.Zero) { - client.DisposeConnection(); + client.Dispose(); return; } @@ -45,7 +45,7 @@ internal static void DeactivateClient(RedisClient client) client.DeactivatedAt = deactivatedAt; if (!DeactivatedClients.TryAdd(client, deactivatedAt)) - client.DisposeConnection(); + client.Dispose(); } internal static void DisposeExpiredClients() @@ -63,10 +63,10 @@ internal static void DisposeExpiredClients() if (now - entry.Value <= RedisConfig.DeactivatedClientsExpiry) continue; - if (log.IsDebugEnabled) - log.Debug("Disposed Deactivated Client: {0}".Fmt(entry.Key.GetHostString())); + if (Logger.IsDebugEnabled) + Logger.Debug("Disposed Deactivated Client: {0}".Fmt(entry.Key.GetHostString())); - entry.Key.DisposeConnection(); + entry.Key.Dispose(); removeDisposed.Add(entry.Key); } catch @@ -94,10 +94,10 @@ internal static void DisposeAllDeactivatedClients() DeactivatedClients.Clear(); foreach (var client in allClients) { - if (log.IsDebugEnabled) - log.Debug("Disposed Deactivated Client (All): {0}".Fmt(client.GetHostString())); + if (Logger.IsDebugEnabled) + Logger.Debug("Disposed Deactivated Client (All): {0}".Fmt(client.GetHostString())); - client.DisposeConnection(); + client.Dispose(); } } } diff --git a/src/ServiceStack.Redis/RedisSubscription.cs b/src/ServiceStack.Redis/RedisSubscription.cs index a7b03cc7..6926e24e 100644 --- a/src/ServiceStack.Redis/RedisSubscription.cs +++ b/src/ServiceStack.Redis/RedisSubscription.cs @@ -1,162 +1,160 @@ using System; using System.Collections.Generic; -using ServiceStack.Text; namespace ServiceStack.Redis { - public class RedisSubscription - : IRedisSubscription - { - private readonly IRedisNativeClient redisClient; - private List activeChannels; + public class RedisSubscription : IRedisSubscription + { + private readonly IRedisNativeClient redisClient; + private List activeChannels; public long SubscriptionCount { get; private set; } - public bool IsPSubscription { get; private set; } - - private const int MsgIndex = 2; - private static readonly byte[] SubscribeWord = "subscribe".ToUtf8Bytes(); - private static readonly byte[] PSubscribeWord = "psubscribe".ToUtf8Bytes(); - private static readonly byte[] UnSubscribeWord = "unsubscribe".ToUtf8Bytes(); - private static readonly byte[] PUnSubscribeWord = "punsubscribe".ToUtf8Bytes(); - private static readonly byte[] MessageWord = "message".ToUtf8Bytes(); - private static readonly byte[] PMessageWord = "pmessage".ToUtf8Bytes(); - - public RedisSubscription(IRedisNativeClient redisClient) - { - this.redisClient = redisClient; - - this.SubscriptionCount = 0; - this.activeChannels = new List(); - } - - public Action OnSubscribe { get; set; } - public Action OnMessage { get; set; } - public Action OnUnSubscribe { get; set; } - - public void SubscribeToChannels(params string[] channels) - { - var multiBytes = redisClient.Subscribe(channels); - ParseSubscriptionResults(multiBytes); - - while (this.SubscriptionCount > 0) - { - multiBytes = redisClient.ReceiveMessages(); - ParseSubscriptionResults(multiBytes); - } - } - - public void SubscribeToChannelsMatching(params string[] patterns) - { - var multiBytes = redisClient.PSubscribe(patterns); - ParseSubscriptionResults(multiBytes); - - while (this.SubscriptionCount > 0) - { - multiBytes = redisClient.ReceiveMessages(); - ParseSubscriptionResults(multiBytes); - } - } - - private void ParseSubscriptionResults(byte[][] multiBytes) - { - int componentsPerMsg = IsPSubscription ? 4 : 3; - for (var i = 0; i < multiBytes.Length; i += componentsPerMsg) - { - var messageType = multiBytes[i]; - var channel = multiBytes[i + 1].FromUtf8Bytes(); - if (SubscribeWord.AreEqual(messageType) - || PSubscribeWord.AreEqual(messageType)) - { - IsPSubscription = PSubscribeWord.AreEqual(messageType); - - this.SubscriptionCount = int.Parse(multiBytes[i + MsgIndex].FromUtf8Bytes()); - - activeChannels.Add(channel); - - if (this.OnSubscribe != null) - { - this.OnSubscribe(channel); - } - } - else if (UnSubscribeWord.AreEqual(messageType) - || PUnSubscribeWord.AreEqual(messageType)) - { - this.SubscriptionCount = int.Parse(multiBytes[i + 2].FromUtf8Bytes()); - - activeChannels.Remove(channel); - - if (this.OnUnSubscribe != null) - { - this.OnUnSubscribe(channel); - } - } - else if (MessageWord.AreEqual(messageType)) - { - var message = multiBytes[i + MsgIndex].FromUtf8Bytes(); - - if (this.OnMessage != null) - { - this.OnMessage(channel, message); - } - } - else if (PMessageWord.AreEqual(messageType)) - { - var message = multiBytes[i + MsgIndex + 1].FromUtf8Bytes(); - channel = multiBytes[i + 2].FromUtf8Bytes(); - if (this.OnMessage != null) - { - this.OnMessage(channel, message); - } - } - else - { - throw new RedisException( - "Invalid state. Expected [[p]subscribe|[p]unsubscribe|message] got: " + messageType.FromUtf8Bytes()); - } - } - } - - public void UnSubscribeFromAllChannels() - { - if (activeChannels.Count == 0) return; - - var multiBytes = redisClient.UnSubscribe(); - ParseSubscriptionResults(multiBytes); - - this.activeChannels = new List(); - } - - public void UnSubscribeFromAllChannelsMatchingAnyPatterns() - { - if (activeChannels.Count == 0) return; - - var multiBytes = redisClient.PUnSubscribe(); - ParseSubscriptionResults(multiBytes); - - this.activeChannels = new List(); - } - - public void UnSubscribeFromChannels(params string[] channels) - { - var multiBytes = redisClient.UnSubscribe(channels); - ParseSubscriptionResults(multiBytes); - } - - public void UnSubscribeFromChannelsMatching(params string[] patterns) - { - var multiBytes = redisClient.PUnSubscribe(patterns); - ParseSubscriptionResults(multiBytes); - } - - public void Dispose() - { - if (IsPSubscription) - { - UnSubscribeFromAllChannelsMatchingAnyPatterns(); - } - else - { - UnSubscribeFromAllChannels(); - } - } - } + public bool IsPSubscription { get; private set; } + + private const int MsgIndex = 2; + private static readonly byte[] SubscribeWord = "subscribe".ToUtf8Bytes(); + private static readonly byte[] PSubscribeWord = "psubscribe".ToUtf8Bytes(); + private static readonly byte[] UnSubscribeWord = "unsubscribe".ToUtf8Bytes(); + private static readonly byte[] PUnSubscribeWord = "punsubscribe".ToUtf8Bytes(); + private static readonly byte[] MessageWord = "message".ToUtf8Bytes(); + private static readonly byte[] PMessageWord = "pmessage".ToUtf8Bytes(); + + public RedisSubscription(IRedisNativeClient redisClient) + { + this.redisClient = redisClient; + + this.SubscriptionCount = 0; + this.activeChannels = new List(); + } + + public Action OnSubscribe { get; set; } + public Action OnMessage { get; set; } + public Action OnUnSubscribe { get; set; } + + public void SubscribeToChannels(params string[] channels) + { + var multiBytes = redisClient.Subscribe(channels); + ParseSubscriptionResults(multiBytes); + + while (this.SubscriptionCount > 0) + { + multiBytes = redisClient.ReceiveMessages(); + ParseSubscriptionResults(multiBytes); + } + } + + public void SubscribeToChannelsMatching(params string[] patterns) + { + var multiBytes = redisClient.PSubscribe(patterns); + ParseSubscriptionResults(multiBytes); + + while (this.SubscriptionCount > 0) + { + multiBytes = redisClient.ReceiveMessages(); + ParseSubscriptionResults(multiBytes); + } + } + + private void ParseSubscriptionResults(byte[][] multiBytes) + { + int componentsPerMsg = IsPSubscription ? 4 : 3; + for (var i = 0; i < multiBytes.Length; i += componentsPerMsg) + { + var messageType = multiBytes[i]; + var channel = multiBytes[i + 1].FromUtf8Bytes(); + if (SubscribeWord.AreEqual(messageType) + || PSubscribeWord.AreEqual(messageType)) + { + IsPSubscription = PSubscribeWord.AreEqual(messageType); + + this.SubscriptionCount = int.Parse(multiBytes[i + MsgIndex].FromUtf8Bytes()); + + activeChannels.Add(channel); + + if (this.OnSubscribe != null) + { + this.OnSubscribe(channel); + } + } + else if (UnSubscribeWord.AreEqual(messageType) + || PUnSubscribeWord.AreEqual(messageType)) + { + this.SubscriptionCount = int.Parse(multiBytes[i + 2].FromUtf8Bytes()); + + activeChannels.Remove(channel); + + if (this.OnUnSubscribe != null) + { + this.OnUnSubscribe(channel); + } + } + else if (MessageWord.AreEqual(messageType)) + { + var message = multiBytes[i + MsgIndex].FromUtf8Bytes(); + + if (this.OnMessage != null) + { + this.OnMessage(channel, message); + } + } + else if (PMessageWord.AreEqual(messageType)) + { + var message = multiBytes[i + MsgIndex + 1].FromUtf8Bytes(); + channel = multiBytes[i + 2].FromUtf8Bytes(); + if (this.OnMessage != null) + { + this.OnMessage(channel, message); + } + } + else + { + throw new RedisException( + "Invalid state. Expected [[p]subscribe|[p]unsubscribe|message] got: " + messageType.FromUtf8Bytes()); + } + } + } + + public void UnSubscribeFromAllChannels() + { + if (activeChannels.Count == 0) return; + + var multiBytes = redisClient.UnSubscribe(); + ParseSubscriptionResults(multiBytes); + + this.activeChannels = new List(); + } + + public void UnSubscribeFromAllChannelsMatchingAnyPatterns() + { + if (activeChannels.Count == 0) return; + + var multiBytes = redisClient.PUnSubscribe(); + ParseSubscriptionResults(multiBytes); + + this.activeChannels = new List(); + } + + public void UnSubscribeFromChannels(params string[] channels) + { + var multiBytes = redisClient.UnSubscribe(channels); + ParseSubscriptionResults(multiBytes); + } + + public void UnSubscribeFromChannelsMatching(params string[] patterns) + { + var multiBytes = redisClient.PUnSubscribe(patterns); + ParseSubscriptionResults(multiBytes); + } + + public void Dispose() + { + if (IsPSubscription) + { + UnSubscribeFromAllChannelsMatchingAnyPatterns(); + } + else + { + UnSubscribeFromAllChannels(); + } + } + } } \ No newline at end of file diff --git a/src/TestMqHost/App.config b/src/TestMqHost/App.config index 58262a1f..713d642a 100644 --- a/src/TestMqHost/App.config +++ b/src/TestMqHost/App.config @@ -1,6 +1,6 @@ - + diff --git a/src/TestMqHost/Program.cs b/src/TestMqHost/Program.cs index 623d0df1..535a04ff 100644 --- a/src/TestMqHost/Program.cs +++ b/src/TestMqHost/Program.cs @@ -2,8 +2,8 @@ using System.Threading; using ServiceStack; using ServiceStack.Logging; +using ServiceStack.Messaging.Redis; using ServiceStack.Redis; -using ServiceStack.Redis.Messaging; using ServiceStack.Text; namespace TestMqHost @@ -68,7 +68,7 @@ static void Main2(string[] args) using (var client = (RedisClient)clientManager.GetClient()) { client.SetConfig("timeout", "1"); - var clientAddrs = client.GetClientList().ConvertAll(x => x["addr"]); + var clientAddrs = client.GetClientsInfo().ConvertAll(x => x["addr"]); log.InfoFormat("Killing clients: {0}...", clientAddrs.Dump()); try diff --git a/src/TestMqHost/Program2.cs b/src/TestMqHost/Program2.cs index 50b7b240..61f0c348 100644 --- a/src/TestMqHost/Program2.cs +++ b/src/TestMqHost/Program2.cs @@ -1,15 +1,15 @@ using System; using System.Diagnostics; using System.Threading; +using ServiceStack; +using ServiceStack.Messaging.Redis; using ServiceStack.Redis; -using ServiceStack.Redis.Messaging; using ServiceStack.Text; namespace TestMqHost { class Program2 { - static void Main(string[] args) { var clientManager = new PooledRedisClientManager(new[] { "localhost" }) diff --git a/src/TestMqHost/Properties/AssemblyInfo.cs b/src/TestMqHost/Properties/AssemblyInfo.cs index 48539a86..a3bba263 100644 --- a/src/TestMqHost/Properties/AssemblyInfo.cs +++ b/src/TestMqHost/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("4.0.0.0")] -[assembly: AssemblyFileVersion("4.0.0.0")] +[assembly: AssemblyVersion("4.5.9.0")] +[assembly: AssemblyFileVersion("5.1.0.0")] diff --git a/src/TestMqHost/TestMqHost.csproj b/src/TestMqHost/TestMqHost.csproj index 14f23ae4..020c995b 100644 --- a/src/TestMqHost/TestMqHost.csproj +++ b/src/TestMqHost/TestMqHost.csproj @@ -9,7 +9,7 @@ Properties TestMqHost TestMqHost - v4.0 + v4.5 512 @@ -22,6 +22,7 @@ DEBUG;TRACE prompt 4 + false AnyCPU @@ -31,15 +32,22 @@ TRACE prompt 4 + false + + ..\..\lib\net45\ServiceStack.dll + False ..\..\lib\net45\ServiceStack.Common.dll False - ..\..\lib\net45\ServiceStack.Interfaces.dll + ..\..\lib\pcl\ServiceStack.Interfaces.dll + + + ..\..\lib\net45\ServiceStack.Server.dll False @@ -63,7 +71,7 @@ - {af99f19b-4c04-4f58-81ef-b092f1fcc540} + {e4f1ba02-4895-4802-a328-898ecf25143d} ServiceStack.Redis diff --git a/src/TestMqHost/TestMqHost.sln b/src/TestMqHost/TestMqHost.sln new file mode 100644 index 00000000..9da77146 --- /dev/null +++ b/src/TestMqHost/TestMqHost.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.26730.12 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestMqHost", "TestMqHost.csproj", "{B932C136-4365-4C37-8187-96703715EBB4}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ServiceStack.Redis", "..\ServiceStack.Redis\ServiceStack.Redis.csproj", "{E4F1BA02-4895-4802-A328-898ECF25143D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B932C136-4365-4C37-8187-96703715EBB4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B932C136-4365-4C37-8187-96703715EBB4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B932C136-4365-4C37-8187-96703715EBB4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B932C136-4365-4C37-8187-96703715EBB4}.Release|Any CPU.Build.0 = Release|Any CPU + {E4F1BA02-4895-4802-A328-898ECF25143D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E4F1BA02-4895-4802-A328-898ECF25143D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E4F1BA02-4895-4802-A328-898ECF25143D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E4F1BA02-4895-4802-A328-898ECF25143D}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {613294E2-968D-4645-ACDA-F09DA667BA0E} + EndGlobalSection +EndGlobal diff --git a/src/sentinel/redis-6380/redis.conf b/src/sentinel/redis-6380/redis.conf index faf4eaf4..36c4a57e 100644 --- a/src/sentinel/redis-6380/redis.conf +++ b/src/sentinel/redis-6380/redis.conf @@ -1,5 +1,964 @@ -# Relative to ./src/sentinel -include redis.conf +# Redis configuration file example +# Note on units: when memory size is needed, it is possible to specify +# it in the usual form of 1k 5GB 4M and so forth: +# +# 1k => 1000 bytes +# 1kb => 1024 bytes +# 1m => 1000000 bytes +# 1mb => 1024*1024 bytes +# 1g => 1000000000 bytes +# 1gb => 1024*1024*1024 bytes +# +# units are case insensitive so 1GB 1Gb 1gB are all the same. + +################################## INCLUDES ################################### + +# Include one or more other config files here. This is useful if you +# have a standard template that goes to all Redis servers but also need +# to customize a few per-server settings. Include files can include +# other files, so use this wisely. +# +# Notice option "include" won't be rewritten by command "CONFIG REWRITE" +# from admin or Redis Sentinel. Since Redis always uses the last processed +# line as value of a configuration directive, you'd better put includes +# at the beginning of this file to avoid overwriting config change at runtime. +# +# If instead you are interested in using includes to override configuration +# options, it is better to use include as the last line. +# +# include .\path\to\local.conf +# include c:\path\to\other.conf + +################################ GENERAL ##################################### + +# On Windows, daemonize and pidfile are not supported. +# However, you can run redis as a Windows service, and specify a logfile. +# The logfile will contain the pid. + +# Accept connections on the specified port, default is 6379. +# If port 0 is specified Redis will not listen on a TCP socket. +# port 6379 port 6380 -dir ./redis-6380/state + +# TCP listen() backlog. +# +# In high requests-per-second environments you need an high backlog in order +# to avoid slow clients connections issues. Note that the Linux kernel +# will silently truncate it to the value of /proc/sys/net/core/somaxconn so +# make sure to raise both the value of somaxconn and tcp_max_syn_backlog +# in order to get the desired effect. +tcp-backlog 511 + +# By default Redis listens for connections from all the network interfaces +# available on the server. It is possible to listen to just one or multiple +# interfaces using the "bind" configuration directive, followed by one or +# more IP addresses. +# +# Examples: +# +# bind 192.168.1.100 10.0.0.1 +bind 127.0.0.1 + +# Specify the path for the Unix socket that will be used to listen for +# incoming connections. There is no default, so Redis will not listen +# on a unix socket when not specified. +# +# unixsocket /tmp/redis.sock +# unixsocketperm 700 + +# Close the connection after a client is idle for N seconds (0 to disable) +timeout 0 + +# TCP keepalive. +# +# If non-zero, use SO_KEEPALIVE to send TCP ACKs to clients in absence +# of communication. This is useful for two reasons: +# +# 1) Detect dead peers. +# 2) Take the connection alive from the point of view of network +# equipment in the middle. +# +# On Linux, the specified value (in seconds) is the period used to send ACKs. +# Note that to close the connection the double of the time is needed. +# On other kernels the period depends on the kernel configuration. +# +# A reasonable value for this option is 60 seconds. +tcp-keepalive 0 + +# Specify the server verbosity level. +# This can be one of: +# debug (a lot of information, useful for development/testing) +# verbose (many rarely useful info, but not a mess like the debug level) +# notice (moderately verbose, what you want in production probably) +# warning (only very important / critical messages are logged) +# loglevel notice +loglevel verbose + +# Specify the log file name. Also 'stdout' can be used to force +# Redis to log on the standard output. +logfile "" + +# To enable logging to the Windows EventLog, just set 'syslog-enabled' to +# yes, and optionally update the other syslog parameters to suit your needs. +# If Redis is installed and launched as a Windows Service, this will +# automatically be enabled. +# syslog-enabled no + +# Specify the source name of the events in the Windows Application log. +# syslog-ident redis + +# Set the number of databases. The default database is DB 0, you can select +# a different one on a per-connection basis using SELECT where +# dbid is a number between 0 and 'databases'-1 +databases 16 + +################################ SNAPSHOTTING ################################ +# +# Save the DB on disk: +# +# save +# +# Will save the DB if both the given number of seconds and the given +# number of write operations against the DB occurred. +# +# In the example below the behaviour will be to save: +# after 900 sec (15 min) if at least 1 key changed +# after 300 sec (5 min) if at least 10 keys changed +# after 60 sec if at least 10000 keys changed +# +# Note: you can disable saving completely by commenting out all "save" lines. +# +# It is also possible to remove all the previously configured save +# points by adding a save directive with a single empty string argument +# like in the following example: +# +# save "" + +save 900 1 +save 300 10 +save 60 10000 + +# By default Redis will stop accepting writes if RDB snapshots are enabled +# (at least one save point) and the latest background save failed. +# This will make the user aware (in a hard way) that data is not persisting +# on disk properly, otherwise chances are that no one will notice and some +# disaster will happen. +# +# If the background saving process will start working again Redis will +# automatically allow writes again. +# +# However if you have setup your proper monitoring of the Redis server +# and persistence, you may want to disable this feature so that Redis will +# continue to work as usual even if there are problems with disk, +# permissions, and so forth. +stop-writes-on-bgsave-error yes + +# Compress string objects using LZF when dump .rdb databases? +# For default that's set to 'yes' as it's almost always a win. +# If you want to save some CPU in the saving child set it to 'no' but +# the dataset will likely be bigger if you have compressible values or keys. +rdbcompression yes + +# Since version 5 of RDB a CRC64 checksum is placed at the end of the file. +# This makes the format more resistant to corruption but there is a performance +# hit to pay (around 10%) when saving and loading RDB files, so you can disable it +# for maximum performances. +# +# RDB files created with checksum disabled have a checksum of zero that will +# tell the loading code to skip the check. +rdbchecksum yes + +# The filename where to dump the DB +dbfilename "dump.rdb" + +# The working directory. +# +# The DB will be written inside this directory, with the filename specified +# above using the 'dbfilename' configuration directive. +# +# The Append Only File will also be created inside this directory. +# +# Note that you must specify a directory here, not a file name. +dir "D:\\ServiceStack\\ServiceStack.Redis\\src\\sentinel\\redis-6380\\" + +################################# REPLICATION ################################# + +# Master-Slave replication. Use slaveof to make a Redis instance a copy of +# another Redis server. A few things to understand ASAP about Redis replication. +# +# 1) Redis replication is asynchronous, but you can configure a master to +# stop accepting writes if it appears to be not connected with at least +# a given number of slaves. +# 2) Redis slaves are able to perform a partial resynchronization with the +# master if the replication link is lost for a relatively small amount of +# time. You may want to configure the replication backlog size (see the next +# sections of this file) with a sensible value depending on your needs. +# 3) Replication is automatic and does not need user intervention. After a +# network partition slaves automatically try to reconnect to masters +# and resynchronize with them. +# +# slaveof + +# If the master is password protected (using the "requirepass" configuration +# directive below) it is possible to tell the slave to authenticate before +# starting the replication synchronization process, otherwise the master will +# refuse the slave request. +# +# masterauth + +# When a slave loses its connection with the master, or when the replication +# is still in progress, the slave can act in two different ways: +# +# 1) if slave-serve-stale-data is set to 'yes' (the default) the slave will +# still reply to client requests, possibly with out of date data, or the +# data set may just be empty if this is the first synchronization. +# +# 2) if slave-serve-stale-data is set to 'no' the slave will reply with +# an error "SYNC with master in progress" to all the kind of commands +# but to INFO and SLAVEOF. +# +slave-serve-stale-data yes + +# You can configure a slave instance to accept writes or not. Writing against +# a slave instance may be useful to store some ephemeral data (because data +# written on a slave will be easily deleted after resync with the master) but +# may also cause problems if clients are writing to it because of a +# misconfiguration. +# +# Since Redis 2.6 by default slaves are read-only. +# +# Note: read only slaves are not designed to be exposed to untrusted clients +# on the internet. It's just a protection layer against misuse of the instance. +# Still a read only slave exports by default all the administrative commands +# such as CONFIG, DEBUG, and so forth. To a limited extent you can improve +# security of read only slaves using 'rename-command' to shadow all the +# administrative / dangerous commands. +slave-read-only yes + +# Replication SYNC strategy: disk or socket. +# +# ------------------------------------------------------- +# WARNING: DISKLESS REPLICATION IS EXPERIMENTAL CURRENTLY +# ------------------------------------------------------- +# +# New slaves and reconnecting slaves that are not able to continue the replication +# process just receiving differences, need to do what is called a "full +# synchronization". An RDB file is transmitted from the master to the slaves. +# The transmission can happen in two different ways: +# +# 1) Disk-backed: The Redis master creates a new process that writes the RDB +# file on disk. Later the file is transferred by the parent +# process to the slaves incrementally. +# 2) Diskless: The Redis master creates a new process that directly writes the +# RDB file to slave sockets, without touching the disk at all. +# +# With disk-backed replication, while the RDB file is generated, more slaves +# can be queued and served with the RDB file as soon as the current child producing +# the RDB file finishes its work. With diskless replication instead once +# the transfer starts, new slaves arriving will be queued and a new transfer +# will start when the current one terminates. +# +# When diskless replication is used, the master waits a configurable amount of +# time (in seconds) before starting the transfer in the hope that multiple slaves +# will arrive and the transfer can be parallelized. +# +# With slow disks and fast (large bandwidth) networks, diskless replication +# works better. +repl-diskless-sync no + +# When diskless replication is enabled, it is possible to configure the delay +# the server waits in order to spawn the child that trnasfers the RDB via socket +# to the slaves. +# +# This is important since once the transfer starts, it is not possible to serve +# new slaves arriving, that will be queued for the next RDB transfer, so the server +# waits a delay in order to let more slaves arrive. +# +# The delay is specified in seconds, and by default is 5 seconds. To disable +# it entirely just set it to 0 seconds and the transfer will start ASAP. +repl-diskless-sync-delay 5 + +# Slaves send PINGs to server in a predefined interval. It's possible to change +# this interval with the repl_ping_slave_period option. The default value is 10 +# seconds. +# +# repl-ping-slave-period 10 + +# The following option sets the replication timeout for: +# +# 1) Bulk transfer I/O during SYNC, from the point of view of slave. +# 2) Master timeout from the point of view of slaves (data, pings). +# 3) Slave timeout from the point of view of masters (REPLCONF ACK pings). +# +# It is important to make sure that this value is greater than the value +# specified for repl-ping-slave-period otherwise a timeout will be detected +# every time there is low traffic between the master and the slave. +# +# repl-timeout 60 + +# Disable TCP_NODELAY on the slave socket after SYNC? +# +# If you select "yes" Redis will use a smaller number of TCP packets and +# less bandwidth to send data to slaves. But this can add a delay for +# the data to appear on the slave side, up to 40 milliseconds with +# Linux kernels using a default configuration. +# +# If you select "no" the delay for data to appear on the slave side will +# be reduced but more bandwidth will be used for replication. +# +# By default we optimize for low latency, but in very high traffic conditions +# or when the master and slaves are many hops away, turning this to "yes" may +# be a good idea. +repl-disable-tcp-nodelay no + +# Set the replication backlog size. The backlog is a buffer that accumulates +# slave data when slaves are disconnected for some time, so that when a slave +# wants to reconnect again, often a full resync is not needed, but a partial +# resync is enough, just passing the portion of data the slave missed while +# disconnected. +# +# The bigger the replication backlog, the longer the time the slave can be +# disconnected and later be able to perform a partial resynchronization. +# +# The backlog is only allocated once there is at least a slave connected. +# +# repl-backlog-size 1mb + +# After a master has no longer connected slaves for some time, the backlog +# will be freed. The following option configures the amount of seconds that +# need to elapse, starting from the time the last slave disconnected, for +# the backlog buffer to be freed. +# +# A value of 0 means to never release the backlog. +# +# repl-backlog-ttl 3600 + +# The slave priority is an integer number published by Redis in the INFO output. +# It is used by Redis Sentinel in order to select a slave to promote into a +# master if the master is no longer working correctly. +# +# A slave with a low priority number is considered better for promotion, so +# for instance if there are three slaves with priority 10, 100, 25 Sentinel will +# pick the one with priority 10, that is the lowest. +# +# However a special priority of 0 marks the slave as not able to perform the +# role of master, so a slave with priority of 0 will never be selected by +# Redis Sentinel for promotion. +# +# By default the priority is 100. +slave-priority 100 + +# It is possible for a master to stop accepting writes if there are less than +# N slaves connected, having a lag less or equal than M seconds. +# +# The N slaves need to be in "online" state. +# +# The lag in seconds, that must be <= the specified value, is calculated from +# the last ping received from the slave, that is usually sent every second. +# +# This option does not GUARANTEE that N replicas will accept the write, but +# will limit the window of exposure for lost writes in case not enough slaves +# are available, to the specified number of seconds. +# +# For example to require at least 3 slaves with a lag <= 10 seconds use: +# +# min-slaves-to-write 3 +# min-slaves-max-lag 10 +# +# Setting one or the other to 0 disables the feature. +# +# By default min-slaves-to-write is set to 0 (feature disabled) and +# min-slaves-max-lag is set to 10. + +################################## SECURITY ################################### + +# Require clients to issue AUTH before processing any other +# commands. This might be useful in environments in which you do not trust +# others with access to the host running redis-server. +# +# This should stay commented out for backward compatibility and because most +# people do not need auth (e.g. they run their own servers). +# +# Warning: since Redis is pretty fast an outside user can try up to +# 150k passwords per second against a good box. This means that you should +# use a very strong password otherwise it will be very easy to break. +# +# requirepass foobared + +# Command renaming. +# +# It is possible to change the name of dangerous commands in a shared +# environment. For instance the CONFIG command may be renamed into something +# hard to guess so that it will still be available for internal-use tools +# but not available for general clients. +# +# Example: +# +# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52 +# +# It is also possible to completely kill a command by renaming it into +# an empty string: +# +# rename-command CONFIG "" +# +# Please note that changing the name of commands that are logged into the +# AOF file or transmitted to slaves may cause problems. + +################################### LIMITS #################################### + +# Set the max number of connected clients at the same time. By default +# this limit is set to 10000 clients, however if the Redis server is not +# able to configure the process file limit to allow for the specified limit +# the max number of allowed clients is set to the current file limit +# minus 32 (as Redis reserves a few file descriptors for internal uses). +# +# Once the limit is reached Redis will close all the new connections sending +# an error 'max number of clients reached'. +# +# maxclients 10000 + +# If Redis is to be used as an in-memory-only cache without any kind of +# persistence, then the fork() mechanism used by the background AOF/RDB +# persistence is unnecessary. As an optimization, all persistence can be +# turned off in the Windows version of Redis. This will redirect heap +# allocations to the system heap allocator, and disable commands that would +# otherwise cause fork() operations: BGSAVE and BGREWRITEAOF. +# This flag may not be combined with any of the other flags that configure +# AOF and RDB operations. +# persistence-available [(yes)|no] + +# Don't use more memory than the specified amount of bytes. +# When the memory limit is reached Redis will try to remove keys +# according to the eviction policy selected (see maxmemory-policy). +# +# If Redis can't remove keys according to the policy, or if the policy is +# set to 'noeviction', Redis will start to reply with errors to commands +# that would use more memory, like SET, LPUSH, and so on, and will continue +# to reply to read-only commands like GET. +# +# This option is usually useful when using Redis as an LRU cache, or to set +# a hard memory limit for an instance (using the 'noeviction' policy). +# +# WARNING: If you have slaves attached to an instance with maxmemory on, +# the size of the output buffers needed to feed the slaves are subtracted +# from the used memory count, so that network problems / resyncs will +# not trigger a loop where keys are evicted, and in turn the output +# buffer of slaves is full with DELs of keys evicted triggering the deletion +# of more keys, and so forth until the database is completely emptied. +# +# In short... if you have slaves attached it is suggested that you set a lower +# limit for maxmemory so that there is some free RAM on the system for slave +# output buffers (but this is not needed if the policy is 'noeviction'). +# +# WARNING: not setting maxmemory will cause Redis to terminate with an +# out-of-memory exception if the heap limit is reached. +# +# NOTE: since Redis uses the system paging file to allocate the heap memory, +# the Working Set memory usage showed by the Windows Task Manager or by other +# tools such as ProcessExplorer will not always be accurate. For example, right +# after a background save of the RDB or the AOF files, the working set value +# may drop significantly. In order to check the correct amount of memory used +# by the redis-server to store the data, use the INFO client command. The INFO +# command shows only the memory used to store the redis data, not the extra +# memory used by the Windows process for its own requirements. Th3 extra amount +# of memory not reported by the INFO command can be calculated subtracting the +# Peak Working Set reported by the Windows Task Manager and the used_memory_peak +# reported by the INFO command. +# +# maxmemory + +# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory +# is reached. You can select among five behaviors: +# +# volatile-lru -> remove the key with an expire set using an LRU algorithm +# allkeys-lru -> remove any key according to the LRU algorithm +# volatile-random -> remove a random key with an expire set +# allkeys-random -> remove a random key, any key +# volatile-ttl -> remove the key with the nearest expire time (minor TTL) +# noeviction -> don't expire at all, just return an error on write operations +# +# Note: with any of the above policies, Redis will return an error on write +# operations, when there are no suitable keys for eviction. +# +# At the date of writing these commands are: set setnx setex append +# incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd +# sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby +# zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby +# getset mset msetnx exec sort +# +# The default is: +# +# maxmemory-policy volatile-lru + +# LRU and minimal TTL algorithms are not precise algorithms but approximated +# algorithms (in order to save memory), so you can select as well the sample +# size to check. For instance for default Redis will check three keys and +# pick the one that was used less recently, you can change the sample size +# using the following configuration directive. +# +# maxmemory-samples 3 + +############################## APPEND ONLY MODE ############################### + +# By default Redis asynchronously dumps the dataset on disk. This mode is +# good enough in many applications, but an issue with the Redis process or +# a power outage may result into a few minutes of writes lost (depending on +# the configured save points). +# +# The Append Only File is an alternative persistence mode that provides +# much better durability. For instance using the default data fsync policy +# (see later in the config file) Redis can lose just one second of writes in a +# dramatic event like a server power outage, or a single write if something +# wrong with the Redis process itself happens, but the operating system is +# still running correctly. +# +# AOF and RDB persistence can be enabled at the same time without problems. +# If the AOF is enabled on startup Redis will load the AOF, that is the file +# with the better durability guarantees. +# +# Please check http://redis.io/topics/persistence for more information. + +appendonly no + +# The name of the append only file (default: "appendonly.aof") +appendfilename "appendonly.aof" + +# The fsync() call tells the Operating System to actually write data on disk +# instead of waiting for more data in the output buffer. Some OS will really flush +# data on disk, some other OS will just try to do it ASAP. +# +# Redis supports three different modes: +# +# no: don't fsync, just let the OS flush the data when it wants. Faster. +# always: fsync after every write to the append only log . Slow, Safest. +# everysec: fsync only one time every second. Compromise. +# +# The default is "everysec", as that's usually the right compromise between +# speed and data safety. It's up to you to understand if you can relax this to +# "no" that will let the operating system flush the output buffer when +# it wants, for better performances (but if you can live with the idea of +# some data loss consider the default persistence mode that's snapshotting), +# or on the contrary, use "always" that's very slow but a bit safer than +# everysec. +# +# More details please check the following article: +# http://antirez.com/post/redis-persistence-demystified.html +# +# If unsure, use "everysec". + +# appendfsync always +appendfsync everysec +# appendfsync no + +# When the AOF fsync policy is set to always or everysec, and a background +# saving process (a background save or AOF log background rewriting) is +# performing a lot of I/O against the disk, in some Linux configurations +# Redis may block too long on the fsync() call. Note that there is no fix for +# this currently, as even performing fsync in a different thread will block +# our synchronous write(2) call. +# +# In order to mitigate this problem it's possible to use the following option +# that will prevent fsync() from being called in the main process while a +# BGSAVE or BGREWRITEAOF is in progress. +# +# This means that while another child is saving, the durability of Redis is +# the same as "appendfsync none". In practical terms, this means that it is +# possible to lose up to 30 seconds of log in the worst scenario (with the +# default Linux settings). +# +# If you have latency problems turn this to "yes". Otherwise leave it as +# "no" that is the safest pick from the point of view of durability. +no-appendfsync-on-rewrite no + +# Automatic rewrite of the append only file. +# Redis is able to automatically rewrite the log file implicitly calling +# BGREWRITEAOF when the AOF log size grows by the specified percentage. +# +# This is how it works: Redis remembers the size of the AOF file after the +# latest rewrite (if no rewrite has happened since the restart, the size of +# the AOF at startup is used). +# +# This base size is compared to the current size. If the current size is +# bigger than the specified percentage, the rewrite is triggered. Also +# you need to specify a minimal size for the AOF file to be rewritten, this +# is useful to avoid rewriting the AOF file even if the percentage increase +# is reached but it is still pretty small. +# +# Specify a percentage of zero in order to disable the automatic AOF +# rewrite feature. + +auto-aof-rewrite-percentage 100 +auto-aof-rewrite-min-size 64mb + +# An AOF file may be found to be truncated at the end during the Redis +# startup process, when the AOF data gets loaded back into memory. +# This may happen when the system where Redis is running +# crashes, especially when an ext4 filesystem is mounted without the +# data=ordered option (however this can't happen when Redis itself +# crashes or aborts but the operating system still works correctly). +# +# Redis can either exit with an error when this happens, or load as much +# data as possible (the default now) and start if the AOF file is found +# to be truncated at the end. The following option controls this behavior. +# +# If aof-load-truncated is set to yes, a truncated AOF file is loaded and +# the Redis server starts emitting a log to inform the user of the event. +# Otherwise if the option is set to no, the server aborts with an error +# and refuses to start. When the option is set to no, the user requires +# to fix the AOF file using the "redis-check-aof" utility before to restart +# the server. +# +# Note that if the AOF file will be found to be corrupted in the middle +# the server will still exit with an error. This option only applies when +# Redis will try to read more data from the AOF file but not enough bytes +# will be found. +aof-load-truncated yes + +################################ LUA SCRIPTING ############################### + +# Max execution time of a Lua script in milliseconds. +# +# If the maximum execution time is reached Redis will log that a script is +# still in execution after the maximum allowed time and will start to +# reply to queries with an error. +# +# When a long running script exceeds the maximum execution time only the +# SCRIPT KILL and SHUTDOWN NOSAVE commands are available. The first can be +# used to stop a script that did not yet called write commands. The second +# is the only way to shut down the server in the case a write command was +# already issued by the script but the user doesn't want to wait for the natural +# termination of the script. +# +# Set it to 0 or a negative value for unlimited execution without warnings. +lua-time-limit 5000 + +################################ REDIS CLUSTER ############################### +# +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# WARNING EXPERIMENTAL: Redis Cluster is considered to be stable code, however +# in order to mark it as "mature" we need to wait for a non trivial percentage +# of users to deploy it in production. +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# +# Normal Redis instances can't be part of a Redis Cluster; only nodes that are +# started as cluster nodes can. In order to start a Redis instance as a +# cluster node enable the cluster support uncommenting the following: +# +# cluster-enabled yes + +# Every cluster node has a cluster configuration file. This file is not +# intended to be edited by hand. It is created and updated by Redis nodes. +# Every Redis Cluster node requires a different cluster configuration file. +# Make sure that instances running in the same system do not have +# overlapping cluster configuration file names. +# +# cluster-config-file nodes-6379.conf + +# Cluster node timeout is the amount of milliseconds a node must be unreachable +# for it to be considered in failure state. +# Most other internal time limits are multiple of the node timeout. +# +# cluster-node-timeout 15000 + +# A slave of a failing master will avoid to start a failover if its data +# looks too old. +# +# There is no simple way for a slave to actually have a exact measure of +# its "data age", so the following two checks are performed: +# +# 1) If there are multiple slaves able to failover, they exchange messages +# in order to try to give an advantage to the slave with the best +# replication offset (more data from the master processed). +# Slaves will try to get their rank by offset, and apply to the start +# of the failover a delay proportional to their rank. +# +# 2) Every single slave computes the time of the last interaction with +# its master. This can be the last ping or command received (if the master +# is still in the "connected" state), or the time that elapsed since the +# disconnection with the master (if the replication link is currently down). +# If the last interaction is too old, the slave will not try to failover +# at all. +# +# The point "2" can be tuned by user. Specifically a slave will not perform +# the failover if, since the last interaction with the master, the time +# elapsed is greater than: +# +# (node-timeout * slave-validity-factor) + repl-ping-slave-period +# +# So for example if node-timeout is 30 seconds, and the slave-validity-factor +# is 10, and assuming a default repl-ping-slave-period of 10 seconds, the +# slave will not try to failover if it was not able to talk with the master +# for longer than 310 seconds. +# +# A large slave-validity-factor may allow slaves with too old data to failover +# a master, while a too small value may prevent the cluster from being able to +# elect a slave at all. +# +# For maximum availability, it is possible to set the slave-validity-factor +# to a value of 0, which means, that slaves will always try to failover the +# master regardless of the last time they interacted with the master. +# (However they'll always try to apply a delay proportional to their +# offset rank). +# +# Zero is the only value able to guarantee that when all the partitions heal +# the cluster will always be able to continue. +# +# cluster-slave-validity-factor 10 + +# Cluster slaves are able to migrate to orphaned masters, that are masters +# that are left without working slaves. This improves the cluster ability +# to resist to failures as otherwise an orphaned master can't be failed over +# in case of failure if it has no working slaves. +# +# Slaves migrate to orphaned masters only if there are still at least a +# given number of other working slaves for their old master. This number +# is the "migration barrier". A migration barrier of 1 means that a slave +# will migrate only if there is at least 1 other working slave for its master +# and so forth. It usually reflects the number of slaves you want for every +# master in your cluster. +# +# Default is 1 (slaves migrate only if their masters remain with at least +# one slave). To disable migration just set it to a very large value. +# A value of 0 can be set but is useful only for debugging and dangerous +# in production. +# +# cluster-migration-barrier 1 + +# By default Redis Cluster nodes stop accepting queries if they detect there +# is at least an hash slot uncovered (no available node is serving it). +# This way if the cluster is partially down (for example a range of hash slots +# are no longer covered) all the cluster becomes, eventually, unavailable. +# It automatically returns available as soon as all the slots are covered again. +# +# However sometimes you want the subset of the cluster which is working, +# to continue to accept queries for the part of the key space that is still +# covered. In order to do so, just set the cluster-require-full-coverage +# option to no. +# +# cluster-require-full-coverage yes + +# In order to setup your cluster make sure to read the documentation +# available at http://redis.io web site. + +################################## SLOW LOG ################################### + +# The Redis Slow Log is a system to log queries that exceeded a specified +# execution time. The execution time does not include the I/O operations +# like talking with the client, sending the reply and so forth, +# but just the time needed to actually execute the command (this is the only +# stage of command execution where the thread is blocked and can not serve +# other requests in the meantime). +# +# You can configure the slow log with two parameters: one tells Redis +# what is the execution time, in microseconds, to exceed in order for the +# command to get logged, and the other parameter is the length of the +# slow log. When a new command is logged the oldest one is removed from the +# queue of logged commands. + +# The following time is expressed in microseconds, so 1000000 is equivalent +# to one second. Note that a negative number disables the slow log, while +# a value of zero forces the logging of every command. +slowlog-log-slower-than 10000 + +# There is no limit to this length. Just be aware that it will consume memory. +# You can reclaim memory used by the slow log with SLOWLOG RESET. +slowlog-max-len 128 + +################################ LATENCY MONITOR ############################## + +# The Redis latency monitoring subsystem samples different operations +# at runtime in order to collect data related to possible sources of +# latency of a Redis instance. +# +# Via the LATENCY command this information is available to the user that can +# print graphs and obtain reports. +# +# The system only logs operations that were performed in a time equal or +# greater than the amount of milliseconds specified via the +# latency-monitor-threshold configuration directive. When its value is set +# to zero, the latency monitor is turned off. +# +# By default latency monitoring is disabled since it is mostly not needed +# if you don't have latency issues, and collecting data has a performance +# impact, that while very small, can be measured under big load. Latency +# monitoring can easily be enalbed at runtime using the command +# "CONFIG SET latency-monitor-threshold " if needed. +latency-monitor-threshold 0 + +############################# Event notification ############################## + +# Redis can notify Pub/Sub clients about events happening in the key space. +# This feature is documented at http://redis.io/topics/notifications +# +# For instance if keyspace events notification is enabled, and a client +# performs a DEL operation on key "foo" stored in the Database 0, two +# messages will be published via Pub/Sub: +# +# PUBLISH __keyspace@0__:foo del +# PUBLISH __keyevent@0__:del foo +# +# It is possible to select the events that Redis will notify among a set +# of classes. Every class is identified by a single character: +# +# K Keyspace events, published with __keyspace@__ prefix. +# E Keyevent events, published with __keyevent@__ prefix. +# g Generic commands (non-type specific) like DEL, EXPIRE, RENAME, ... +# $ String commands +# l List commands +# s Set commands +# h Hash commands +# z Sorted set commands +# x Expired events (events generated every time a key expires) +# e Evicted events (events generated when a key is evicted for maxmemory) +# A Alias for g$lshzxe, so that the "AKE" string means all the events. +# +# The "notify-keyspace-events" takes as argument a string that is composed +# of zero or multiple characters. The empty string means that notifications +# are disabled. +# +# Example: to enable list and generic events, from the point of view of the +# event name, use: +# +# notify-keyspace-events Elg +# +# Example 2: to get the stream of the expired keys subscribing to channel +# name __keyevent@0__:expired use: +# +# notify-keyspace-events Ex +# +# By default all notifications are disabled because most users don't need +# this feature and the feature has some overhead. Note that if you don't +# specify at least one of K or E, no events will be delivered. +notify-keyspace-events "" + +############################### ADVANCED CONFIG ############################### + +# Hashes are encoded using a memory efficient data structure when they have a +# small number of entries, and the biggest entry does not exceed a given +# threshold. These thresholds can be configured using the following directives. +hash-max-ziplist-entries 512 +hash-max-ziplist-value 64 + +# Similarly to hashes, small lists are also encoded in a special way in order +# to save a lot of space. The special representation is only used when +# you are under the following limits: +list-max-ziplist-entries 512 +list-max-ziplist-value 64 + +# Sets have a special encoding in just one case: when a set is composed +# of just strings that happen to be integers in radix 10 in the range +# of 64 bit signed integers. +# The following configuration setting sets the limit in the size of the +# set in order to use this special memory saving encoding. +set-max-intset-entries 512 + +# Similarly to hashes and lists, sorted sets are also specially encoded in +# order to save a lot of space. This encoding is only used when the length and +# elements of a sorted set are below the following limits: +zset-max-ziplist-entries 128 +zset-max-ziplist-value 64 + +# HyperLogLog sparse representation bytes limit. The limit includes the +# 16 bytes header. When an HyperLogLog using the sparse representation crosses +# this limit, it is converted into the dense representation. +# +# A value greater than 16000 is totally useless, since at that point the +# dense representation is more memory efficient. +# +# The suggested value is ~ 3000 in order to have the benefits of +# the space efficient encoding without slowing down too much PFADD, +# which is O(N) with the sparse encoding. The value can be raised to +# ~ 10000 when CPU is not a concern, but space is, and the data set is +# composed of many HyperLogLogs with cardinality in the 0 - 15000 range. +hll-sparse-max-bytes 3000 + +# Active rehashing uses 1 millisecond every 100 milliseconds of CPU time in +# order to help rehashing the main Redis hash table (the one mapping top-level +# keys to values). The hash table implementation Redis uses (see dict.c) +# performs a lazy rehashing: the more operation you run into a hash table +# that is rehashing, the more rehashing "steps" are performed, so if the +# server is idle the rehashing is never complete and some more memory is used +# by the hash table. +# +# The default is to use this millisecond 10 times every second in order to +# actively rehash the main dictionaries, freeing memory when possible. +# +# If unsure: +# use "activerehashing no" if you have hard latency requirements and it is +# not a good thing in your environment that Redis can reply from time to time +# to queries with 2 milliseconds delay. +# +# use "activerehashing yes" if you don't have such hard requirements but +# want to free memory asap when possible. +activerehashing yes + +# The client output buffer limits can be used to force disconnection of clients +# that are not reading data from the server fast enough for some reason (a +# common reason is that a Pub/Sub client can't consume messages as fast as the +# publisher can produce them). +# +# The limit can be set differently for the three different classes of clients: +# +# normal -> normal clients including MONITOR clients +# slave -> slave clients +# pubsub -> clients subscribed to at least one pubsub channel or pattern +# +# The syntax of every client-output-buffer-limit directive is the following: +# +# client-output-buffer-limit +# +# A client is immediately disconnected once the hard limit is reached, or if +# the soft limit is reached and remains reached for the specified number of +# seconds (continuously). +# So for instance if the hard limit is 32 megabytes and the soft limit is +# 16 megabytes / 10 seconds, the client will get disconnected immediately +# if the size of the output buffers reach 32 megabytes, but will also get +# disconnected if the client reaches 16 megabytes and continuously overcomes +# the limit for 10 seconds. +# +# By default normal clients are not limited because they don't receive data +# without asking (in a push way), but just after a request, so only +# asynchronous clients may create a scenario where data is requested faster +# than it can read. +# +# Instead there is a default limit for pubsub and slave clients, since +# subscribers and slaves receive data in a push fashion. +# +# Both the hard or the soft limit can be disabled by setting them to zero. +client-output-buffer-limit normal 0 0 0 +client-output-buffer-limit slave 256mb 64mb 60 +client-output-buffer-limit pubsub 32mb 8mb 60 + +# Redis calls an internal function to perform many background tasks, like +# closing connections of clients in timeot, purging expired keys that are +# never requested, and so forth. +# +# Not all tasks are perforemd with the same frequency, but Redis checks for +# tasks to perform according to the specified "hz" value. +# +# By default "hz" is set to 10. Raising the value will use more CPU when +# Redis is idle, but at the same time will make Redis more responsive when +# there are many keys expiring at the same time, and timeouts may be +# handled with more precision. +# +# The range is between 1 and 500, however a value over 100 is usually not +# a good idea. Most users should use the default of 10 and raise this up to +# 100 only in environments where very low latency is required. +hz 10 + +# When a child rewrites the AOF file, if the following option is enabled +# the file will be fsync-ed every 32 MB of data generated. This is useful +# in order to commit the file to the disk more incrementally and avoid +# big latency spikes. +aof-rewrite-incremental-fsync yes + +################################## INCLUDES ################################### + +# Include one or more other config files here. This is useful if you +# have a standard template that goes to all Redis server but also need +# to customize a few per-server settings. Include files can include +# other files, so use this wisely. +# +# include /path/to/local.conf +# include /path/to/other.conf diff --git a/src/sentinel/redis-6381/redis.conf b/src/sentinel/redis-6381/redis.conf index 0d21c604..40cffbb1 100644 --- a/src/sentinel/redis-6381/redis.conf +++ b/src/sentinel/redis-6381/redis.conf @@ -1,6 +1,966 @@ -# Relative to ./src/sentinel -include redis.conf +# Redis configuration file example +# Note on units: when memory size is needed, it is possible to specify +# it in the usual form of 1k 5GB 4M and so forth: +# +# 1k => 1000 bytes +# 1kb => 1024 bytes +# 1m => 1000000 bytes +# 1mb => 1024*1024 bytes +# 1g => 1000000000 bytes +# 1gb => 1024*1024*1024 bytes +# +# units are case insensitive so 1GB 1Gb 1gB are all the same. + +################################## INCLUDES ################################### + +# Include one or more other config files here. This is useful if you +# have a standard template that goes to all Redis servers but also need +# to customize a few per-server settings. Include files can include +# other files, so use this wisely. +# +# Notice option "include" won't be rewritten by command "CONFIG REWRITE" +# from admin or Redis Sentinel. Since Redis always uses the last processed +# line as value of a configuration directive, you'd better put includes +# at the beginning of this file to avoid overwriting config change at runtime. +# +# If instead you are interested in using includes to override configuration +# options, it is better to use include as the last line. +# +# include .\path\to\local.conf +# include c:\path\to\other.conf + +################################ GENERAL ##################################### + +# On Windows, daemonize and pidfile are not supported. +# However, you can run redis as a Windows service, and specify a logfile. +# The logfile will contain the pid. + +# Accept connections on the specified port, default is 6379. +# If port 0 is specified Redis will not listen on a TCP socket. +# port 6379 port 6381 -dir ./redis-6381/state + +# TCP listen() backlog. +# +# In high requests-per-second environments you need an high backlog in order +# to avoid slow clients connections issues. Note that the Linux kernel +# will silently truncate it to the value of /proc/sys/net/core/somaxconn so +# make sure to raise both the value of somaxconn and tcp_max_syn_backlog +# in order to get the desired effect. +tcp-backlog 511 + +# By default Redis listens for connections from all the network interfaces +# available on the server. It is possible to listen to just one or multiple +# interfaces using the "bind" configuration directive, followed by one or +# more IP addresses. +# +# Examples: +# +# bind 192.168.1.100 10.0.0.1 +bind 127.0.0.1 + +# Specify the path for the Unix socket that will be used to listen for +# incoming connections. There is no default, so Redis will not listen +# on a unix socket when not specified. +# +# unixsocket /tmp/redis.sock +# unixsocketperm 700 + +# Close the connection after a client is idle for N seconds (0 to disable) +timeout 0 + +# TCP keepalive. +# +# If non-zero, use SO_KEEPALIVE to send TCP ACKs to clients in absence +# of communication. This is useful for two reasons: +# +# 1) Detect dead peers. +# 2) Take the connection alive from the point of view of network +# equipment in the middle. +# +# On Linux, the specified value (in seconds) is the period used to send ACKs. +# Note that to close the connection the double of the time is needed. +# On other kernels the period depends on the kernel configuration. +# +# A reasonable value for this option is 60 seconds. +tcp-keepalive 0 + +# Specify the server verbosity level. +# This can be one of: +# debug (a lot of information, useful for development/testing) +# verbose (many rarely useful info, but not a mess like the debug level) +# notice (moderately verbose, what you want in production probably) +# warning (only very important / critical messages are logged) +# loglevel notice +loglevel verbose + +# Specify the log file name. Also 'stdout' can be used to force +# Redis to log on the standard output. +logfile "" + +# To enable logging to the Windows EventLog, just set 'syslog-enabled' to +# yes, and optionally update the other syslog parameters to suit your needs. +# If Redis is installed and launched as a Windows Service, this will +# automatically be enabled. +# syslog-enabled no + +# Specify the source name of the events in the Windows Application log. +# syslog-ident redis + +# Set the number of databases. The default database is DB 0, you can select +# a different one on a per-connection basis using SELECT where +# dbid is a number between 0 and 'databases'-1 +databases 16 + +################################ SNAPSHOTTING ################################ +# +# Save the DB on disk: +# +# save +# +# Will save the DB if both the given number of seconds and the given +# number of write operations against the DB occurred. +# +# In the example below the behaviour will be to save: +# after 900 sec (15 min) if at least 1 key changed +# after 300 sec (5 min) if at least 10 keys changed +# after 60 sec if at least 10000 keys changed +# +# Note: you can disable saving completely by commenting out all "save" lines. +# +# It is also possible to remove all the previously configured save +# points by adding a save directive with a single empty string argument +# like in the following example: +# +# save "" + +save 900 1 +save 300 10 +save 60 10000 + +# By default Redis will stop accepting writes if RDB snapshots are enabled +# (at least one save point) and the latest background save failed. +# This will make the user aware (in a hard way) that data is not persisting +# on disk properly, otherwise chances are that no one will notice and some +# disaster will happen. +# +# If the background saving process will start working again Redis will +# automatically allow writes again. +# +# However if you have setup your proper monitoring of the Redis server +# and persistence, you may want to disable this feature so that Redis will +# continue to work as usual even if there are problems with disk, +# permissions, and so forth. +stop-writes-on-bgsave-error yes + +# Compress string objects using LZF when dump .rdb databases? +# For default that's set to 'yes' as it's almost always a win. +# If you want to save some CPU in the saving child set it to 'no' but +# the dataset will likely be bigger if you have compressible values or keys. +rdbcompression yes + +# Since version 5 of RDB a CRC64 checksum is placed at the end of the file. +# This makes the format more resistant to corruption but there is a performance +# hit to pay (around 10%) when saving and loading RDB files, so you can disable it +# for maximum performances. +# +# RDB files created with checksum disabled have a checksum of zero that will +# tell the loading code to skip the check. +rdbchecksum yes + +# The filename where to dump the DB +dbfilename "dump.rdb" + +# The working directory. +# +# The DB will be written inside this directory, with the filename specified +# above using the 'dbfilename' configuration directive. +# +# The Append Only File will also be created inside this directory. +# +# Note that you must specify a directory here, not a file name. +dir "D:\\ServiceStack\\ServiceStack.Redis\\src\\sentinel\\redis-6381\\" + +################################# REPLICATION ################################# + +# Master-Slave replication. Use slaveof to make a Redis instance a copy of +# another Redis server. A few things to understand ASAP about Redis replication. +# +# 1) Redis replication is asynchronous, but you can configure a master to +# stop accepting writes if it appears to be not connected with at least +# a given number of slaves. +# 2) Redis slaves are able to perform a partial resynchronization with the +# master if the replication link is lost for a relatively small amount of +# time. You may want to configure the replication backlog size (see the next +# sections of this file) with a sensible value depending on your needs. +# 3) Replication is automatic and does not need user intervention. After a +# network partition slaves automatically try to reconnect to masters +# and resynchronize with them. +# +# slaveof + +# If the master is password protected (using the "requirepass" configuration +# directive below) it is possible to tell the slave to authenticate before +# starting the replication synchronization process, otherwise the master will +# refuse the slave request. +# +# masterauth + +# When a slave loses its connection with the master, or when the replication +# is still in progress, the slave can act in two different ways: +# +# 1) if slave-serve-stale-data is set to 'yes' (the default) the slave will +# still reply to client requests, possibly with out of date data, or the +# data set may just be empty if this is the first synchronization. +# +# 2) if slave-serve-stale-data is set to 'no' the slave will reply with +# an error "SYNC with master in progress" to all the kind of commands +# but to INFO and SLAVEOF. +# +slave-serve-stale-data yes + +# You can configure a slave instance to accept writes or not. Writing against +# a slave instance may be useful to store some ephemeral data (because data +# written on a slave will be easily deleted after resync with the master) but +# may also cause problems if clients are writing to it because of a +# misconfiguration. +# +# Since Redis 2.6 by default slaves are read-only. +# +# Note: read only slaves are not designed to be exposed to untrusted clients +# on the internet. It's just a protection layer against misuse of the instance. +# Still a read only slave exports by default all the administrative commands +# such as CONFIG, DEBUG, and so forth. To a limited extent you can improve +# security of read only slaves using 'rename-command' to shadow all the +# administrative / dangerous commands. +slave-read-only yes + +# Replication SYNC strategy: disk or socket. +# +# ------------------------------------------------------- +# WARNING: DISKLESS REPLICATION IS EXPERIMENTAL CURRENTLY +# ------------------------------------------------------- +# +# New slaves and reconnecting slaves that are not able to continue the replication +# process just receiving differences, need to do what is called a "full +# synchronization". An RDB file is transmitted from the master to the slaves. +# The transmission can happen in two different ways: +# +# 1) Disk-backed: The Redis master creates a new process that writes the RDB +# file on disk. Later the file is transferred by the parent +# process to the slaves incrementally. +# 2) Diskless: The Redis master creates a new process that directly writes the +# RDB file to slave sockets, without touching the disk at all. +# +# With disk-backed replication, while the RDB file is generated, more slaves +# can be queued and served with the RDB file as soon as the current child producing +# the RDB file finishes its work. With diskless replication instead once +# the transfer starts, new slaves arriving will be queued and a new transfer +# will start when the current one terminates. +# +# When diskless replication is used, the master waits a configurable amount of +# time (in seconds) before starting the transfer in the hope that multiple slaves +# will arrive and the transfer can be parallelized. +# +# With slow disks and fast (large bandwidth) networks, diskless replication +# works better. +repl-diskless-sync no + +# When diskless replication is enabled, it is possible to configure the delay +# the server waits in order to spawn the child that trnasfers the RDB via socket +# to the slaves. +# +# This is important since once the transfer starts, it is not possible to serve +# new slaves arriving, that will be queued for the next RDB transfer, so the server +# waits a delay in order to let more slaves arrive. +# +# The delay is specified in seconds, and by default is 5 seconds. To disable +# it entirely just set it to 0 seconds and the transfer will start ASAP. +repl-diskless-sync-delay 5 + +# Slaves send PINGs to server in a predefined interval. It's possible to change +# this interval with the repl_ping_slave_period option. The default value is 10 +# seconds. +# +# repl-ping-slave-period 10 + +# The following option sets the replication timeout for: +# +# 1) Bulk transfer I/O during SYNC, from the point of view of slave. +# 2) Master timeout from the point of view of slaves (data, pings). +# 3) Slave timeout from the point of view of masters (REPLCONF ACK pings). +# +# It is important to make sure that this value is greater than the value +# specified for repl-ping-slave-period otherwise a timeout will be detected +# every time there is low traffic between the master and the slave. +# +# repl-timeout 60 + +# Disable TCP_NODELAY on the slave socket after SYNC? +# +# If you select "yes" Redis will use a smaller number of TCP packets and +# less bandwidth to send data to slaves. But this can add a delay for +# the data to appear on the slave side, up to 40 milliseconds with +# Linux kernels using a default configuration. +# +# If you select "no" the delay for data to appear on the slave side will +# be reduced but more bandwidth will be used for replication. +# +# By default we optimize for low latency, but in very high traffic conditions +# or when the master and slaves are many hops away, turning this to "yes" may +# be a good idea. +repl-disable-tcp-nodelay no + +# Set the replication backlog size. The backlog is a buffer that accumulates +# slave data when slaves are disconnected for some time, so that when a slave +# wants to reconnect again, often a full resync is not needed, but a partial +# resync is enough, just passing the portion of data the slave missed while +# disconnected. +# +# The bigger the replication backlog, the longer the time the slave can be +# disconnected and later be able to perform a partial resynchronization. +# +# The backlog is only allocated once there is at least a slave connected. +# +# repl-backlog-size 1mb + +# After a master has no longer connected slaves for some time, the backlog +# will be freed. The following option configures the amount of seconds that +# need to elapse, starting from the time the last slave disconnected, for +# the backlog buffer to be freed. +# +# A value of 0 means to never release the backlog. +# +# repl-backlog-ttl 3600 + +# The slave priority is an integer number published by Redis in the INFO output. +# It is used by Redis Sentinel in order to select a slave to promote into a +# master if the master is no longer working correctly. +# +# A slave with a low priority number is considered better for promotion, so +# for instance if there are three slaves with priority 10, 100, 25 Sentinel will +# pick the one with priority 10, that is the lowest. +# +# However a special priority of 0 marks the slave as not able to perform the +# role of master, so a slave with priority of 0 will never be selected by +# Redis Sentinel for promotion. +# +# By default the priority is 100. +slave-priority 100 + +# It is possible for a master to stop accepting writes if there are less than +# N slaves connected, having a lag less or equal than M seconds. +# +# The N slaves need to be in "online" state. +# +# The lag in seconds, that must be <= the specified value, is calculated from +# the last ping received from the slave, that is usually sent every second. +# +# This option does not GUARANTEE that N replicas will accept the write, but +# will limit the window of exposure for lost writes in case not enough slaves +# are available, to the specified number of seconds. +# +# For example to require at least 3 slaves with a lag <= 10 seconds use: +# +# min-slaves-to-write 3 +# min-slaves-max-lag 10 +# +# Setting one or the other to 0 disables the feature. +# +# By default min-slaves-to-write is set to 0 (feature disabled) and +# min-slaves-max-lag is set to 10. + +################################## SECURITY ################################### + +# Require clients to issue AUTH before processing any other +# commands. This might be useful in environments in which you do not trust +# others with access to the host running redis-server. +# +# This should stay commented out for backward compatibility and because most +# people do not need auth (e.g. they run their own servers). +# +# Warning: since Redis is pretty fast an outside user can try up to +# 150k passwords per second against a good box. This means that you should +# use a very strong password otherwise it will be very easy to break. +# +# requirepass foobared + +# Command renaming. +# +# It is possible to change the name of dangerous commands in a shared +# environment. For instance the CONFIG command may be renamed into something +# hard to guess so that it will still be available for internal-use tools +# but not available for general clients. +# +# Example: +# +# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52 +# +# It is also possible to completely kill a command by renaming it into +# an empty string: +# +# rename-command CONFIG "" +# +# Please note that changing the name of commands that are logged into the +# AOF file or transmitted to slaves may cause problems. + +################################### LIMITS #################################### + +# Set the max number of connected clients at the same time. By default +# this limit is set to 10000 clients, however if the Redis server is not +# able to configure the process file limit to allow for the specified limit +# the max number of allowed clients is set to the current file limit +# minus 32 (as Redis reserves a few file descriptors for internal uses). +# +# Once the limit is reached Redis will close all the new connections sending +# an error 'max number of clients reached'. +# +# maxclients 10000 + +# If Redis is to be used as an in-memory-only cache without any kind of +# persistence, then the fork() mechanism used by the background AOF/RDB +# persistence is unnecessary. As an optimization, all persistence can be +# turned off in the Windows version of Redis. This will redirect heap +# allocations to the system heap allocator, and disable commands that would +# otherwise cause fork() operations: BGSAVE and BGREWRITEAOF. +# This flag may not be combined with any of the other flags that configure +# AOF and RDB operations. +# persistence-available [(yes)|no] + +# Don't use more memory than the specified amount of bytes. +# When the memory limit is reached Redis will try to remove keys +# according to the eviction policy selected (see maxmemory-policy). +# +# If Redis can't remove keys according to the policy, or if the policy is +# set to 'noeviction', Redis will start to reply with errors to commands +# that would use more memory, like SET, LPUSH, and so on, and will continue +# to reply to read-only commands like GET. +# +# This option is usually useful when using Redis as an LRU cache, or to set +# a hard memory limit for an instance (using the 'noeviction' policy). +# +# WARNING: If you have slaves attached to an instance with maxmemory on, +# the size of the output buffers needed to feed the slaves are subtracted +# from the used memory count, so that network problems / resyncs will +# not trigger a loop where keys are evicted, and in turn the output +# buffer of slaves is full with DELs of keys evicted triggering the deletion +# of more keys, and so forth until the database is completely emptied. +# +# In short... if you have slaves attached it is suggested that you set a lower +# limit for maxmemory so that there is some free RAM on the system for slave +# output buffers (but this is not needed if the policy is 'noeviction'). +# +# WARNING: not setting maxmemory will cause Redis to terminate with an +# out-of-memory exception if the heap limit is reached. +# +# NOTE: since Redis uses the system paging file to allocate the heap memory, +# the Working Set memory usage showed by the Windows Task Manager or by other +# tools such as ProcessExplorer will not always be accurate. For example, right +# after a background save of the RDB or the AOF files, the working set value +# may drop significantly. In order to check the correct amount of memory used +# by the redis-server to store the data, use the INFO client command. The INFO +# command shows only the memory used to store the redis data, not the extra +# memory used by the Windows process for its own requirements. Th3 extra amount +# of memory not reported by the INFO command can be calculated subtracting the +# Peak Working Set reported by the Windows Task Manager and the used_memory_peak +# reported by the INFO command. +# +# maxmemory + +# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory +# is reached. You can select among five behaviors: +# +# volatile-lru -> remove the key with an expire set using an LRU algorithm +# allkeys-lru -> remove any key according to the LRU algorithm +# volatile-random -> remove a random key with an expire set +# allkeys-random -> remove a random key, any key +# volatile-ttl -> remove the key with the nearest expire time (minor TTL) +# noeviction -> don't expire at all, just return an error on write operations +# +# Note: with any of the above policies, Redis will return an error on write +# operations, when there are no suitable keys for eviction. +# +# At the date of writing these commands are: set setnx setex append +# incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd +# sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby +# zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby +# getset mset msetnx exec sort +# +# The default is: +# +# maxmemory-policy volatile-lru + +# LRU and minimal TTL algorithms are not precise algorithms but approximated +# algorithms (in order to save memory), so you can select as well the sample +# size to check. For instance for default Redis will check three keys and +# pick the one that was used less recently, you can change the sample size +# using the following configuration directive. +# +# maxmemory-samples 3 + +############################## APPEND ONLY MODE ############################### + +# By default Redis asynchronously dumps the dataset on disk. This mode is +# good enough in many applications, but an issue with the Redis process or +# a power outage may result into a few minutes of writes lost (depending on +# the configured save points). +# +# The Append Only File is an alternative persistence mode that provides +# much better durability. For instance using the default data fsync policy +# (see later in the config file) Redis can lose just one second of writes in a +# dramatic event like a server power outage, or a single write if something +# wrong with the Redis process itself happens, but the operating system is +# still running correctly. +# +# AOF and RDB persistence can be enabled at the same time without problems. +# If the AOF is enabled on startup Redis will load the AOF, that is the file +# with the better durability guarantees. +# +# Please check http://redis.io/topics/persistence for more information. + +appendonly no + +# The name of the append only file (default: "appendonly.aof") +appendfilename "appendonly.aof" + +# The fsync() call tells the Operating System to actually write data on disk +# instead of waiting for more data in the output buffer. Some OS will really flush +# data on disk, some other OS will just try to do it ASAP. +# +# Redis supports three different modes: +# +# no: don't fsync, just let the OS flush the data when it wants. Faster. +# always: fsync after every write to the append only log . Slow, Safest. +# everysec: fsync only one time every second. Compromise. +# +# The default is "everysec", as that's usually the right compromise between +# speed and data safety. It's up to you to understand if you can relax this to +# "no" that will let the operating system flush the output buffer when +# it wants, for better performances (but if you can live with the idea of +# some data loss consider the default persistence mode that's snapshotting), +# or on the contrary, use "always" that's very slow but a bit safer than +# everysec. +# +# More details please check the following article: +# http://antirez.com/post/redis-persistence-demystified.html +# +# If unsure, use "everysec". + +# appendfsync always +appendfsync everysec +# appendfsync no + +# When the AOF fsync policy is set to always or everysec, and a background +# saving process (a background save or AOF log background rewriting) is +# performing a lot of I/O against the disk, in some Linux configurations +# Redis may block too long on the fsync() call. Note that there is no fix for +# this currently, as even performing fsync in a different thread will block +# our synchronous write(2) call. +# +# In order to mitigate this problem it's possible to use the following option +# that will prevent fsync() from being called in the main process while a +# BGSAVE or BGREWRITEAOF is in progress. +# +# This means that while another child is saving, the durability of Redis is +# the same as "appendfsync none". In practical terms, this means that it is +# possible to lose up to 30 seconds of log in the worst scenario (with the +# default Linux settings). +# +# If you have latency problems turn this to "yes". Otherwise leave it as +# "no" that is the safest pick from the point of view of durability. +no-appendfsync-on-rewrite no + +# Automatic rewrite of the append only file. +# Redis is able to automatically rewrite the log file implicitly calling +# BGREWRITEAOF when the AOF log size grows by the specified percentage. +# +# This is how it works: Redis remembers the size of the AOF file after the +# latest rewrite (if no rewrite has happened since the restart, the size of +# the AOF at startup is used). +# +# This base size is compared to the current size. If the current size is +# bigger than the specified percentage, the rewrite is triggered. Also +# you need to specify a minimal size for the AOF file to be rewritten, this +# is useful to avoid rewriting the AOF file even if the percentage increase +# is reached but it is still pretty small. +# +# Specify a percentage of zero in order to disable the automatic AOF +# rewrite feature. + +auto-aof-rewrite-percentage 100 +auto-aof-rewrite-min-size 64mb + +# An AOF file may be found to be truncated at the end during the Redis +# startup process, when the AOF data gets loaded back into memory. +# This may happen when the system where Redis is running +# crashes, especially when an ext4 filesystem is mounted without the +# data=ordered option (however this can't happen when Redis itself +# crashes or aborts but the operating system still works correctly). +# +# Redis can either exit with an error when this happens, or load as much +# data as possible (the default now) and start if the AOF file is found +# to be truncated at the end. The following option controls this behavior. +# +# If aof-load-truncated is set to yes, a truncated AOF file is loaded and +# the Redis server starts emitting a log to inform the user of the event. +# Otherwise if the option is set to no, the server aborts with an error +# and refuses to start. When the option is set to no, the user requires +# to fix the AOF file using the "redis-check-aof" utility before to restart +# the server. +# +# Note that if the AOF file will be found to be corrupted in the middle +# the server will still exit with an error. This option only applies when +# Redis will try to read more data from the AOF file but not enough bytes +# will be found. +aof-load-truncated yes + +################################ LUA SCRIPTING ############################### + +# Max execution time of a Lua script in milliseconds. +# +# If the maximum execution time is reached Redis will log that a script is +# still in execution after the maximum allowed time and will start to +# reply to queries with an error. +# +# When a long running script exceeds the maximum execution time only the +# SCRIPT KILL and SHUTDOWN NOSAVE commands are available. The first can be +# used to stop a script that did not yet called write commands. The second +# is the only way to shut down the server in the case a write command was +# already issued by the script but the user doesn't want to wait for the natural +# termination of the script. +# +# Set it to 0 or a negative value for unlimited execution without warnings. +lua-time-limit 5000 + +################################ REDIS CLUSTER ############################### +# +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# WARNING EXPERIMENTAL: Redis Cluster is considered to be stable code, however +# in order to mark it as "mature" we need to wait for a non trivial percentage +# of users to deploy it in production. +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# +# Normal Redis instances can't be part of a Redis Cluster; only nodes that are +# started as cluster nodes can. In order to start a Redis instance as a +# cluster node enable the cluster support uncommenting the following: +# +# cluster-enabled yes + +# Every cluster node has a cluster configuration file. This file is not +# intended to be edited by hand. It is created and updated by Redis nodes. +# Every Redis Cluster node requires a different cluster configuration file. +# Make sure that instances running in the same system do not have +# overlapping cluster configuration file names. +# +# cluster-config-file nodes-6379.conf + +# Cluster node timeout is the amount of milliseconds a node must be unreachable +# for it to be considered in failure state. +# Most other internal time limits are multiple of the node timeout. +# +# cluster-node-timeout 15000 + +# A slave of a failing master will avoid to start a failover if its data +# looks too old. +# +# There is no simple way for a slave to actually have a exact measure of +# its "data age", so the following two checks are performed: +# +# 1) If there are multiple slaves able to failover, they exchange messages +# in order to try to give an advantage to the slave with the best +# replication offset (more data from the master processed). +# Slaves will try to get their rank by offset, and apply to the start +# of the failover a delay proportional to their rank. +# +# 2) Every single slave computes the time of the last interaction with +# its master. This can be the last ping or command received (if the master +# is still in the "connected" state), or the time that elapsed since the +# disconnection with the master (if the replication link is currently down). +# If the last interaction is too old, the slave will not try to failover +# at all. +# +# The point "2" can be tuned by user. Specifically a slave will not perform +# the failover if, since the last interaction with the master, the time +# elapsed is greater than: +# +# (node-timeout * slave-validity-factor) + repl-ping-slave-period +# +# So for example if node-timeout is 30 seconds, and the slave-validity-factor +# is 10, and assuming a default repl-ping-slave-period of 10 seconds, the +# slave will not try to failover if it was not able to talk with the master +# for longer than 310 seconds. +# +# A large slave-validity-factor may allow slaves with too old data to failover +# a master, while a too small value may prevent the cluster from being able to +# elect a slave at all. +# +# For maximum availability, it is possible to set the slave-validity-factor +# to a value of 0, which means, that slaves will always try to failover the +# master regardless of the last time they interacted with the master. +# (However they'll always try to apply a delay proportional to their +# offset rank). +# +# Zero is the only value able to guarantee that when all the partitions heal +# the cluster will always be able to continue. +# +# cluster-slave-validity-factor 10 + +# Cluster slaves are able to migrate to orphaned masters, that are masters +# that are left without working slaves. This improves the cluster ability +# to resist to failures as otherwise an orphaned master can't be failed over +# in case of failure if it has no working slaves. +# +# Slaves migrate to orphaned masters only if there are still at least a +# given number of other working slaves for their old master. This number +# is the "migration barrier". A migration barrier of 1 means that a slave +# will migrate only if there is at least 1 other working slave for its master +# and so forth. It usually reflects the number of slaves you want for every +# master in your cluster. +# +# Default is 1 (slaves migrate only if their masters remain with at least +# one slave). To disable migration just set it to a very large value. +# A value of 0 can be set but is useful only for debugging and dangerous +# in production. +# +# cluster-migration-barrier 1 + +# By default Redis Cluster nodes stop accepting queries if they detect there +# is at least an hash slot uncovered (no available node is serving it). +# This way if the cluster is partially down (for example a range of hash slots +# are no longer covered) all the cluster becomes, eventually, unavailable. +# It automatically returns available as soon as all the slots are covered again. +# +# However sometimes you want the subset of the cluster which is working, +# to continue to accept queries for the part of the key space that is still +# covered. In order to do so, just set the cluster-require-full-coverage +# option to no. +# +# cluster-require-full-coverage yes + +# In order to setup your cluster make sure to read the documentation +# available at http://redis.io web site. + +################################## SLOW LOG ################################### + +# The Redis Slow Log is a system to log queries that exceeded a specified +# execution time. The execution time does not include the I/O operations +# like talking with the client, sending the reply and so forth, +# but just the time needed to actually execute the command (this is the only +# stage of command execution where the thread is blocked and can not serve +# other requests in the meantime). +# +# You can configure the slow log with two parameters: one tells Redis +# what is the execution time, in microseconds, to exceed in order for the +# command to get logged, and the other parameter is the length of the +# slow log. When a new command is logged the oldest one is removed from the +# queue of logged commands. + +# The following time is expressed in microseconds, so 1000000 is equivalent +# to one second. Note that a negative number disables the slow log, while +# a value of zero forces the logging of every command. +slowlog-log-slower-than 10000 + +# There is no limit to this length. Just be aware that it will consume memory. +# You can reclaim memory used by the slow log with SLOWLOG RESET. +slowlog-max-len 128 + +################################ LATENCY MONITOR ############################## + +# The Redis latency monitoring subsystem samples different operations +# at runtime in order to collect data related to possible sources of +# latency of a Redis instance. +# +# Via the LATENCY command this information is available to the user that can +# print graphs and obtain reports. +# +# The system only logs operations that were performed in a time equal or +# greater than the amount of milliseconds specified via the +# latency-monitor-threshold configuration directive. When its value is set +# to zero, the latency monitor is turned off. +# +# By default latency monitoring is disabled since it is mostly not needed +# if you don't have latency issues, and collecting data has a performance +# impact, that while very small, can be measured under big load. Latency +# monitoring can easily be enalbed at runtime using the command +# "CONFIG SET latency-monitor-threshold " if needed. +latency-monitor-threshold 0 + +############################# Event notification ############################## + +# Redis can notify Pub/Sub clients about events happening in the key space. +# This feature is documented at http://redis.io/topics/notifications +# +# For instance if keyspace events notification is enabled, and a client +# performs a DEL operation on key "foo" stored in the Database 0, two +# messages will be published via Pub/Sub: +# +# PUBLISH __keyspace@0__:foo del +# PUBLISH __keyevent@0__:del foo +# +# It is possible to select the events that Redis will notify among a set +# of classes. Every class is identified by a single character: +# +# K Keyspace events, published with __keyspace@__ prefix. +# E Keyevent events, published with __keyevent@__ prefix. +# g Generic commands (non-type specific) like DEL, EXPIRE, RENAME, ... +# $ String commands +# l List commands +# s Set commands +# h Hash commands +# z Sorted set commands +# x Expired events (events generated every time a key expires) +# e Evicted events (events generated when a key is evicted for maxmemory) +# A Alias for g$lshzxe, so that the "AKE" string means all the events. +# +# The "notify-keyspace-events" takes as argument a string that is composed +# of zero or multiple characters. The empty string means that notifications +# are disabled. +# +# Example: to enable list and generic events, from the point of view of the +# event name, use: +# +# notify-keyspace-events Elg +# +# Example 2: to get the stream of the expired keys subscribing to channel +# name __keyevent@0__:expired use: +# +# notify-keyspace-events Ex +# +# By default all notifications are disabled because most users don't need +# this feature and the feature has some overhead. Note that if you don't +# specify at least one of K or E, no events will be delivered. +notify-keyspace-events "" + +############################### ADVANCED CONFIG ############################### + +# Hashes are encoded using a memory efficient data structure when they have a +# small number of entries, and the biggest entry does not exceed a given +# threshold. These thresholds can be configured using the following directives. +hash-max-ziplist-entries 512 +hash-max-ziplist-value 64 + +# Similarly to hashes, small lists are also encoded in a special way in order +# to save a lot of space. The special representation is only used when +# you are under the following limits: +list-max-ziplist-entries 512 +list-max-ziplist-value 64 + +# Sets have a special encoding in just one case: when a set is composed +# of just strings that happen to be integers in radix 10 in the range +# of 64 bit signed integers. +# The following configuration setting sets the limit in the size of the +# set in order to use this special memory saving encoding. +set-max-intset-entries 512 + +# Similarly to hashes and lists, sorted sets are also specially encoded in +# order to save a lot of space. This encoding is only used when the length and +# elements of a sorted set are below the following limits: +zset-max-ziplist-entries 128 +zset-max-ziplist-value 64 + +# HyperLogLog sparse representation bytes limit. The limit includes the +# 16 bytes header. When an HyperLogLog using the sparse representation crosses +# this limit, it is converted into the dense representation. +# +# A value greater than 16000 is totally useless, since at that point the +# dense representation is more memory efficient. +# +# The suggested value is ~ 3000 in order to have the benefits of +# the space efficient encoding without slowing down too much PFADD, +# which is O(N) with the sparse encoding. The value can be raised to +# ~ 10000 when CPU is not a concern, but space is, and the data set is +# composed of many HyperLogLogs with cardinality in the 0 - 15000 range. +hll-sparse-max-bytes 3000 + +# Active rehashing uses 1 millisecond every 100 milliseconds of CPU time in +# order to help rehashing the main Redis hash table (the one mapping top-level +# keys to values). The hash table implementation Redis uses (see dict.c) +# performs a lazy rehashing: the more operation you run into a hash table +# that is rehashing, the more rehashing "steps" are performed, so if the +# server is idle the rehashing is never complete and some more memory is used +# by the hash table. +# +# The default is to use this millisecond 10 times every second in order to +# actively rehash the main dictionaries, freeing memory when possible. +# +# If unsure: +# use "activerehashing no" if you have hard latency requirements and it is +# not a good thing in your environment that Redis can reply from time to time +# to queries with 2 milliseconds delay. +# +# use "activerehashing yes" if you don't have such hard requirements but +# want to free memory asap when possible. +activerehashing yes + +# The client output buffer limits can be used to force disconnection of clients +# that are not reading data from the server fast enough for some reason (a +# common reason is that a Pub/Sub client can't consume messages as fast as the +# publisher can produce them). +# +# The limit can be set differently for the three different classes of clients: +# +# normal -> normal clients including MONITOR clients +# slave -> slave clients +# pubsub -> clients subscribed to at least one pubsub channel or pattern +# +# The syntax of every client-output-buffer-limit directive is the following: +# +# client-output-buffer-limit +# +# A client is immediately disconnected once the hard limit is reached, or if +# the soft limit is reached and remains reached for the specified number of +# seconds (continuously). +# So for instance if the hard limit is 32 megabytes and the soft limit is +# 16 megabytes / 10 seconds, the client will get disconnected immediately +# if the size of the output buffers reach 32 megabytes, but will also get +# disconnected if the client reaches 16 megabytes and continuously overcomes +# the limit for 10 seconds. +# +# By default normal clients are not limited because they don't receive data +# without asking (in a push way), but just after a request, so only +# asynchronous clients may create a scenario where data is requested faster +# than it can read. +# +# Instead there is a default limit for pubsub and slave clients, since +# subscribers and slaves receive data in a push fashion. +# +# Both the hard or the soft limit can be disabled by setting them to zero. +client-output-buffer-limit normal 0 0 0 +client-output-buffer-limit slave 256mb 64mb 60 +client-output-buffer-limit pubsub 32mb 8mb 60 + +# Redis calls an internal function to perform many background tasks, like +# closing connections of clients in timeot, purging expired keys that are +# never requested, and so forth. +# +# Not all tasks are perforemd with the same frequency, but Redis checks for +# tasks to perform according to the specified "hz" value. +# +# By default "hz" is set to 10. Raising the value will use more CPU when +# Redis is idle, but at the same time will make Redis more responsive when +# there are many keys expiring at the same time, and timeouts may be +# handled with more precision. +# +# The range is between 1 and 500, however a value over 100 is usually not +# a good idea. Most users should use the default of 10 and raise this up to +# 100 only in environments where very low latency is required. +hz 10 + +# When a child rewrites the AOF file, if the following option is enabled +# the file will be fsync-ed every 32 MB of data generated. This is useful +# in order to commit the file to the disk more incrementally and avoid +# big latency spikes. +aof-rewrite-incremental-fsync yes + +################################## INCLUDES ################################### + +# Include one or more other config files here. This is useful if you +# have a standard template that goes to all Redis server but also need +# to customize a few per-server settings. Include files can include +# other files, so use this wisely. +# +# include /path/to/local.conf +# include /path/to/other.conf slaveof 127.0.0.1 6380 + diff --git a/src/sentinel/redis-6382/redis.conf b/src/sentinel/redis-6382/redis.conf index 2ddf17cc..fd2e08cd 100644 --- a/src/sentinel/redis-6382/redis.conf +++ b/src/sentinel/redis-6382/redis.conf @@ -1,6 +1,965 @@ -# Relative to ./src/sentinel -include redis.conf +# Redis configuration file example +# Note on units: when memory size is needed, it is possible to specify +# it in the usual form of 1k 5GB 4M and so forth: +# +# 1k => 1000 bytes +# 1kb => 1024 bytes +# 1m => 1000000 bytes +# 1mb => 1024*1024 bytes +# 1g => 1000000000 bytes +# 1gb => 1024*1024*1024 bytes +# +# units are case insensitive so 1GB 1Gb 1gB are all the same. + +################################## INCLUDES ################################### + +# Include one or more other config files here. This is useful if you +# have a standard template that goes to all Redis servers but also need +# to customize a few per-server settings. Include files can include +# other files, so use this wisely. +# +# Notice option "include" won't be rewritten by command "CONFIG REWRITE" +# from admin or Redis Sentinel. Since Redis always uses the last processed +# line as value of a configuration directive, you'd better put includes +# at the beginning of this file to avoid overwriting config change at runtime. +# +# If instead you are interested in using includes to override configuration +# options, it is better to use include as the last line. +# +# include .\path\to\local.conf +# include c:\path\to\other.conf + +################################ GENERAL ##################################### + +# On Windows, daemonize and pidfile are not supported. +# However, you can run redis as a Windows service, and specify a logfile. +# The logfile will contain the pid. + +# Accept connections on the specified port, default is 6379. +# If port 0 is specified Redis will not listen on a TCP socket. +# port 6379 port 6382 -dir ./redis-6382/state + +# TCP listen() backlog. +# +# In high requests-per-second environments you need an high backlog in order +# to avoid slow clients connections issues. Note that the Linux kernel +# will silently truncate it to the value of /proc/sys/net/core/somaxconn so +# make sure to raise both the value of somaxconn and tcp_max_syn_backlog +# in order to get the desired effect. +tcp-backlog 511 + +# By default Redis listens for connections from all the network interfaces +# available on the server. It is possible to listen to just one or multiple +# interfaces using the "bind" configuration directive, followed by one or +# more IP addresses. +# +# Examples: +# +# bind 192.168.1.100 10.0.0.1 +bind 127.0.0.1 + +# Specify the path for the Unix socket that will be used to listen for +# incoming connections. There is no default, so Redis will not listen +# on a unix socket when not specified. +# +# unixsocket /tmp/redis.sock +# unixsocketperm 700 + +# Close the connection after a client is idle for N seconds (0 to disable) +timeout 0 + +# TCP keepalive. +# +# If non-zero, use SO_KEEPALIVE to send TCP ACKs to clients in absence +# of communication. This is useful for two reasons: +# +# 1) Detect dead peers. +# 2) Take the connection alive from the point of view of network +# equipment in the middle. +# +# On Linux, the specified value (in seconds) is the period used to send ACKs. +# Note that to close the connection the double of the time is needed. +# On other kernels the period depends on the kernel configuration. +# +# A reasonable value for this option is 60 seconds. +tcp-keepalive 0 + +# Specify the server verbosity level. +# This can be one of: +# debug (a lot of information, useful for development/testing) +# verbose (many rarely useful info, but not a mess like the debug level) +# notice (moderately verbose, what you want in production probably) +# warning (only very important / critical messages are logged) +# loglevel notice +loglevel verbose + +# Specify the log file name. Also 'stdout' can be used to force +# Redis to log on the standard output. +logfile "" + +# To enable logging to the Windows EventLog, just set 'syslog-enabled' to +# yes, and optionally update the other syslog parameters to suit your needs. +# If Redis is installed and launched as a Windows Service, this will +# automatically be enabled. +# syslog-enabled no + +# Specify the source name of the events in the Windows Application log. +# syslog-ident redis + +# Set the number of databases. The default database is DB 0, you can select +# a different one on a per-connection basis using SELECT where +# dbid is a number between 0 and 'databases'-1 +databases 16 + +################################ SNAPSHOTTING ################################ +# +# Save the DB on disk: +# +# save +# +# Will save the DB if both the given number of seconds and the given +# number of write operations against the DB occurred. +# +# In the example below the behaviour will be to save: +# after 900 sec (15 min) if at least 1 key changed +# after 300 sec (5 min) if at least 10 keys changed +# after 60 sec if at least 10000 keys changed +# +# Note: you can disable saving completely by commenting out all "save" lines. +# +# It is also possible to remove all the previously configured save +# points by adding a save directive with a single empty string argument +# like in the following example: +# +# save "" + +save 900 1 +save 300 10 +save 60 10000 + +# By default Redis will stop accepting writes if RDB snapshots are enabled +# (at least one save point) and the latest background save failed. +# This will make the user aware (in a hard way) that data is not persisting +# on disk properly, otherwise chances are that no one will notice and some +# disaster will happen. +# +# If the background saving process will start working again Redis will +# automatically allow writes again. +# +# However if you have setup your proper monitoring of the Redis server +# and persistence, you may want to disable this feature so that Redis will +# continue to work as usual even if there are problems with disk, +# permissions, and so forth. +stop-writes-on-bgsave-error yes + +# Compress string objects using LZF when dump .rdb databases? +# For default that's set to 'yes' as it's almost always a win. +# If you want to save some CPU in the saving child set it to 'no' but +# the dataset will likely be bigger if you have compressible values or keys. +rdbcompression yes + +# Since version 5 of RDB a CRC64 checksum is placed at the end of the file. +# This makes the format more resistant to corruption but there is a performance +# hit to pay (around 10%) when saving and loading RDB files, so you can disable it +# for maximum performances. +# +# RDB files created with checksum disabled have a checksum of zero that will +# tell the loading code to skip the check. +rdbchecksum yes + +# The filename where to dump the DB +dbfilename "dump.rdb" + +# The working directory. +# +# The DB will be written inside this directory, with the filename specified +# above using the 'dbfilename' configuration directive. +# +# The Append Only File will also be created inside this directory. +# +# Note that you must specify a directory here, not a file name. +dir "D:\\ServiceStack\\ServiceStack.Redis\\src\\sentinel\\redis-6382\\" + +################################# REPLICATION ################################# + +# Master-Slave replication. Use slaveof to make a Redis instance a copy of +# another Redis server. A few things to understand ASAP about Redis replication. +# +# 1) Redis replication is asynchronous, but you can configure a master to +# stop accepting writes if it appears to be not connected with at least +# a given number of slaves. +# 2) Redis slaves are able to perform a partial resynchronization with the +# master if the replication link is lost for a relatively small amount of +# time. You may want to configure the replication backlog size (see the next +# sections of this file) with a sensible value depending on your needs. +# 3) Replication is automatic and does not need user intervention. After a +# network partition slaves automatically try to reconnect to masters +# and resynchronize with them. +# +# slaveof + +# If the master is password protected (using the "requirepass" configuration +# directive below) it is possible to tell the slave to authenticate before +# starting the replication synchronization process, otherwise the master will +# refuse the slave request. +# +# masterauth + +# When a slave loses its connection with the master, or when the replication +# is still in progress, the slave can act in two different ways: +# +# 1) if slave-serve-stale-data is set to 'yes' (the default) the slave will +# still reply to client requests, possibly with out of date data, or the +# data set may just be empty if this is the first synchronization. +# +# 2) if slave-serve-stale-data is set to 'no' the slave will reply with +# an error "SYNC with master in progress" to all the kind of commands +# but to INFO and SLAVEOF. +# +slave-serve-stale-data yes + +# You can configure a slave instance to accept writes or not. Writing against +# a slave instance may be useful to store some ephemeral data (because data +# written on a slave will be easily deleted after resync with the master) but +# may also cause problems if clients are writing to it because of a +# misconfiguration. +# +# Since Redis 2.6 by default slaves are read-only. +# +# Note: read only slaves are not designed to be exposed to untrusted clients +# on the internet. It's just a protection layer against misuse of the instance. +# Still a read only slave exports by default all the administrative commands +# such as CONFIG, DEBUG, and so forth. To a limited extent you can improve +# security of read only slaves using 'rename-command' to shadow all the +# administrative / dangerous commands. +slave-read-only yes + +# Replication SYNC strategy: disk or socket. +# +# ------------------------------------------------------- +# WARNING: DISKLESS REPLICATION IS EXPERIMENTAL CURRENTLY +# ------------------------------------------------------- +# +# New slaves and reconnecting slaves that are not able to continue the replication +# process just receiving differences, need to do what is called a "full +# synchronization". An RDB file is transmitted from the master to the slaves. +# The transmission can happen in two different ways: +# +# 1) Disk-backed: The Redis master creates a new process that writes the RDB +# file on disk. Later the file is transferred by the parent +# process to the slaves incrementally. +# 2) Diskless: The Redis master creates a new process that directly writes the +# RDB file to slave sockets, without touching the disk at all. +# +# With disk-backed replication, while the RDB file is generated, more slaves +# can be queued and served with the RDB file as soon as the current child producing +# the RDB file finishes its work. With diskless replication instead once +# the transfer starts, new slaves arriving will be queued and a new transfer +# will start when the current one terminates. +# +# When diskless replication is used, the master waits a configurable amount of +# time (in seconds) before starting the transfer in the hope that multiple slaves +# will arrive and the transfer can be parallelized. +# +# With slow disks and fast (large bandwidth) networks, diskless replication +# works better. +repl-diskless-sync no + +# When diskless replication is enabled, it is possible to configure the delay +# the server waits in order to spawn the child that trnasfers the RDB via socket +# to the slaves. +# +# This is important since once the transfer starts, it is not possible to serve +# new slaves arriving, that will be queued for the next RDB transfer, so the server +# waits a delay in order to let more slaves arrive. +# +# The delay is specified in seconds, and by default is 5 seconds. To disable +# it entirely just set it to 0 seconds and the transfer will start ASAP. +repl-diskless-sync-delay 5 + +# Slaves send PINGs to server in a predefined interval. It's possible to change +# this interval with the repl_ping_slave_period option. The default value is 10 +# seconds. +# +# repl-ping-slave-period 10 + +# The following option sets the replication timeout for: +# +# 1) Bulk transfer I/O during SYNC, from the point of view of slave. +# 2) Master timeout from the point of view of slaves (data, pings). +# 3) Slave timeout from the point of view of masters (REPLCONF ACK pings). +# +# It is important to make sure that this value is greater than the value +# specified for repl-ping-slave-period otherwise a timeout will be detected +# every time there is low traffic between the master and the slave. +# +# repl-timeout 60 + +# Disable TCP_NODELAY on the slave socket after SYNC? +# +# If you select "yes" Redis will use a smaller number of TCP packets and +# less bandwidth to send data to slaves. But this can add a delay for +# the data to appear on the slave side, up to 40 milliseconds with +# Linux kernels using a default configuration. +# +# If you select "no" the delay for data to appear on the slave side will +# be reduced but more bandwidth will be used for replication. +# +# By default we optimize for low latency, but in very high traffic conditions +# or when the master and slaves are many hops away, turning this to "yes" may +# be a good idea. +repl-disable-tcp-nodelay no + +# Set the replication backlog size. The backlog is a buffer that accumulates +# slave data when slaves are disconnected for some time, so that when a slave +# wants to reconnect again, often a full resync is not needed, but a partial +# resync is enough, just passing the portion of data the slave missed while +# disconnected. +# +# The bigger the replication backlog, the longer the time the slave can be +# disconnected and later be able to perform a partial resynchronization. +# +# The backlog is only allocated once there is at least a slave connected. +# +# repl-backlog-size 1mb + +# After a master has no longer connected slaves for some time, the backlog +# will be freed. The following option configures the amount of seconds that +# need to elapse, starting from the time the last slave disconnected, for +# the backlog buffer to be freed. +# +# A value of 0 means to never release the backlog. +# +# repl-backlog-ttl 3600 + +# The slave priority is an integer number published by Redis in the INFO output. +# It is used by Redis Sentinel in order to select a slave to promote into a +# master if the master is no longer working correctly. +# +# A slave with a low priority number is considered better for promotion, so +# for instance if there are three slaves with priority 10, 100, 25 Sentinel will +# pick the one with priority 10, that is the lowest. +# +# However a special priority of 0 marks the slave as not able to perform the +# role of master, so a slave with priority of 0 will never be selected by +# Redis Sentinel for promotion. +# +# By default the priority is 100. +slave-priority 100 + +# It is possible for a master to stop accepting writes if there are less than +# N slaves connected, having a lag less or equal than M seconds. +# +# The N slaves need to be in "online" state. +# +# The lag in seconds, that must be <= the specified value, is calculated from +# the last ping received from the slave, that is usually sent every second. +# +# This option does not GUARANTEE that N replicas will accept the write, but +# will limit the window of exposure for lost writes in case not enough slaves +# are available, to the specified number of seconds. +# +# For example to require at least 3 slaves with a lag <= 10 seconds use: +# +# min-slaves-to-write 3 +# min-slaves-max-lag 10 +# +# Setting one or the other to 0 disables the feature. +# +# By default min-slaves-to-write is set to 0 (feature disabled) and +# min-slaves-max-lag is set to 10. + +################################## SECURITY ################################### + +# Require clients to issue AUTH before processing any other +# commands. This might be useful in environments in which you do not trust +# others with access to the host running redis-server. +# +# This should stay commented out for backward compatibility and because most +# people do not need auth (e.g. they run their own servers). +# +# Warning: since Redis is pretty fast an outside user can try up to +# 150k passwords per second against a good box. This means that you should +# use a very strong password otherwise it will be very easy to break. +# +# requirepass foobared + +# Command renaming. +# +# It is possible to change the name of dangerous commands in a shared +# environment. For instance the CONFIG command may be renamed into something +# hard to guess so that it will still be available for internal-use tools +# but not available for general clients. +# +# Example: +# +# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52 +# +# It is also possible to completely kill a command by renaming it into +# an empty string: +# +# rename-command CONFIG "" +# +# Please note that changing the name of commands that are logged into the +# AOF file or transmitted to slaves may cause problems. + +################################### LIMITS #################################### + +# Set the max number of connected clients at the same time. By default +# this limit is set to 10000 clients, however if the Redis server is not +# able to configure the process file limit to allow for the specified limit +# the max number of allowed clients is set to the current file limit +# minus 32 (as Redis reserves a few file descriptors for internal uses). +# +# Once the limit is reached Redis will close all the new connections sending +# an error 'max number of clients reached'. +# +# maxclients 10000 + +# If Redis is to be used as an in-memory-only cache without any kind of +# persistence, then the fork() mechanism used by the background AOF/RDB +# persistence is unnecessary. As an optimization, all persistence can be +# turned off in the Windows version of Redis. This will redirect heap +# allocations to the system heap allocator, and disable commands that would +# otherwise cause fork() operations: BGSAVE and BGREWRITEAOF. +# This flag may not be combined with any of the other flags that configure +# AOF and RDB operations. +# persistence-available [(yes)|no] + +# Don't use more memory than the specified amount of bytes. +# When the memory limit is reached Redis will try to remove keys +# according to the eviction policy selected (see maxmemory-policy). +# +# If Redis can't remove keys according to the policy, or if the policy is +# set to 'noeviction', Redis will start to reply with errors to commands +# that would use more memory, like SET, LPUSH, and so on, and will continue +# to reply to read-only commands like GET. +# +# This option is usually useful when using Redis as an LRU cache, or to set +# a hard memory limit for an instance (using the 'noeviction' policy). +# +# WARNING: If you have slaves attached to an instance with maxmemory on, +# the size of the output buffers needed to feed the slaves are subtracted +# from the used memory count, so that network problems / resyncs will +# not trigger a loop where keys are evicted, and in turn the output +# buffer of slaves is full with DELs of keys evicted triggering the deletion +# of more keys, and so forth until the database is completely emptied. +# +# In short... if you have slaves attached it is suggested that you set a lower +# limit for maxmemory so that there is some free RAM on the system for slave +# output buffers (but this is not needed if the policy is 'noeviction'). +# +# WARNING: not setting maxmemory will cause Redis to terminate with an +# out-of-memory exception if the heap limit is reached. +# +# NOTE: since Redis uses the system paging file to allocate the heap memory, +# the Working Set memory usage showed by the Windows Task Manager or by other +# tools such as ProcessExplorer will not always be accurate. For example, right +# after a background save of the RDB or the AOF files, the working set value +# may drop significantly. In order to check the correct amount of memory used +# by the redis-server to store the data, use the INFO client command. The INFO +# command shows only the memory used to store the redis data, not the extra +# memory used by the Windows process for its own requirements. Th3 extra amount +# of memory not reported by the INFO command can be calculated subtracting the +# Peak Working Set reported by the Windows Task Manager and the used_memory_peak +# reported by the INFO command. +# +# maxmemory + +# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory +# is reached. You can select among five behaviors: +# +# volatile-lru -> remove the key with an expire set using an LRU algorithm +# allkeys-lru -> remove any key according to the LRU algorithm +# volatile-random -> remove a random key with an expire set +# allkeys-random -> remove a random key, any key +# volatile-ttl -> remove the key with the nearest expire time (minor TTL) +# noeviction -> don't expire at all, just return an error on write operations +# +# Note: with any of the above policies, Redis will return an error on write +# operations, when there are no suitable keys for eviction. +# +# At the date of writing these commands are: set setnx setex append +# incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd +# sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby +# zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby +# getset mset msetnx exec sort +# +# The default is: +# +# maxmemory-policy volatile-lru + +# LRU and minimal TTL algorithms are not precise algorithms but approximated +# algorithms (in order to save memory), so you can select as well the sample +# size to check. For instance for default Redis will check three keys and +# pick the one that was used less recently, you can change the sample size +# using the following configuration directive. +# +# maxmemory-samples 3 + +############################## APPEND ONLY MODE ############################### + +# By default Redis asynchronously dumps the dataset on disk. This mode is +# good enough in many applications, but an issue with the Redis process or +# a power outage may result into a few minutes of writes lost (depending on +# the configured save points). +# +# The Append Only File is an alternative persistence mode that provides +# much better durability. For instance using the default data fsync policy +# (see later in the config file) Redis can lose just one second of writes in a +# dramatic event like a server power outage, or a single write if something +# wrong with the Redis process itself happens, but the operating system is +# still running correctly. +# +# AOF and RDB persistence can be enabled at the same time without problems. +# If the AOF is enabled on startup Redis will load the AOF, that is the file +# with the better durability guarantees. +# +# Please check http://redis.io/topics/persistence for more information. + +appendonly no + +# The name of the append only file (default: "appendonly.aof") +appendfilename "appendonly.aof" + +# The fsync() call tells the Operating System to actually write data on disk +# instead of waiting for more data in the output buffer. Some OS will really flush +# data on disk, some other OS will just try to do it ASAP. +# +# Redis supports three different modes: +# +# no: don't fsync, just let the OS flush the data when it wants. Faster. +# always: fsync after every write to the append only log . Slow, Safest. +# everysec: fsync only one time every second. Compromise. +# +# The default is "everysec", as that's usually the right compromise between +# speed and data safety. It's up to you to understand if you can relax this to +# "no" that will let the operating system flush the output buffer when +# it wants, for better performances (but if you can live with the idea of +# some data loss consider the default persistence mode that's snapshotting), +# or on the contrary, use "always" that's very slow but a bit safer than +# everysec. +# +# More details please check the following article: +# http://antirez.com/post/redis-persistence-demystified.html +# +# If unsure, use "everysec". + +# appendfsync always +appendfsync everysec +# appendfsync no + +# When the AOF fsync policy is set to always or everysec, and a background +# saving process (a background save or AOF log background rewriting) is +# performing a lot of I/O against the disk, in some Linux configurations +# Redis may block too long on the fsync() call. Note that there is no fix for +# this currently, as even performing fsync in a different thread will block +# our synchronous write(2) call. +# +# In order to mitigate this problem it's possible to use the following option +# that will prevent fsync() from being called in the main process while a +# BGSAVE or BGREWRITEAOF is in progress. +# +# This means that while another child is saving, the durability of Redis is +# the same as "appendfsync none". In practical terms, this means that it is +# possible to lose up to 30 seconds of log in the worst scenario (with the +# default Linux settings). +# +# If you have latency problems turn this to "yes". Otherwise leave it as +# "no" that is the safest pick from the point of view of durability. +no-appendfsync-on-rewrite no + +# Automatic rewrite of the append only file. +# Redis is able to automatically rewrite the log file implicitly calling +# BGREWRITEAOF when the AOF log size grows by the specified percentage. +# +# This is how it works: Redis remembers the size of the AOF file after the +# latest rewrite (if no rewrite has happened since the restart, the size of +# the AOF at startup is used). +# +# This base size is compared to the current size. If the current size is +# bigger than the specified percentage, the rewrite is triggered. Also +# you need to specify a minimal size for the AOF file to be rewritten, this +# is useful to avoid rewriting the AOF file even if the percentage increase +# is reached but it is still pretty small. +# +# Specify a percentage of zero in order to disable the automatic AOF +# rewrite feature. + +auto-aof-rewrite-percentage 100 +auto-aof-rewrite-min-size 64mb + +# An AOF file may be found to be truncated at the end during the Redis +# startup process, when the AOF data gets loaded back into memory. +# This may happen when the system where Redis is running +# crashes, especially when an ext4 filesystem is mounted without the +# data=ordered option (however this can't happen when Redis itself +# crashes or aborts but the operating system still works correctly). +# +# Redis can either exit with an error when this happens, or load as much +# data as possible (the default now) and start if the AOF file is found +# to be truncated at the end. The following option controls this behavior. +# +# If aof-load-truncated is set to yes, a truncated AOF file is loaded and +# the Redis server starts emitting a log to inform the user of the event. +# Otherwise if the option is set to no, the server aborts with an error +# and refuses to start. When the option is set to no, the user requires +# to fix the AOF file using the "redis-check-aof" utility before to restart +# the server. +# +# Note that if the AOF file will be found to be corrupted in the middle +# the server will still exit with an error. This option only applies when +# Redis will try to read more data from the AOF file but not enough bytes +# will be found. +aof-load-truncated yes + +################################ LUA SCRIPTING ############################### + +# Max execution time of a Lua script in milliseconds. +# +# If the maximum execution time is reached Redis will log that a script is +# still in execution after the maximum allowed time and will start to +# reply to queries with an error. +# +# When a long running script exceeds the maximum execution time only the +# SCRIPT KILL and SHUTDOWN NOSAVE commands are available. The first can be +# used to stop a script that did not yet called write commands. The second +# is the only way to shut down the server in the case a write command was +# already issued by the script but the user doesn't want to wait for the natural +# termination of the script. +# +# Set it to 0 or a negative value for unlimited execution without warnings. +lua-time-limit 5000 + +################################ REDIS CLUSTER ############################### +# +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# WARNING EXPERIMENTAL: Redis Cluster is considered to be stable code, however +# in order to mark it as "mature" we need to wait for a non trivial percentage +# of users to deploy it in production. +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# +# Normal Redis instances can't be part of a Redis Cluster; only nodes that are +# started as cluster nodes can. In order to start a Redis instance as a +# cluster node enable the cluster support uncommenting the following: +# +# cluster-enabled yes + +# Every cluster node has a cluster configuration file. This file is not +# intended to be edited by hand. It is created and updated by Redis nodes. +# Every Redis Cluster node requires a different cluster configuration file. +# Make sure that instances running in the same system do not have +# overlapping cluster configuration file names. +# +# cluster-config-file nodes-6379.conf + +# Cluster node timeout is the amount of milliseconds a node must be unreachable +# for it to be considered in failure state. +# Most other internal time limits are multiple of the node timeout. +# +# cluster-node-timeout 15000 + +# A slave of a failing master will avoid to start a failover if its data +# looks too old. +# +# There is no simple way for a slave to actually have a exact measure of +# its "data age", so the following two checks are performed: +# +# 1) If there are multiple slaves able to failover, they exchange messages +# in order to try to give an advantage to the slave with the best +# replication offset (more data from the master processed). +# Slaves will try to get their rank by offset, and apply to the start +# of the failover a delay proportional to their rank. +# +# 2) Every single slave computes the time of the last interaction with +# its master. This can be the last ping or command received (if the master +# is still in the "connected" state), or the time that elapsed since the +# disconnection with the master (if the replication link is currently down). +# If the last interaction is too old, the slave will not try to failover +# at all. +# +# The point "2" can be tuned by user. Specifically a slave will not perform +# the failover if, since the last interaction with the master, the time +# elapsed is greater than: +# +# (node-timeout * slave-validity-factor) + repl-ping-slave-period +# +# So for example if node-timeout is 30 seconds, and the slave-validity-factor +# is 10, and assuming a default repl-ping-slave-period of 10 seconds, the +# slave will not try to failover if it was not able to talk with the master +# for longer than 310 seconds. +# +# A large slave-validity-factor may allow slaves with too old data to failover +# a master, while a too small value may prevent the cluster from being able to +# elect a slave at all. +# +# For maximum availability, it is possible to set the slave-validity-factor +# to a value of 0, which means, that slaves will always try to failover the +# master regardless of the last time they interacted with the master. +# (However they'll always try to apply a delay proportional to their +# offset rank). +# +# Zero is the only value able to guarantee that when all the partitions heal +# the cluster will always be able to continue. +# +# cluster-slave-validity-factor 10 + +# Cluster slaves are able to migrate to orphaned masters, that are masters +# that are left without working slaves. This improves the cluster ability +# to resist to failures as otherwise an orphaned master can't be failed over +# in case of failure if it has no working slaves. +# +# Slaves migrate to orphaned masters only if there are still at least a +# given number of other working slaves for their old master. This number +# is the "migration barrier". A migration barrier of 1 means that a slave +# will migrate only if there is at least 1 other working slave for its master +# and so forth. It usually reflects the number of slaves you want for every +# master in your cluster. +# +# Default is 1 (slaves migrate only if their masters remain with at least +# one slave). To disable migration just set it to a very large value. +# A value of 0 can be set but is useful only for debugging and dangerous +# in production. +# +# cluster-migration-barrier 1 + +# By default Redis Cluster nodes stop accepting queries if they detect there +# is at least an hash slot uncovered (no available node is serving it). +# This way if the cluster is partially down (for example a range of hash slots +# are no longer covered) all the cluster becomes, eventually, unavailable. +# It automatically returns available as soon as all the slots are covered again. +# +# However sometimes you want the subset of the cluster which is working, +# to continue to accept queries for the part of the key space that is still +# covered. In order to do so, just set the cluster-require-full-coverage +# option to no. +# +# cluster-require-full-coverage yes + +# In order to setup your cluster make sure to read the documentation +# available at http://redis.io web site. + +################################## SLOW LOG ################################### + +# The Redis Slow Log is a system to log queries that exceeded a specified +# execution time. The execution time does not include the I/O operations +# like talking with the client, sending the reply and so forth, +# but just the time needed to actually execute the command (this is the only +# stage of command execution where the thread is blocked and can not serve +# other requests in the meantime). +# +# You can configure the slow log with two parameters: one tells Redis +# what is the execution time, in microseconds, to exceed in order for the +# command to get logged, and the other parameter is the length of the +# slow log. When a new command is logged the oldest one is removed from the +# queue of logged commands. + +# The following time is expressed in microseconds, so 1000000 is equivalent +# to one second. Note that a negative number disables the slow log, while +# a value of zero forces the logging of every command. +slowlog-log-slower-than 10000 + +# There is no limit to this length. Just be aware that it will consume memory. +# You can reclaim memory used by the slow log with SLOWLOG RESET. +slowlog-max-len 128 + +################################ LATENCY MONITOR ############################## + +# The Redis latency monitoring subsystem samples different operations +# at runtime in order to collect data related to possible sources of +# latency of a Redis instance. +# +# Via the LATENCY command this information is available to the user that can +# print graphs and obtain reports. +# +# The system only logs operations that were performed in a time equal or +# greater than the amount of milliseconds specified via the +# latency-monitor-threshold configuration directive. When its value is set +# to zero, the latency monitor is turned off. +# +# By default latency monitoring is disabled since it is mostly not needed +# if you don't have latency issues, and collecting data has a performance +# impact, that while very small, can be measured under big load. Latency +# monitoring can easily be enalbed at runtime using the command +# "CONFIG SET latency-monitor-threshold " if needed. +latency-monitor-threshold 0 + +############################# Event notification ############################## + +# Redis can notify Pub/Sub clients about events happening in the key space. +# This feature is documented at http://redis.io/topics/notifications +# +# For instance if keyspace events notification is enabled, and a client +# performs a DEL operation on key "foo" stored in the Database 0, two +# messages will be published via Pub/Sub: +# +# PUBLISH __keyspace@0__:foo del +# PUBLISH __keyevent@0__:del foo +# +# It is possible to select the events that Redis will notify among a set +# of classes. Every class is identified by a single character: +# +# K Keyspace events, published with __keyspace@__ prefix. +# E Keyevent events, published with __keyevent@__ prefix. +# g Generic commands (non-type specific) like DEL, EXPIRE, RENAME, ... +# $ String commands +# l List commands +# s Set commands +# h Hash commands +# z Sorted set commands +# x Expired events (events generated every time a key expires) +# e Evicted events (events generated when a key is evicted for maxmemory) +# A Alias for g$lshzxe, so that the "AKE" string means all the events. +# +# The "notify-keyspace-events" takes as argument a string that is composed +# of zero or multiple characters. The empty string means that notifications +# are disabled. +# +# Example: to enable list and generic events, from the point of view of the +# event name, use: +# +# notify-keyspace-events Elg +# +# Example 2: to get the stream of the expired keys subscribing to channel +# name __keyevent@0__:expired use: +# +# notify-keyspace-events Ex +# +# By default all notifications are disabled because most users don't need +# this feature and the feature has some overhead. Note that if you don't +# specify at least one of K or E, no events will be delivered. +notify-keyspace-events "" + +############################### ADVANCED CONFIG ############################### + +# Hashes are encoded using a memory efficient data structure when they have a +# small number of entries, and the biggest entry does not exceed a given +# threshold. These thresholds can be configured using the following directives. +hash-max-ziplist-entries 512 +hash-max-ziplist-value 64 + +# Similarly to hashes, small lists are also encoded in a special way in order +# to save a lot of space. The special representation is only used when +# you are under the following limits: +list-max-ziplist-entries 512 +list-max-ziplist-value 64 + +# Sets have a special encoding in just one case: when a set is composed +# of just strings that happen to be integers in radix 10 in the range +# of 64 bit signed integers. +# The following configuration setting sets the limit in the size of the +# set in order to use this special memory saving encoding. +set-max-intset-entries 512 + +# Similarly to hashes and lists, sorted sets are also specially encoded in +# order to save a lot of space. This encoding is only used when the length and +# elements of a sorted set are below the following limits: +zset-max-ziplist-entries 128 +zset-max-ziplist-value 64 + +# HyperLogLog sparse representation bytes limit. The limit includes the +# 16 bytes header. When an HyperLogLog using the sparse representation crosses +# this limit, it is converted into the dense representation. +# +# A value greater than 16000 is totally useless, since at that point the +# dense representation is more memory efficient. +# +# The suggested value is ~ 3000 in order to have the benefits of +# the space efficient encoding without slowing down too much PFADD, +# which is O(N) with the sparse encoding. The value can be raised to +# ~ 10000 when CPU is not a concern, but space is, and the data set is +# composed of many HyperLogLogs with cardinality in the 0 - 15000 range. +hll-sparse-max-bytes 3000 + +# Active rehashing uses 1 millisecond every 100 milliseconds of CPU time in +# order to help rehashing the main Redis hash table (the one mapping top-level +# keys to values). The hash table implementation Redis uses (see dict.c) +# performs a lazy rehashing: the more operation you run into a hash table +# that is rehashing, the more rehashing "steps" are performed, so if the +# server is idle the rehashing is never complete and some more memory is used +# by the hash table. +# +# The default is to use this millisecond 10 times every second in order to +# actively rehash the main dictionaries, freeing memory when possible. +# +# If unsure: +# use "activerehashing no" if you have hard latency requirements and it is +# not a good thing in your environment that Redis can reply from time to time +# to queries with 2 milliseconds delay. +# +# use "activerehashing yes" if you don't have such hard requirements but +# want to free memory asap when possible. +activerehashing yes + +# The client output buffer limits can be used to force disconnection of clients +# that are not reading data from the server fast enough for some reason (a +# common reason is that a Pub/Sub client can't consume messages as fast as the +# publisher can produce them). +# +# The limit can be set differently for the three different classes of clients: +# +# normal -> normal clients including MONITOR clients +# slave -> slave clients +# pubsub -> clients subscribed to at least one pubsub channel or pattern +# +# The syntax of every client-output-buffer-limit directive is the following: +# +# client-output-buffer-limit +# +# A client is immediately disconnected once the hard limit is reached, or if +# the soft limit is reached and remains reached for the specified number of +# seconds (continuously). +# So for instance if the hard limit is 32 megabytes and the soft limit is +# 16 megabytes / 10 seconds, the client will get disconnected immediately +# if the size of the output buffers reach 32 megabytes, but will also get +# disconnected if the client reaches 16 megabytes and continuously overcomes +# the limit for 10 seconds. +# +# By default normal clients are not limited because they don't receive data +# without asking (in a push way), but just after a request, so only +# asynchronous clients may create a scenario where data is requested faster +# than it can read. +# +# Instead there is a default limit for pubsub and slave clients, since +# subscribers and slaves receive data in a push fashion. +# +# Both the hard or the soft limit can be disabled by setting them to zero. +client-output-buffer-limit normal 0 0 0 +client-output-buffer-limit slave 256mb 64mb 60 +client-output-buffer-limit pubsub 32mb 8mb 60 + +# Redis calls an internal function to perform many background tasks, like +# closing connections of clients in timeot, purging expired keys that are +# never requested, and so forth. +# +# Not all tasks are perforemd with the same frequency, but Redis checks for +# tasks to perform according to the specified "hz" value. +# +# By default "hz" is set to 10. Raising the value will use more CPU when +# Redis is idle, but at the same time will make Redis more responsive when +# there are many keys expiring at the same time, and timeouts may be +# handled with more precision. +# +# The range is between 1 and 500, however a value over 100 is usually not +# a good idea. Most users should use the default of 10 and raise this up to +# 100 only in environments where very low latency is required. +hz 10 + +# When a child rewrites the AOF file, if the following option is enabled +# the file will be fsync-ed every 32 MB of data generated. This is useful +# in order to commit the file to the disk more incrementally and avoid +# big latency spikes. +aof-rewrite-incremental-fsync yes + +################################## INCLUDES ################################### + +# Include one or more other config files here. This is useful if you +# have a standard template that goes to all Redis server but also need +# to customize a few per-server settings. Include files can include +# other files, so use this wisely. +# +# include /path/to/local.conf +# include /path/to/other.conf slaveof 127.0.0.1 6380 diff --git a/tests/Console.Tests/ForceFailover.cs b/tests/Console.Tests/ForceFailover.cs index efca4e1b..a28f2c9d 100644 --- a/tests/Console.Tests/ForceFailover.cs +++ b/tests/Console.Tests/ForceFailover.cs @@ -2,6 +2,7 @@ using ServiceStack.Logging; using ServiceStack.Redis; using ServiceStack.Text; +using ServiceStack; namespace ConsoleTests { diff --git a/tests/Console.Tests/HashCollectionStressTests.cs b/tests/Console.Tests/HashCollectionStressTests.cs index e0a37b2a..94eacedd 100644 --- a/tests/Console.Tests/HashCollectionStressTests.cs +++ b/tests/Console.Tests/HashCollectionStressTests.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading; +using ServiceStack; using ServiceStack.Redis; using ServiceStack.Redis.Generic; using ServiceStack.Text; diff --git a/tests/Console.Tests/HashStressTest.cs b/tests/Console.Tests/HashStressTest.cs index 5259a84d..bbcace61 100644 --- a/tests/Console.Tests/HashStressTest.cs +++ b/tests/Console.Tests/HashStressTest.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Threading; +using ServiceStack; using ServiceStack.Redis; using ServiceStack.Redis.Generic; using ServiceStack.Text; diff --git a/tests/Console.Tests/LongRunningRedisPubSubServer.cs b/tests/Console.Tests/LongRunningRedisPubSubServer.cs index 7c72849a..690aed67 100644 --- a/tests/Console.Tests/LongRunningRedisPubSubServer.cs +++ b/tests/Console.Tests/LongRunningRedisPubSubServer.cs @@ -1,10 +1,9 @@ using System; using System.Threading; using System.Threading.Tasks; -using System.Timers; +using ServiceStack; using ServiceStack.Redis; using ServiceStack.Text; -using Timer = System.Timers.Timer; namespace ConsoleTests { @@ -31,7 +30,7 @@ public void Execute(string ipAddress) Manager = new RedisManagerPool(ipAddress); StartedAt = DateTime.UtcNow; - var q = new Timer { Interval = 1000 }; + var q = new System.Timers.Timer { Interval = 1000 }; q.Elapsed += OnInterval; q.Enabled = true; @@ -85,7 +84,7 @@ public void Execute(string ipAddress) } } - private static void OnInterval(object sender, ElapsedEventArgs e) + private static void OnInterval(object sender, System.Timers.ElapsedEventArgs e) { Task.Factory.StartNew(PublishMessage); } diff --git a/tests/ServiceStack.Redis.Tests.Sentinel/Redis3SentinelSetupTests.cs b/tests/ServiceStack.Redis.Tests.Sentinel/Redis3SentinelSetupTests.cs index 6fdee8fb..94d037cd 100644 --- a/tests/ServiceStack.Redis.Tests.Sentinel/Redis3SentinelSetupTests.cs +++ b/tests/ServiceStack.Redis.Tests.Sentinel/Redis3SentinelSetupTests.cs @@ -5,8 +5,7 @@ namespace ServiceStack.Redis.Tests.Sentinel { [TestFixture, Category("Integration")] [Ignore("Requires cloud setup")] - public class Redis3SentinelSetupTests - : RedisSentinelTestBase + public class Redis3SentinelSetupTests : RedisSentinelTestBase { [Test] public void Can_connect_to_3SentinelSetup() diff --git a/tests/ServiceStack.Redis.Tests.Sentinel/RedisResolverTests.cs b/tests/ServiceStack.Redis.Tests.Sentinel/RedisResolverTests.cs index 473cba7c..e723f670 100644 --- a/tests/ServiceStack.Redis.Tests.Sentinel/RedisResolverTests.cs +++ b/tests/ServiceStack.Redis.Tests.Sentinel/RedisResolverTests.cs @@ -6,17 +6,16 @@ namespace ServiceStack.Redis.Tests.Sentinel { [TestFixture] - public class RedisResolverTests - : RedisSentinelTestBase + public class RedisResolverTests : RedisSentinelTestBase { [OneTimeSetUp] - public void OneTimeSetUp() + public void TestFixtureSetUp() { StartAllRedisServers(); } [OneTimeTearDown] - public void OneTimeTearDown() + public void TestFixtureTearDown() { ShutdownAllRedisServers(); } @@ -283,6 +282,15 @@ public void RedisManagerPool_can_execute_CustomResolver() } } + + [Test] + public void Can_initalize_ClientManagers_with_no_hosts() + { + InitializeEmptyRedisManagers(new RedisManagerPool(), MasterHosts, MasterHosts); + InitializeEmptyRedisManagers(new PooledRedisClientManager(), MasterHosts, SlaveHosts); + InitializeEmptyRedisManagers(new BasicRedisClientManager(), MasterHosts, SlaveHosts); + } + private static void InitializeEmptyRedisManagers(IRedisClientsManager redisManager, string[] masters, string[] slaves) { var hasResolver = (IHasRedisResolver)redisManager; @@ -300,13 +308,5 @@ private static void InitializeEmptyRedisManagers(IRedisClientsManager redisManag Assert.That(slave.GetValue("KEY"), Is.EqualTo("1")); } } - - [Test] - public void Can_initalize_ClientManagers_with_no_hosts() - { - InitializeEmptyRedisManagers(new PooledRedisClientManager(), MasterHosts, SlaveHosts); - InitializeEmptyRedisManagers(new RedisManagerPool(), MasterHosts, MasterHosts); - InitializeEmptyRedisManagers(new BasicRedisClientManager(), MasterHosts, SlaveHosts); - } } } \ No newline at end of file diff --git a/tests/ServiceStack.Redis.Tests.Sentinel/RedisSentinelTestBase.cs b/tests/ServiceStack.Redis.Tests.Sentinel/RedisSentinelTestBase.cs index 4140a51f..8510cadc 100644 --- a/tests/ServiceStack.Redis.Tests.Sentinel/RedisSentinelTestBase.cs +++ b/tests/ServiceStack.Redis.Tests.Sentinel/RedisSentinelTestBase.cs @@ -77,12 +77,12 @@ public static RedisSentinel CreateGCloudSentinel() public static void StartRedisServer(int port) { - var exePath = new FileInfo("~/../../src/sentinel/redis/redis-server.exe".MapProjectPath()).FullName; + var exePath = new FileInfo("~/../../../src/sentinel/redis/redis-server.exe".MapProjectPath()).FullName; #if NETCORE if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) exePath = "redis-server"; #endif - var configDir = "~/../../src/sentinel/redis-{0}/".Fmt(port).MapProjectPath(); + var configDir = "~/../../../src/sentinel/redis-{0}/".Fmt(port).MapProjectPath(); var configPath = Path.Combine(configDir, "redis.conf"); File.WriteAllText(configPath, diff --git a/tests/ServiceStack.Redis.Tests.Sentinel/RedisSentinelTests.cs b/tests/ServiceStack.Redis.Tests.Sentinel/RedisSentinelTests.cs index d148e530..5a3c548c 100644 --- a/tests/ServiceStack.Redis.Tests.Sentinel/RedisSentinelTests.cs +++ b/tests/ServiceStack.Redis.Tests.Sentinel/RedisSentinelTests.cs @@ -7,8 +7,7 @@ namespace ServiceStack.Redis.Tests.Sentinel { [TestFixture, Category("Integration")] - public class RedisSentinelTests - : RedisSentinelTestBase + public class RedisSentinelTests : RedisSentinelTestBase { [OneTimeSetUp] public void OnBeforeTestFixture() diff --git a/tests/ServiceStack.Redis.Tests.Sentinel/ServiceStack.Redis.Tests.Sentinel.csproj b/tests/ServiceStack.Redis.Tests.Sentinel/ServiceStack.Redis.Tests.Sentinel.csproj index 5114d12c..b9731900 100644 --- a/tests/ServiceStack.Redis.Tests.Sentinel/ServiceStack.Redis.Tests.Sentinel.csproj +++ b/tests/ServiceStack.Redis.Tests.Sentinel/ServiceStack.Redis.Tests.Sentinel.csproj @@ -1,8 +1,8 @@  - netcoreapp2.0;net45 - portable + net45;netcoreapp2.0 + ServiceStack.Redis.Tests.Sentinel Library ServiceStack.Redis.Tests.Sentinel @@ -18,9 +18,11 @@ + + diff --git a/tests/ServiceStack.Redis.Tests/App.config b/tests/ServiceStack.Redis.Tests/App.config index c39009c1..2c98e0db 100644 --- a/tests/ServiceStack.Redis.Tests/App.config +++ b/tests/ServiceStack.Redis.Tests/App.config @@ -1,6 +1,6 @@ - + diff --git a/tests/ServiceStack.Redis.Tests/BasicRediscClientManagerTests.cs b/tests/ServiceStack.Redis.Tests/BasicRediscClientManagerTests.cs index 893afcaf..2fab80b8 100644 --- a/tests/ServiceStack.Redis.Tests/BasicRediscClientManagerTests.cs +++ b/tests/ServiceStack.Redis.Tests/BasicRediscClientManagerTests.cs @@ -2,8 +2,7 @@ namespace ServiceStack.Redis.Tests { - public class BasicRediscClientManagerTests - : RedisClientTestsBase + public class BasicRediscClientManagerTests : RedisClientTestsBase { [Test] public void Can_select_db() diff --git a/tests/ServiceStack.Redis.Tests/ConfigTests.cs b/tests/ServiceStack.Redis.Tests/ConfigTests.cs index 5fada075..1211ebc0 100644 --- a/tests/ServiceStack.Redis.Tests/ConfigTests.cs +++ b/tests/ServiceStack.Redis.Tests/ConfigTests.cs @@ -7,13 +7,13 @@ namespace ServiceStack.Redis.Tests public class ConfigTests { [OneTimeSetUp] - public void OneTimeSetUp() + public void TestFixtureSetUp() { RedisConfig.VerifyMasterConnections = false; } [OneTimeTearDown] - public void OneTimeTearDown() + public void TestFixtureTearDown() { RedisConfig.VerifyMasterConnections = true; } diff --git a/tests/ServiceStack.Redis.Tests/Examples/BestPractice/BlogPostBestPractice.cs b/tests/ServiceStack.Redis.Tests/Examples/BestPractice/BlogPostBestPractice.cs index 1cfa8e05..82219b11 100644 --- a/tests/ServiceStack.Redis.Tests/Examples/BestPractice/BlogPostBestPractice.cs +++ b/tests/ServiceStack.Redis.Tests/Examples/BestPractice/BlogPostBestPractice.cs @@ -9,268 +9,268 @@ namespace ServiceStack.Redis.Tests.Examples.BestPractice { - /// - /// A complete, self-contained example showing how to create a basic blog application using Redis. - /// + /// + /// A complete, self-contained example showing how to create a basic blog application using Redis. + /// + + #region Blog Models + + public class User + : IHasBlogRepository + { + public IBlogRepository Repository { private get; set; } + + public User() + { + this.BlogIds = new List(); + } + + public long Id { get; set; } + public string Name { get; set; } + public List BlogIds { get; set; } + + public List GetBlogs() + { + return this.Repository.GetBlogs(this.BlogIds); + } + + public Blog CreateNewBlog(Blog blog) + { + this.Repository.StoreBlogs(this, blog); + + return blog; + } + } + + public class Blog + : IHasBlogRepository + { + public IBlogRepository Repository { private get; set; } + + public Blog() + { + this.Tags = new List(); + this.BlogPostIds = new List(); + } + + public long Id { get; set; } + public long UserId { get; set; } + public string UserName { get; set; } + public List Tags { get; set; } + public List BlogPostIds { get; set; } + + public List GetBlogPosts() + { + return this.Repository.GetBlogPosts(this.BlogPostIds); + } + + public void StoreNewBlogPosts(params BlogPost[] blogPosts) + { + this.Repository.StoreNewBlogPosts(this, blogPosts); + } + } + + public class BlogPost + { + public BlogPost() + { + this.Categories = new List(); + this.Tags = new List(); + this.Comments = new List(); + } + + public long Id { get; set; } + public long BlogId { get; set; } + public string Title { get; set; } + public string Content { get; set; } + public List Categories { get; set; } + public List Tags { get; set; } + public List Comments { get; set; } + } + + public class BlogPostComment + { + public string Content { get; set; } + public DateTime CreatedDate { get; set; } + } + #endregion + + + #region Blog Repository + public interface IHasBlogRepository + { + IBlogRepository Repository { set; } + } + + public class BlogRepository + : IBlogRepository + { + const string CategoryTypeName = "Category"; + const string TagCloudKey = "urn:TagCloud"; + const string AllCategoriesKey = "urn:Categories"; + const string RecentBlogPostsKey = "urn:BlogPosts:RecentPosts"; + const string RecentBlogPostCommentsKey = "urn:BlogPostComment:RecentComments"; + + public BlogRepository(IRedisClient client) + { + this.redis = client; + } + + private readonly IRedisClient redis; + + public void StoreUsers(params User[] users) + { + var redisUsers = redis.As(); + Inject(users); + users.Where(x => x.Id == default(int)) + .Each(x => x.Id = redisUsers.GetNextSequence()); + + redisUsers.StoreAll(users); + } + + public List GetAllUsers() + { + var redisUsers = redis.As(); + return Inject(redisUsers.GetAll()); + } + + public void StoreBlogs(User user, params Blog[] blogs) + { + var redisBlogs = redis.As(); + foreach (var blog in blogs) + { + blog.Id = blog.Id != default(int) ? blog.Id : redisBlogs.GetNextSequence(); + blog.UserId = user.Id; + blog.UserName = user.Name; - #region Blog Models + user.BlogIds.AddIfNotExists(blog.Id); + } - public class User - : IHasBlogRepository - { - public IBlogRepository Repository { private get; set; } + using (var trans = redis.CreateTransaction()) + { + trans.QueueCommand(x => x.Store(user)); + trans.QueueCommand(x => x.StoreAll(blogs)); - public User() - { - this.BlogIds = new List(); - } + trans.Commit(); + } - public long Id { get; set; } - public string Name { get; set; } - public List BlogIds { get; set; } + Inject(blogs); + } + + public List GetBlogs(IEnumerable blogIds) + { + var redisBlogs = redis.As(); + return Inject( + redisBlogs.GetByIds(blogIds.Map(x => x.ToString()))); + } + + public List GetAllBlogs() + { + var redisBlogs = redis.As(); + return Inject(redisBlogs.GetAll()); + } + + public List GetBlogPosts(IEnumerable blogPostIds) + { + var redisBlogPosts = redis.As(); + return redisBlogPosts.GetByIds(blogPostIds.Map(x => x.ToString())).ToList(); + } + + public void StoreNewBlogPosts(Blog blog, params BlogPost[] blogPosts) + { + var redisBlogPosts = redis.As(); + var redisComments = redis.As(); + + //Get wrapper around a strongly-typed Redis server-side List + var recentPosts = redisBlogPosts.Lists[RecentBlogPostsKey]; + var recentComments = redisComments.Lists[RecentBlogPostCommentsKey]; + + foreach (var blogPost in blogPosts) + { + blogPost.Id = blogPost.Id != default(int) ? blogPost.Id : redisBlogPosts.GetNextSequence(); + blogPost.BlogId = blog.Id; + blog.BlogPostIds.AddIfNotExists(blogPost.Id); - public List GetBlogs() - { - return this.Repository.GetBlogs(this.BlogIds); - } + //List of Recent Posts and comments + recentPosts.Prepend(blogPost); + blogPost.Comments.ForEach(recentComments.Prepend); - public Blog CreateNewBlog(Blog blog) - { - this.Repository.StoreBlogs(this, blog); + //Tag Cloud + blogPost.Tags.ForEach(x => + redis.IncrementItemInSortedSet(TagCloudKey, x, 1)); - return blog; - } - } + //List of all post categories + blogPost.Categories.ForEach(x => + redis.AddItemToSet(AllCategoriesKey, x)); - public class Blog - : IHasBlogRepository - { - public IBlogRepository Repository { private get; set; } - - public Blog() - { - this.Tags = new List(); - this.BlogPostIds = new List(); - } - - public long Id { get; set; } - public long UserId { get; set; } - public string UserName { get; set; } - public List Tags { get; set; } - public List BlogPostIds { get; set; } - - public List GetBlogPosts() - { - return this.Repository.GetBlogPosts(this.BlogPostIds); - } - - public void StoreNewBlogPosts(params BlogPost[] blogPosts) - { - this.Repository.StoreNewBlogPosts(this, blogPosts); - } - } - - public class BlogPost - { - public BlogPost() - { - this.Categories = new List(); - this.Tags = new List(); - this.Comments = new List(); - } - - public long Id { get; set; } - public long BlogId { get; set; } - public string Title { get; set; } - public string Content { get; set; } - public List Categories { get; set; } - public List Tags { get; set; } - public List Comments { get; set; } - } - - public class BlogPostComment - { - public string Content { get; set; } - public DateTime CreatedDate { get; set; } - } - #endregion + //Map of Categories to BlogPost Ids + blogPost.Categories.ForEach(x => + redis.AddItemToSet(UrnId.Create(CategoryTypeName, x), blogPost.Id.ToString())); + } + //Rolling list of recent items, only keep the last 5 + recentPosts.Trim(0, 4); + recentComments.Trim(0, 4); - #region Blog Repository - public interface IHasBlogRepository - { - IBlogRepository Repository { set; } - } + using (var trans = redis.CreateTransaction()) + { + trans.QueueCommand(x => x.Store(blog)); + trans.QueueCommand(x => x.StoreAll(blogPosts)); - public class BlogRepository - : IBlogRepository - { - const string CategoryTypeName = "Category"; - const string TagCloudKey = "urn:TagCloud"; - const string AllCategoriesKey = "urn:Categories"; - const string RecentBlogPostsKey = "urn:BlogPosts:RecentPosts"; - const string RecentBlogPostCommentsKey = "urn:BlogPostComment:RecentComments"; - - public BlogRepository(IRedisClient client) - { - this.redis = client; - } - - private readonly IRedisClient redis; - - public void StoreUsers(params User[] users) - { - var redisUsers = redis.As(); - Inject(users); - users.Where(x => x.Id == default(int)) - .Each(x => x.Id = redisUsers.GetNextSequence()); - - redisUsers.StoreAll(users); - } - - public List GetAllUsers() - { - var redisUsers = redis.As(); - return Inject(redisUsers.GetAll()); - } - - public void StoreBlogs(User user, params Blog[] blogs) - { - var redisBlogs = redis.As(); - foreach (var blog in blogs) - { - blog.Id = blog.Id != default(int) ? blog.Id : redisBlogs.GetNextSequence(); - blog.UserId = user.Id; - blog.UserName = user.Name; - - user.BlogIds.AddIfNotExists(blog.Id); - } - - using (var trans = redis.CreateTransaction()) - { - trans.QueueCommand(x => x.Store(user)); - trans.QueueCommand(x => x.StoreAll(blogs)); - - trans.Commit(); - } - - Inject(blogs); - } - - public List GetBlogs(IEnumerable blogIds) - { - var redisBlogs = redis.As(); - return Inject( - redisBlogs.GetByIds(blogIds.Map(x => x.ToString()))); - } - - public List GetAllBlogs() - { - var redisBlogs = redis.As(); - return Inject(redisBlogs.GetAll()); - } - - public List GetBlogPosts(IEnumerable blogPostIds) - { - var redisBlogPosts = redis.As(); - return redisBlogPosts.GetByIds(blogPostIds.Map(x => x.ToString())).ToList(); - } - - public void StoreNewBlogPosts(Blog blog, params BlogPost[] blogPosts) - { - var redisBlogPosts = redis.As(); - var redisComments = redis.As(); - - //Get wrapper around a strongly-typed Redis server-side List - var recentPosts = redisBlogPosts.Lists[RecentBlogPostsKey]; - var recentComments = redisComments.Lists[RecentBlogPostCommentsKey]; - - foreach (var blogPost in blogPosts) - { - blogPost.Id = blogPost.Id != default(int) ? blogPost.Id : redisBlogPosts.GetNextSequence(); - blogPost.BlogId = blog.Id; - blog.BlogPostIds.AddIfNotExists(blogPost.Id); - - //List of Recent Posts and comments - recentPosts.Prepend(blogPost); - blogPost.Comments.ForEach(recentComments.Prepend); - - //Tag Cloud - blogPost.Tags.ForEach(x => - redis.IncrementItemInSortedSet(TagCloudKey, x, 1)); - - //List of all post categories - blogPost.Categories.ForEach(x => - redis.AddItemToSet(AllCategoriesKey, x)); - - //Map of Categories to BlogPost Ids - blogPost.Categories.ForEach(x => - redis.AddItemToSet(UrnId.Create(CategoryTypeName, x), blogPost.Id.ToString())); - } - - //Rolling list of recent items, only keep the last 5 - recentPosts.Trim(0, 4); - recentComments.Trim(0, 4); - - using (var trans = redis.CreateTransaction()) - { - trans.QueueCommand(x => x.Store(blog)); - trans.QueueCommand(x => x.StoreAll(blogPosts)); - - trans.Commit(); - } - } - - public List GetRecentBlogPosts() - { - var redisBlogPosts = redis.As(); - return redisBlogPosts.Lists[RecentBlogPostsKey].GetAll(); - } - - public List GetRecentBlogPostComments() - { - var redisComments = redis.As(); - return redisComments.Lists[RecentBlogPostCommentsKey].GetAll(); - } - - public IDictionary GetTopTags(int take) - { - return redis.GetRangeWithScoresFromSortedSetDesc(TagCloudKey, 0, take - 1); - } - - public HashSet GetAllCategories() - { - return redis.GetAllItemsFromSet(AllCategoriesKey); - } - - public void StoreBlogPost(BlogPost blogPost) - { - redis.Store(blogPost); - } - - public BlogPost GetBlogPost(int postId) - { - return redis.GetById(postId); - } - - public List GetBlogPostsByCategory(string categoryName) - { - var categoryUrn = UrnId.Create(CategoryTypeName, categoryName); - var documentDbPostIds = redis.GetAllItemsFromSet(categoryUrn); - - return redis.GetByIds(documentDbPostIds.ToArray()).ToList(); - } - - public List Inject(IEnumerable entities) - where T : IHasBlogRepository - { - var entitiesList = entities.ToList(); - entitiesList.ForEach(x => x.Repository = this); - return entitiesList; - } - - } - #endregion + trans.Commit(); + } + } + + public List GetRecentBlogPosts() + { + var redisBlogPosts = redis.As(); + return redisBlogPosts.Lists[RecentBlogPostsKey].GetAll(); + } + + public List GetRecentBlogPostComments() + { + var redisComments = redis.As(); + return redisComments.Lists[RecentBlogPostCommentsKey].GetAll(); + } + + public IDictionary GetTopTags(int take) + { + return redis.GetRangeWithScoresFromSortedSetDesc(TagCloudKey, 0, take - 1); + } + + public HashSet GetAllCategories() + { + return redis.GetAllItemsFromSet(AllCategoriesKey); + } + + public void StoreBlogPost(BlogPost blogPost) + { + redis.Store(blogPost); + } + + public BlogPost GetBlogPost(int postId) + { + return redis.GetById(postId); + } + + public List GetBlogPostsByCategory(string categoryName) + { + var categoryUrn = UrnId.Create(CategoryTypeName, categoryName); + var documentDbPostIds = redis.GetAllItemsFromSet(categoryUrn); + + return redis.GetByIds(documentDbPostIds.ToArray()).ToList(); + } + + public List Inject(IEnumerable entities) + where T : IHasBlogRepository + { + var entitiesList = entities.ToList(); + entitiesList.ForEach(x => x.Repository = this); + return entitiesList; + } + + } + #endregion [TestFixture, Ignore("Integration"), Category("Integration")] @@ -279,81 +279,81 @@ public class BlogPostBestPractice readonly RedisClient redisClient = new RedisClient(TestConfig.SingleHost); private IBlogRepository repository; - [SetUp] - public void OnBeforeEachTest() - { - redisClient.FlushAll(); - repository = new BlogRepository(redisClient); - - InsertTestData(repository); - } - - public static void InsertTestData(IBlogRepository repository) - { - var ayende = new User { Name = "ayende" }; - var mythz = new User { Name = "mythz" }; - - repository.StoreUsers(ayende, mythz); - - var ayendeBlog = ayende.CreateNewBlog(new Blog { Tags = { "Architecture", ".NET", "Databases" } }); - - var mythzBlog = mythz.CreateNewBlog(new Blog { Tags = { "Architecture", ".NET", "Databases" } }); - - ayendeBlog.StoreNewBlogPosts(new BlogPost - { - Title = "RavenDB", - Categories = new List { "NoSQL", "DocumentDB" }, - Tags = new List { "Raven", "NoSQL", "JSON", ".NET" }, - Comments = new List - { - new BlogPostComment { Content = "First Comment!", CreatedDate = DateTime.UtcNow,}, - new BlogPostComment { Content = "Second Comment!", CreatedDate = DateTime.UtcNow,}, - } - }, - new BlogPost - { - BlogId = ayendeBlog.Id, - Title = "Cassandra", - Categories = new List { "NoSQL", "Cluster" }, - Tags = new List { "Cassandra", "NoSQL", "Scalability", "Hashing" }, - Comments = new List - { - new BlogPostComment { Content = "First Comment!", CreatedDate = DateTime.UtcNow,} - } - }); - - mythzBlog.StoreNewBlogPosts( - new BlogPost - { - Title = "Redis", - Categories = new List { "NoSQL", "Cache" }, - Tags = new List { "Redis", "NoSQL", "Scalability", "Performance" }, - Comments = new List - { - new BlogPostComment { Content = "First Comment!", CreatedDate = DateTime.UtcNow,} - } - }, - new BlogPost - { - Title = "Couch Db", - Categories = new List { "NoSQL", "DocumentDB" }, - Tags = new List { "CouchDb", "NoSQL", "JSON" }, - Comments = new List - { - new BlogPostComment {Content = "First Comment!", CreatedDate = DateTime.UtcNow,} - } - }); - } - - [Test] - public void View_test_data() - { - var mythz = repository.GetAllUsers().First(x => x.Name == "mythz"); - var mythzBlogPostIds = mythz.GetBlogs().SelectMany(x => x.BlogPostIds); - var mythzBlogPosts = repository.GetBlogPosts(mythzBlogPostIds); - - Debug.WriteLine(mythzBlogPosts.Dump()); - /* Output: + [SetUp] + public void OnBeforeEachTest() + { + redisClient.FlushAll(); + repository = new BlogRepository(redisClient); + + InsertTestData(repository); + } + + public static void InsertTestData(IBlogRepository repository) + { + var ayende = new User { Name = "ayende" }; + var mythz = new User { Name = "mythz" }; + + repository.StoreUsers(ayende, mythz); + + var ayendeBlog = ayende.CreateNewBlog(new Blog { Tags = { "Architecture", ".NET", "Databases" } }); + + var mythzBlog = mythz.CreateNewBlog(new Blog { Tags = { "Architecture", ".NET", "Databases" } }); + + ayendeBlog.StoreNewBlogPosts(new BlogPost + { + Title = "RavenDB", + Categories = new List { "NoSQL", "DocumentDB" }, + Tags = new List { "Raven", "NoSQL", "JSON", ".NET" }, + Comments = new List + { + new BlogPostComment { Content = "First Comment!", CreatedDate = DateTime.UtcNow,}, + new BlogPostComment { Content = "Second Comment!", CreatedDate = DateTime.UtcNow,}, + } + }, + new BlogPost + { + BlogId = ayendeBlog.Id, + Title = "Cassandra", + Categories = new List { "NoSQL", "Cluster" }, + Tags = new List { "Cassandra", "NoSQL", "Scalability", "Hashing" }, + Comments = new List + { + new BlogPostComment { Content = "First Comment!", CreatedDate = DateTime.UtcNow,} + } + }); + + mythzBlog.StoreNewBlogPosts( + new BlogPost + { + Title = "Redis", + Categories = new List { "NoSQL", "Cache" }, + Tags = new List { "Redis", "NoSQL", "Scalability", "Performance" }, + Comments = new List + { + new BlogPostComment { Content = "First Comment!", CreatedDate = DateTime.UtcNow,} + } + }, + new BlogPost + { + Title = "Couch Db", + Categories = new List { "NoSQL", "DocumentDB" }, + Tags = new List { "CouchDb", "NoSQL", "JSON" }, + Comments = new List + { + new BlogPostComment {Content = "First Comment!", CreatedDate = DateTime.UtcNow,} + } + }); + } + + [Test] + public void View_test_data() + { + var mythz = repository.GetAllUsers().First(x => x.Name == "mythz"); + var mythzBlogPostIds = mythz.GetBlogs().SelectMany(x => x.BlogPostIds); + var mythzBlogPosts = repository.GetBlogPosts(mythzBlogPostIds); + + Debug.WriteLine(mythzBlogPosts.Dump()); + /* Output: [ { Id: 3, @@ -404,14 +404,14 @@ public void View_test_data() } ] */ - } - - [Test] - public void Show_a_list_of_blogs() - { - var blogs = repository.GetAllBlogs(); - Debug.WriteLine(blogs.Dump()); - /* Output: + } + + [Test] + public void Show_a_list_of_blogs() + { + var blogs = repository.GetAllBlogs(); + Debug.WriteLine(blogs.Dump()); + /* Output: [ { Id: 1, @@ -447,18 +447,18 @@ public void Show_a_list_of_blogs() } ] */ - } - - [Test] - public void Show_a_list_of_recent_posts_and_comments() - { - //Recent posts are already maintained in the repository - var recentPosts = repository.GetRecentBlogPosts(); - var recentComments = repository.GetRecentBlogPostComments(); - - Debug.WriteLine("Recent Posts:\n" + recentPosts.Dump()); - Debug.WriteLine("Recent Comments:\n" + recentComments.Dump()); - /* + } + + [Test] + public void Show_a_list_of_recent_posts_and_comments() + { + //Recent posts are already maintained in the repository + var recentPosts = repository.GetRecentBlogPosts(); + var recentComments = repository.GetRecentBlogPostComments(); + + Debug.WriteLine("Recent Posts:\n" + recentPosts.Dump()); + Debug.WriteLine("Recent Comments:\n" + recentComments.Dump()); + /* Recent Posts: [ { @@ -587,15 +587,15 @@ public void Show_a_list_of_recent_posts_and_comments() ] */ - } - - [Test] - public void Show_a_TagCloud() - { - //Tags are maintained in the repository - var tagCloud = repository.GetTopTags(5); - Debug.WriteLine(tagCloud.Dump()); - /* Output: + } + + [Test] + public void Show_a_TagCloud() + { + //Tags are maintained in the repository + var tagCloud = repository.GetTopTags(5); + Debug.WriteLine(tagCloud.Dump()); + /* Output: [ [ NoSQL, @@ -619,15 +619,15 @@ public void Show_a_TagCloud() ] ] */ - } - - [Test] - public void Show_all_Categories() - { - //Categories are maintained in the repository - var allCategories = repository.GetAllCategories(); - Debug.WriteLine(allCategories.Dump()); - /* Output: + } + + [Test] + public void Show_all_Categories() + { + //Categories are maintained in the repository + var allCategories = repository.GetAllCategories(); + Debug.WriteLine(allCategories.Dump()); + /* Output: [ DocumentDB, NoSQL, @@ -635,15 +635,15 @@ public void Show_all_Categories() Cache ] */ - } - - [Test] - public void Show_post_and_all_comments() - { - var postId = 1; - var blogPost = repository.GetBlogPost(postId); - Debug.WriteLine(blogPost.Dump()); - /* Output: + } + + [Test] + public void Show_post_and_all_comments() + { + var postId = 1; + var blogPost = repository.GetBlogPost(postId); + Debug.WriteLine(blogPost.Dump()); + /* Output: { Id: 1, BlogId: 1, @@ -673,22 +673,22 @@ public void Show_post_and_all_comments() ] } */ - } + } - [Test] - public void Add_comment_to_existing_post() - { - var postId = 1; - var blogPost = repository.GetBlogPost(postId); + [Test] + public void Add_comment_to_existing_post() + { + var postId = 1; + var blogPost = repository.GetBlogPost(postId); - blogPost.Comments.Add( - new BlogPostComment { Content = "Third Comment!", CreatedDate = DateTime.UtcNow }); + blogPost.Comments.Add( + new BlogPostComment { Content = "Third Comment!", CreatedDate = DateTime.UtcNow }); - repository.StoreBlogPost(blogPost); + repository.StoreBlogPost(blogPost); - var refreshBlogPost = repository.GetBlogPost(postId); - Debug.WriteLine(refreshBlogPost.Dump()); - /* Output: + var refreshBlogPost = repository.GetBlogPost(postId); + Debug.WriteLine(refreshBlogPost.Dump()); + /* Output: { Id: 1, BlogId: 1, @@ -722,14 +722,14 @@ public void Add_comment_to_existing_post() ] } */ - } - - [Test] - public void Show_all_Posts_for_a_Category() - { - var documentDbPosts = repository.GetBlogPostsByCategory("DocumentDB"); - Debug.WriteLine(documentDbPosts.Dump()); - /* Output: + } + + [Test] + public void Show_all_Posts_for_a_Category() + { + var documentDbPosts = repository.GetBlogPostsByCategory("DocumentDB"); + Debug.WriteLine(documentDbPosts.Dump()); + /* Output: [ { Id: 4, @@ -784,7 +784,7 @@ public void Show_all_Posts_for_a_Category() } ] */ - } + } - } + } } \ No newline at end of file diff --git a/tests/ServiceStack.Redis.Tests/Examples/BlogPostExample.cs b/tests/ServiceStack.Redis.Tests/Examples/BlogPostExample.cs index 880fdbe7..a7b3aa84 100644 --- a/tests/ServiceStack.Redis.Tests/Examples/BlogPostExample.cs +++ b/tests/ServiceStack.Redis.Tests/Examples/BlogPostExample.cs @@ -8,7 +8,6 @@ namespace ServiceStack.Redis.Tests.Examples { - /// /// A complete, self-contained example showing how to create a basic blog application using Redis. /// diff --git a/tests/ServiceStack.Redis.Tests/Examples/SimpleLocks.cs b/tests/ServiceStack.Redis.Tests/Examples/SimpleLocks.cs index 4abfc881..2590dfe7 100644 --- a/tests/ServiceStack.Redis.Tests/Examples/SimpleLocks.cs +++ b/tests/ServiceStack.Redis.Tests/Examples/SimpleLocks.cs @@ -122,7 +122,6 @@ public void AcquireLock_using_Tasks() try { Console.WriteLine("About to process " + clientNo); - //var redisClient = new RedisClient("xxxx.redis.cache.windows.net", 6379, "xxxx"); var redisClient = new RedisClient(TestConfig.SingleHost, 6379); using (redisClient.AcquireLock("testlock1", TimeSpan.FromMinutes(3))) diff --git a/tests/ServiceStack.Redis.Tests/Issues/PipelineIssueTests.cs b/tests/ServiceStack.Redis.Tests/Issues/PipelineIssueTests.cs index 6002465c..870fe743 100644 --- a/tests/ServiceStack.Redis.Tests/Issues/PipelineIssueTests.cs +++ b/tests/ServiceStack.Redis.Tests/Issues/PipelineIssueTests.cs @@ -4,8 +4,7 @@ namespace ServiceStack.Redis.Tests.Issues { [TestFixture] - public class PipelineIssueTests - : RedisClientTestsBase + public class PipelineIssueTests : RedisClientTestsBase { [Test] public void Disposing_Client_Clears_Pipeline() @@ -17,11 +16,10 @@ public void Disposing_Client_Clears_Pipeline() client.Set("k1", "v1"); client.Set("k2", "v2"); client.Set("k3", "v3"); - using (var pipe = client.CreatePipeline()) { pipe.QueueCommand(c => c.Get("k1"), p => { throw new Exception(); }); - pipe.QueueCommand(c => c.Get("k2")); + //pipe.QueueCommand(c => c.Get("k2")); try { diff --git a/tests/ServiceStack.Redis.Tests/LicenseUsageTests.cs b/tests/ServiceStack.Redis.Tests/LicenseUsageTests.cs index 7a1f4ad2..00d05204 100644 --- a/tests/ServiceStack.Redis.Tests/LicenseUsageTests.cs +++ b/tests/ServiceStack.Redis.Tests/LicenseUsageTests.cs @@ -1,60 +1,60 @@ // Copyright (c) Service Stack LLC. All Rights Reserved. // License: https://raw.github.com/ServiceStack/ServiceStack/master/license.txt +using System; #if !NETCORE using System.Data; #endif using NUnit.Framework; using ServiceStack.Configuration; using ServiceStack.Text; -using System; namespace ServiceStack.Redis.Tests { - [TestFixture] - public class FreeLicenseUsageTests : LicenseUsageTests - { - [SetUp] - public void SetUp() - { - LicenseUtils.RemoveLicense(); - JsConfig.Reset(); - } + [TestFixture] + public class FreeLicenseUsageTests : LicenseUsageTests + { + [SetUp] + public void SetUp() + { + LicenseUtils.RemoveLicense(); + JsConfig.Reset(); + } - [TearDown] - public void TearDown() - { - Licensing.RegisterLicense(Environment.GetEnvironmentVariable("SERVICESTACK_LICENSE")); - } + //[TearDown] + //public void TearDown() + //{ + // Licensing.RegisterLicense(Environment.GetEnvironmentVariable("SERVICESTACK_LICENSE")); + //} - [Test] - public void Allows_access_of_21_types() - { - Access20Types(); - Access20Types(); - } + [Test] + public void Allows_access_of_20_types() + { + Access20Types(); + Access20Types(); + } - [Test] - public void Throws_on_access_of_21_types() - { - using (var client = new RedisClient(TestConfig.SingleHost)) - { - Access20Types(); - Access20Types(); + [Test, Ignore("License cracked!")] + public void Throws_on_access_of_21_types() + { + using (var client = new RedisClient(TestConfig.SingleHost)) + { + Access20Types(); + Access20Types(); - Assert.Throws(() => - client.As()); - } - } + Assert.Throws(() => + client.As()); + } + } - [Test, Ignore("Takes too long - but works!")] - public void Allows_access_of_6000_operations() - { - using (var client = new RedisClient(TestConfig.SingleHost)) - { - 6000.Times(() => client.Get("any key")); - } - } + [Test, Explicit("Takes too long - but works!")] + public void Allows_access_of_6000_operations() + { + using (var client = new RedisClient(TestConfig.SingleHost)) + { + 6000.Times(() => client.Get("any key")); + } + } [Test, Ignore("Takes too long - but works!")] public void Throws_on_access_of_6100_operations() @@ -67,92 +67,91 @@ public void Throws_on_access_of_6100_operations() } } - [TestFixture] - public class RegisteredLicenseUsageTests : LicenseUsageTests - { - [Test] - public void Allows_access_of_21_types() - { + [TestFixture, Ignore("servicestack:license")] + public class RegisteredLicenseUsageTests : LicenseUsageTests + { + [Test] + public void Allows_access_of_21_types() + { #if NETCORE - Environment.GetEnvironmentVariable("SERVICESTACK_LICENSE"); + LicenseUtils.RegisterLicense(Environment.GetEnvironmentVariable("SERVICESTACK_LICENSE")); #else - Licensing.RegisterLicense(new AppSettings().GetString("servicestack:license")); + Licensing.RegisterLicense(new AppSettings().Get("servicestack:license")); #endif - using (var client = new RedisClient(TestConfig.SingleHost)) - { - Access20Types(); - Access20Types(); - - client.As(); - } - } + using (var client = new RedisClient(TestConfig.SingleHost)) + { + Access20Types(); + Access20Types(); + client.As(); + } + } - [Test, Ignore("Takes too long - but works!")] - public void Allows_access_of_6100_operations() - { + [Test, Explicit("Takes too long - but works!")] + public void Allows_access_of_6100_operations() + { #if NETCORE - Environment.GetEnvironmentVariable("SERVICESTACK_LICENSE"); + Environment.GetEnvironmentVariable("SERVICESTACK_LICENSE"); #else - Licensing.RegisterLicense(new AppSettings().GetString("servicestack:license")); + Licensing.RegisterLicense(new AppSettings().Get("servicestack:license")); #endif - using (var client = new RedisClient(TestConfig.SingleHost)) - { - 6100.Times(() => client.Get("any key")); - } - } - } + using (var client = new RedisClient(TestConfig.SingleHost)) + { + 6100.Times(() => client.Get("any key")); + } + } + } - class T01 { public int Id { get; set; } } - class T02 { public int Id { get; set; } } - class T03 { public int Id { get; set; } } - class T04 { public int Id { get; set; } } - class T05 { public int Id { get; set; } } - class T06 { public int Id { get; set; } } - class T07 { public int Id { get; set; } } - class T08 { public int Id { get; set; } } - class T09 { public int Id { get; set; } } - class T10 { public int Id { get; set; } } - class T11 { public int Id { get; set; } } - class T12 { public int Id { get; set; } } - class T13 { public int Id { get; set; } } - class T14 { public int Id { get; set; } } - class T15 { public int Id { get; set; } } - class T16 { public int Id { get; set; } } - class T17 { public int Id { get; set; } } - class T18 { public int Id { get; set; } } - class T19 { public int Id { get; set; } } - class T20 { public int Id { get; set; } } - class T21 { public int Id { get; set; } } + class T01 { public int Id { get; set; } } + class T02 { public int Id { get; set; } } + class T03 { public int Id { get; set; } } + class T04 { public int Id { get; set; } } + class T05 { public int Id { get; set; } } + class T06 { public int Id { get; set; } } + class T07 { public int Id { get; set; } } + class T08 { public int Id { get; set; } } + class T09 { public int Id { get; set; } } + class T10 { public int Id { get; set; } } + class T11 { public int Id { get; set; } } + class T12 { public int Id { get; set; } } + class T13 { public int Id { get; set; } } + class T14 { public int Id { get; set; } } + class T15 { public int Id { get; set; } } + class T16 { public int Id { get; set; } } + class T17 { public int Id { get; set; } } + class T18 { public int Id { get; set; } } + class T19 { public int Id { get; set; } } + class T20 { public int Id { get; set; } } + class T21 { public int Id { get; set; } } - public class LicenseUsageTests - { - protected void Access20Types() - { - using (var client = new RedisClient(TestConfig.SingleHost)) - { - client.As(); - client.As(); - client.As(); - client.As(); - client.As(); - client.As(); - client.As(); - client.As(); - client.As(); - client.As(); - client.As(); - client.As(); - client.As(); - client.As(); - client.As(); - client.As(); - client.As(); - client.As(); - client.As(); - client.As(); - } - } - } + public class LicenseUsageTests + { + protected void Access20Types() + { + using (var client = new RedisClient(TestConfig.SingleHost)) + { + client.As(); + client.As(); + client.As(); + client.As(); + client.As(); + client.As(); + client.As(); + client.As(); + client.As(); + client.As(); + client.As(); + client.As(); + client.As(); + client.As(); + client.As(); + client.As(); + client.As(); + client.As(); + client.As(); + client.As(); + } + } + } } \ No newline at end of file diff --git a/tests/ServiceStack.Redis.Tests/ObjectSerializerTests.cs b/tests/ServiceStack.Redis.Tests/ObjectSerializerTests.cs index 6edc5271..b9da1c42 100644 --- a/tests/ServiceStack.Redis.Tests/ObjectSerializerTests.cs +++ b/tests/ServiceStack.Redis.Tests/ObjectSerializerTests.cs @@ -30,5 +30,4 @@ public void Can_serialize_object_with_optimized_serializer() Assert.AreEqual(testFloat, ser.Deserialize(serialized)); } } - } \ No newline at end of file diff --git a/tests/ServiceStack.Redis.Tests/PooledRedisClientManagerTests.cs b/tests/ServiceStack.Redis.Tests/PooledRedisClientManagerTests.cs index 31150fab..fb8a3ac0 100644 --- a/tests/ServiceStack.Redis.Tests/PooledRedisClientManagerTests.cs +++ b/tests/ServiceStack.Redis.Tests/PooledRedisClientManagerTests.cs @@ -11,7 +11,7 @@ namespace ServiceStack.Redis.Tests { - [TestFixture, Category("Integration")] + [TestFixture, Ignore("salves and masters"), Category("Integration")] public class PooledRedisClientManagerTests { [OneTimeSetUp] @@ -454,7 +454,7 @@ private static void UseClient(IRedisClientsManager manager, int clientNo, Dictio hostCountMap[client.Host] = ++hostCount; } - Debug.WriteLine(String.Format("Client '{0}' is using '{1}'", clientNo, client.Host)); + Debug.WriteLine($"Client '{clientNo}' is using '{client.Host}'"); } } diff --git a/tests/ServiceStack.Redis.Tests/RedisClientListTests.cs b/tests/ServiceStack.Redis.Tests/RedisClientListTests.cs index e7003a4b..09770076 100644 --- a/tests/ServiceStack.Redis.Tests/RedisClientListTests.cs +++ b/tests/ServiceStack.Redis.Tests/RedisClientListTests.cs @@ -7,8 +7,7 @@ namespace ServiceStack.Redis.Tests { [TestFixture] - public class RedisClientListTests - : RedisClientTestsBase + public class RedisClientListTests : RedisClientTestsBase { const string ListId = "rcl_testlist"; const string ListId2 = "rcl_testlist2"; diff --git a/tests/ServiceStack.Redis.Tests/RedisClientTests.cs b/tests/ServiceStack.Redis.Tests/RedisClientTests.cs index 9a3878e0..197e91cb 100644 --- a/tests/ServiceStack.Redis.Tests/RedisClientTests.cs +++ b/tests/ServiceStack.Redis.Tests/RedisClientTests.cs @@ -12,8 +12,7 @@ namespace ServiceStack.Redis.Tests { [TestFixture, Category("Integration")] - public class RedisClientTests - : RedisClientTestsBase + public class RedisClientTests : RedisClientTestsBase { const string Value = "Value"; @@ -412,7 +411,7 @@ public void Can_AcquireLock_TimeOut() [Test] public void Can_Append() { - const string expectedString = "Hello, " + "World!"; + string expectedString = "Hello, " + "World!"; Redis.SetValue("key", "Hello, "); var currentLength = Redis.AppendToValue("key", "World!"); @@ -425,7 +424,7 @@ public void Can_Append() [Test] public void Can_GetRange() { - const string helloWorld = "Hello, World!"; + var helloWorld = "Hello, World!"; Redis.SetValue("key", helloWorld); var fromIndex = "Hello, ".Length; @@ -588,15 +587,15 @@ public void Can_change_db_at_runtime() try { redis.Set(key, val); - redis.ChangeDb(2); + redis.Select(2); Assert.That(redis.Get(key), Is.EqualTo(0)); - redis.ChangeDb(1); + redis.Select(1); Assert.That(redis.Get(key), Is.EqualTo(val)); redis.Dispose(); } finally { - redis.ChangeDb(1); + redis.Select(1); redis.Del(key); } } diff --git a/tests/ServiceStack.Redis.Tests/RedisClientTestsBase.cs b/tests/ServiceStack.Redis.Tests/RedisClientTestsBase.cs index 40386c28..970f47d4 100644 --- a/tests/ServiceStack.Redis.Tests/RedisClientTestsBase.cs +++ b/tests/ServiceStack.Redis.Tests/RedisClientTestsBase.cs @@ -1,23 +1,15 @@ -using System; -using System.Diagnostics; using System.Text; using NUnit.Framework; -using ServiceStack.Text; namespace ServiceStack.Redis.Tests { - public class RedisClientTestsBase + public abstract class RedisClientTestsBase { - protected string CleanMask = null; + protected string CleanMask; protected RedisClient Redis; - protected void Log(string fmt, params object[] args) - { - Debug.WriteLine("{0}", string.Format(fmt, args).Trim()); - } - [OneTimeSetUp] - public virtual void OnBeforeTestFixture() + public virtual void TestFixtureSetUp() { RedisClient.NewFactoryFn = () => new RedisClient(TestConfig.SingleHost); using (var redis = RedisClient.New()) @@ -27,9 +19,7 @@ public virtual void OnBeforeTestFixture() } [OneTimeTearDown] - public virtual void OnAfterTestFixture() - { - } + public virtual void TestFixtureTearDown() { } [SetUp] public virtual void OnBeforeEachTest() diff --git a/tests/ServiceStack.Redis.Tests/RedisGeoNativeClientTests.cs b/tests/ServiceStack.Redis.Tests/RedisGeoNativeClientTests.cs index bace21cf..6a1942f2 100644 --- a/tests/ServiceStack.Redis.Tests/RedisGeoNativeClientTests.cs +++ b/tests/ServiceStack.Redis.Tests/RedisGeoNativeClientTests.cs @@ -11,11 +11,11 @@ public class RedisGeoNativeClientTests public RedisGeoNativeClientTests() { - redis = new RedisNativeClient(TestConfig.GeoHost); + redis = new RedisNativeClient(TestConfig.SingleHost); } [OneTimeTearDown] - public void OneTimeTearDown() + public void TestFixtureTearDown() { redis.Dispose(); } diff --git a/tests/ServiceStack.Redis.Tests/RedisHyperLogTests.cs b/tests/ServiceStack.Redis.Tests/RedisHyperLogTests.cs index 7a6af4d6..5268a5d5 100644 --- a/tests/ServiceStack.Redis.Tests/RedisHyperLogTests.cs +++ b/tests/ServiceStack.Redis.Tests/RedisHyperLogTests.cs @@ -1,6 +1,5 @@ using System; using NUnit.Framework; -using ServiceStack.Text; namespace ServiceStack.Redis.Tests { @@ -10,7 +9,7 @@ public class RedisHyperLogTests [Test] public void Can_Add_to_Hyperlog() { - var redis = new RedisClient("10.0.0.14"); + var redis = new RedisClient(TestConfig.SingleHost); redis.FlushAll(); redis.AddToHyperLog("hyperlog", "a", "b", "c"); @@ -28,21 +27,5 @@ public void Can_Add_to_Hyperlog() Assert.That(mergeCount, Is.EqualTo(6)); } - - [Test] - public void Test_on_old_redisserver() - { - var redis = new RedisClient("10.0.0.14"); - //var redis = new RedisClient(); - redis.FlushAll(); - - //redis.ExpireEntryIn("key", TimeSpan.FromDays(14)); - - redis.Set("key", "value", TimeSpan.FromDays(14)); - - var value = redis.Get("key"); - - value.FromUtf8Bytes().Print(); - } } } \ No newline at end of file diff --git a/tests/ServiceStack.Redis.Tests/RedisManagerPoolTests.cs b/tests/ServiceStack.Redis.Tests/RedisManagerPoolTests.cs index 4aca12c2..3e75f467 100644 --- a/tests/ServiceStack.Redis.Tests/RedisManagerPoolTests.cs +++ b/tests/ServiceStack.Redis.Tests/RedisManagerPoolTests.cs @@ -10,7 +10,7 @@ namespace ServiceStack.Redis.Tests { - [TestFixture, Category("Integration")] + [TestFixture, Ignore("salves and masters"), Category("Integration")] public class RedisManagerPoolTests { readonly string[] hosts = new[] { diff --git a/tests/ServiceStack.Redis.Tests/RedisNativeClientTests.cs b/tests/ServiceStack.Redis.Tests/RedisNativeClientTests.cs new file mode 100644 index 00000000..267c2b5d --- /dev/null +++ b/tests/ServiceStack.Redis.Tests/RedisNativeClientTests.cs @@ -0,0 +1,57 @@ +using System; +using System.Net.Sockets; +using NUnit.Framework; +using ServiceStack.Logging; + +namespace ServiceStack.Redis.Tests +{ + [TestFixture] + public class RedisNativeClientTests + { + private const string InvalidHost = "192.168.1.100"; + private const int InvalidPort = 9527; + + [OneTimeSetUp] + public void TestFixtureSetUp() => LogManager.LogFactory = new ConsoleLogFactory(); + + [OneTimeTearDown] + public void TestFixtureTearDown() => LogManager.LogFactory = new NullLogFactory(); + + [Test] + public void Cannot_connect_Invalid_address() + { + try + { + var client = new RedisNativeClient(InvalidHost, InvalidPort, db : 1); + } + catch (RedisException ex) + { + Console.Write(ex.Message); + var innerEx = ex.InnerException; + Assert.That(innerEx, Is.TypeOf(typeof(SocketException))); + Assert.That(((SocketException)innerEx).ErrorCode, Is.EqualTo((int)SocketError.TimedOut)); + } + } + + [Test] + public void Cannot_connect_Invalid_address_with_Timeout() + { + try + { + RedisConfig.DefaultConnectTimeout = 1000; + var client = new RedisNativeClient(InvalidHost, InvalidPort, db : 1); + } + catch (RedisException ex) + { + Console.Write(ex.Message); + var innerEx = ex.InnerException; + Assert.That(innerEx, Is.TypeOf(typeof(SocketException))); + Assert.That(((SocketException)innerEx).ErrorCode, Is.EqualTo((int)SocketError.TimedOut)); + } + finally + { + RedisConfig.DefaultConnectTimeout = -1; + } + } + } +} diff --git a/tests/ServiceStack.Redis.Tests/RedisPasswordTests.cs b/tests/ServiceStack.Redis.Tests/RedisPasswordTests.cs index 018e3b10..aedebdfa 100644 --- a/tests/ServiceStack.Redis.Tests/RedisPasswordTests.cs +++ b/tests/ServiceStack.Redis.Tests/RedisPasswordTests.cs @@ -14,37 +14,36 @@ public void Can_connect_to_Slaves_and_Masters_with_Password() readWriteHosts: new[] { "pass@10.0.0.59:6379" }, readOnlyHosts: new[] { "pass@10.0.0.59:6380" }); - using (var readWrite = factory.GetClient()) - using (var readOnly = factory.GetReadOnlyClient()) - { - readWrite.SetValue("Foo", "Bar"); - var value = readOnly.GetValue("Foo"); + using (var readWrite = factory.GetClient()) + using (var readOnly = factory.GetReadOnlyClient()) + { + readWrite.SetValue("Foo", "Bar"); + var value = readOnly.GetValue("Foo"); - Assert.That(value, Is.EqualTo("Bar")); - } - } + Assert.That(value, Is.EqualTo("Bar")); + } + } - [Test] - public void Passwords_are_not_leaked_in_exception_messages() - { - const string password = "yesterdayspassword"; + [Test] + public void Passwords_are_not_leaked_in_exception_messages() + { + const string password = "yesterdayspassword"; - Assert.Throws(() => { - try - { - var factory = new PooledRedisClientManager(password + "@" + TestConfig.SingleHost); // redis will throw when using password and it's not configured - using (var redis = factory.GetClient()) - { - redis.SetValue("Foo", "Bar"); - } - } - catch (RedisResponseException ex) - { - Assert.That(ex.Message, Is.Not.Contains(password)); - throw; - } - }, - "Expected an exception after Redis AUTH command; try using a password that doesn't match."); - } - } + Assert.Throws(() => { + try + { + var factory = new PooledRedisClientManager(password + "@" + TestConfig.SingleHost); // redis will throw when using password and it's not configured + using (var redis = factory.GetClient()) + { + redis.SetValue("Foo", "Bar"); + } + } + catch (RedisResponseException ex) + { + Assert.That(ex.Message, Is.Not.Contains(password)); + throw; + } + }, "Expected an exception after Redis AUTH command; try using a password that doesn't match."); + } + } } \ No newline at end of file diff --git a/tests/ServiceStack.Redis.Tests/RedisPubSubTests.cs b/tests/ServiceStack.Redis.Tests/RedisPubSubTests.cs index 62ff5f4b..622017ba 100644 --- a/tests/ServiceStack.Redis.Tests/RedisPubSubTests.cs +++ b/tests/ServiceStack.Redis.Tests/RedisPubSubTests.cs @@ -31,17 +31,17 @@ public void Can_Subscribe_and_Publish_single_message() { subscription.OnSubscribe = channel => { - Log("Subscribed to '{0}'", channel); + Console.WriteLine("Subscribed to '{0}'", channel); Assert.That(channel, Is.EqualTo(channelName)); }; subscription.OnUnSubscribe = channel => { - Log("UnSubscribed from '{0}'", channel); + Console.WriteLine("UnSubscribed from '{0}'", channel); Assert.That(channel, Is.EqualTo(channelName)); }; subscription.OnMessage = (channel, msg) => { - Log("Received '{0}' from channel '{1}'", msg, channel); + Console.WriteLine("Received '{0}' from channel '{1}'", msg, channel); Assert.That(channel, Is.EqualTo(channelName)); Assert.That(msg, Is.EqualTo(message)); subscription.UnSubscribeFromAllChannels(); @@ -52,16 +52,16 @@ public void Can_Subscribe_and_Publish_single_message() Thread.Sleep(100); // to be sure that we have subscribers using (var redisClient = CreateRedisClient()) { - Log("Publishing '{0}' to '{1}'", message, channelName); + Console.WriteLine("Publishing '{0}' to '{1}'", message, channelName); redisClient.PublishMessage(channelName, message); } }); - Log("Start Listening On " + channelName); + Console.WriteLine("Start Listening On " + channelName); subscription.SubscribeToChannels(channelName); //blocking } - Log("Using as normal client again..."); + Console.WriteLine("Using as normal client again..."); Redis.IncrementValue(key); Assert.That(Redis.Get(key), Is.EqualTo(2)); } @@ -80,17 +80,17 @@ public void Can_Subscribe_and_Publish_single_message_using_wildcard() { subscription.OnSubscribe = channel => { - Log("Subscribed to '{0}'", channelWildcard); + Console.WriteLine("Subscribed to '{0}'", channelWildcard); Assert.That(channel, Is.EqualTo(channelWildcard)); }; subscription.OnUnSubscribe = channel => { - Log("UnSubscribed from '{0}'", channelWildcard); + Console.WriteLine("UnSubscribed from '{0}'", channelWildcard); Assert.That(channel, Is.EqualTo(channelWildcard)); }; subscription.OnMessage = (channel, msg) => { - Log("Received '{0}' from channel '{1}'", msg, channel); + Console.WriteLine("Received '{0}' from channel '{1}'", msg, channel); Assert.That(channel, Is.EqualTo(channelName)); Assert.That(msg, Is.EqualTo(message), "we should get the message, not the channel"); subscription.UnSubscribeFromChannelsMatching(); @@ -101,16 +101,16 @@ public void Can_Subscribe_and_Publish_single_message_using_wildcard() Thread.Sleep(100); // to be sure that we have subscribers using (var redisClient = CreateRedisClient()) { - Log("Publishing '{0}' to '{1}'", message, channelName); + Console.WriteLine("Publishing '{0}' to '{1}'", message, channelName); redisClient.PublishMessage(channelName, message); } }); - Log("Start Listening On " + channelName); + Console.WriteLine("Start Listening On " + channelName); subscription.SubscribeToChannelsMatching(channelWildcard); //blocking } - Log("Using as normal client again..."); + Console.WriteLine("Using as normal client again..."); Redis.IncrementValue(key); Assert.That(Redis.Get(key), Is.EqualTo(2)); } @@ -130,17 +130,17 @@ public void Can_Subscribe_and_Publish_multiple_message() { subscription.OnSubscribe = channel => { - Log("Subscribed to '{0}'", channel); + Console.WriteLine("Subscribed to '{0}'", channel); Assert.That(channel, Is.EqualTo(channelName)); }; subscription.OnUnSubscribe = channel => { - Log("UnSubscribed from '{0}'", channel); + Console.WriteLine("UnSubscribed from '{0}'", channel); Assert.That(channel, Is.EqualTo(channelName)); }; subscription.OnMessage = (channel, msg) => { - Log("Received '{0}' from channel '{1}'", msg, channel); + Console.WriteLine("Received '{0}' from channel '{1}'", msg, channel); Assert.That(channel, Is.EqualTo(channelName)); Assert.That(msg, Is.EqualTo(messagePrefix + messagesReceived++)); @@ -159,17 +159,17 @@ public void Can_Subscribe_and_Publish_multiple_message() for (var i = 0; i < publishMessageCount; i++) { var message = messagePrefix + i; - Log("Publishing '{0}' to '{1}'", message, channelName); + Console.WriteLine("Publishing '{0}' to '{1}'", message, channelName); redisClient.PublishMessage(channelName, message); } } }); - Log("Start Listening On"); + Console.WriteLine("Start Listening On"); subscription.SubscribeToChannels(channelName); //blocking } - Log("Using as normal client again..."); + Console.WriteLine("Using as normal client again..."); Redis.IncrementValue(key); Assert.That(Redis.Get(key), Is.EqualTo(2)); @@ -197,17 +197,17 @@ public void Can_Subscribe_and_Publish_message_to_multiple_channels() { subscription.OnSubscribe = channel => { - Log("Subscribed to '{0}'", channel); + Console.WriteLine("Subscribed to '{0}'", channel); Assert.That(channel, Is.EqualTo(channelPrefix + channelsSubscribed++)); }; subscription.OnUnSubscribe = channel => { - Log("UnSubscribed from '{0}'", channel); + Console.WriteLine("UnSubscribed from '{0}'", channel); Assert.That(channel, Is.EqualTo(channelPrefix + channelsUnSubscribed++)); }; subscription.OnMessage = (channel, msg) => { - Log("Received '{0}' from channel '{1}'", msg, channel); + Console.WriteLine("Received '{0}' from channel '{1}'", msg, channel); Assert.That(channel, Is.EqualTo(channelPrefix + messagesReceived++)); Assert.That(msg, Is.EqualTo(message)); @@ -222,17 +222,17 @@ public void Can_Subscribe_and_Publish_message_to_multiple_channels() { foreach (var channel in channels) { - Log("Publishing '{0}' to '{1}'", message, channel); + Console.WriteLine("Publishing '{0}' to '{1}'", message, channel); redisClient.PublishMessage(channel, message); } } }); - Log("Start Listening On"); + Console.WriteLine("Start Listening On"); subscription.SubscribeToChannels(channels.ToArray()); //blocking } - Log("Using as normal client again..."); + Console.WriteLine("Using as normal client again..."); Redis.IncrementValue(key); Assert.That(Redis.Get(key), Is.EqualTo(2)); @@ -259,12 +259,12 @@ public void Can_Subscribe_to_channel_pattern() using (var redisClient = CreateRedisClient()) { - Log("Publishing msg..."); + Console.WriteLine("Publishing msg..."); redisClient.Publish(PrefixedKey("CHANNEL4:TITLE1"), "hello".ToUtf8Bytes()); } }); - Log("Start Listening On"); + Console.WriteLine("Start Listening On"); subscription.SubscribeToChannelsMatching(PrefixedKey("CHANNEL4:TITLE*")); } } @@ -288,12 +288,12 @@ public void Can_Subscribe_to_multiplechannel_pattern() using (var redisClient = CreateRedisClient()) { - Log("Publishing msg..."); + Console.WriteLine("Publishing msg..."); redisClient.Publish(PrefixedKey("CHANNEL5:BODY"), "hello".ToUtf8Bytes()); } }); - Log("Start Listening On"); + Console.WriteLine("Start Listening On"); subscription.SubscribeToChannelsMatching(channels); } } diff --git a/tests/ServiceStack.Redis.Tests/RedisStatsTests.cs b/tests/ServiceStack.Redis.Tests/RedisStatsTests.cs index 04dc8853..ee697c15 100644 --- a/tests/ServiceStack.Redis.Tests/RedisStatsTests.cs +++ b/tests/ServiceStack.Redis.Tests/RedisStatsTests.cs @@ -4,12 +4,12 @@ namespace ServiceStack.Redis.Tests { [TestFixture] - public class RedisStatsTests - : RedisClientTestsBase + public class RedisStatsTests : RedisClientTestsBase { [OneTimeSetUp] - public void OneTimeSetUp() + public override void TestFixtureSetUp() { + base.TestFixtureSetUp(); RedisConfig.AssumeServerVersion = 2821; } @@ -20,7 +20,7 @@ public void Batch_and_Pipeline_requests_only_counts_as_1_request() var reqCount = RedisNativeClient.RequestsPerHour; var map = new Dictionary(); - 10.Times(i => map["key" + i] = "value" + i); + 10.Times(i => { map["key" + i] = "value" + i; }); Redis.SetValues(map); diff --git a/tests/ServiceStack.Redis.Tests/ServiceStack.Redis.Tests.csproj b/tests/ServiceStack.Redis.Tests/ServiceStack.Redis.Tests.csproj index 0e24520b..13d83bf9 100644 --- a/tests/ServiceStack.Redis.Tests/ServiceStack.Redis.Tests.csproj +++ b/tests/ServiceStack.Redis.Tests/ServiceStack.Redis.Tests.csproj @@ -3,7 +3,7 @@ net46;netcoreapp2.0 - portable + ServiceStack.Redis.Tests Library ServiceStack.Redis.Tests @@ -19,6 +19,9 @@ + + + diff --git a/tests/ServiceStack.Redis.Tests/SslTests.cs b/tests/ServiceStack.Redis.Tests/SslTests.cs index 65a7a51c..20d656fa 100644 --- a/tests/ServiceStack.Redis.Tests/SslTests.cs +++ b/tests/ServiceStack.Redis.Tests/SslTests.cs @@ -24,12 +24,12 @@ public class SslTests private string connectionString; [OneTimeSetUp] - public void OneTimeSetUp() + public void TestFixtureSetUp() { var settings = new TextFileSettings("~/azureconfig.txt".MapProjectPath()); - Host = settings.GetString("Host"); + Host = settings.Get("Host"); Port = settings.Get("Port", 6379); - Password = settings.GetString("Password"); + Password = settings.Get("Password"); connectionString = "{0}@{1}".Fmt(Password, Host); } diff --git a/tests/ServiceStack.Redis.Tests/TestConfig.cs b/tests/ServiceStack.Redis.Tests/TestConfig.cs index 0712ad75..9d8f8921 100644 --- a/tests/ServiceStack.Redis.Tests/TestConfig.cs +++ b/tests/ServiceStack.Redis.Tests/TestConfig.cs @@ -15,7 +15,7 @@ static TestConfig() public static string SingleHost => Environment.GetEnvironmentVariable("CI_REDIS") ?? "localhost"; - public static string GeoHost => Environment.GetEnvironmentVariable("CI_REDIS") ?? "10.0.0.121"; + public static string GeoHost => Environment.GetEnvironmentVariable("CI_REDIS") ?? "localhost"; public static readonly string[] MasterHosts = new[] { "localhost" }; public static readonly string[] SlaveHosts = new[] { "localhost" }; diff --git a/tests/ServiceStack.Redis.Tests/TwemproxyTests.cs b/tests/ServiceStack.Redis.Tests/TwemproxyTests.cs index a69f6e9d..abbeee85 100644 --- a/tests/ServiceStack.Redis.Tests/TwemproxyTests.cs +++ b/tests/ServiceStack.Redis.Tests/TwemproxyTests.cs @@ -1,5 +1,4 @@ using NUnit.Framework; -using ServiceStack.Text; namespace ServiceStack.Redis.Tests { diff --git a/tests/ServiceStack.Redis.Tests/UserSessionRedisClientTests.cs b/tests/ServiceStack.Redis.Tests/UserSessionRedisClientTests.cs index 10ba3109..5f0b5378 100644 --- a/tests/ServiceStack.Redis.Tests/UserSessionRedisClientTests.cs +++ b/tests/ServiceStack.Redis.Tests/UserSessionRedisClientTests.cs @@ -12,9 +12,14 @@ namespace ServiceStack.Redis.Tests [TestFixture, Category("Integration")] public class UserSessionTests { + [OneTimeSetUp] + public void TestFixtureSetUp() => LogManager.LogFactory = new ConsoleLogFactory(); + + [OneTimeTearDown] + public void TestFixtureTearDown() => LogManager.LogFactory = new NullLogFactory(); + static UserSessionTests() { - LogManager.LogFactory = new ConsoleLogFactory(); } //MasterUser master;