diff --git a/src/SignalRServiceExtension/Bindings/SignalRInputBindings/SecurityTokenValidationInputBinding.cs b/src/SignalRServiceExtension/Bindings/SignalRInputBindings/SecurityTokenValidationInputBinding.cs index d9620604..ec9dcd3e 100644 --- a/src/SignalRServiceExtension/Bindings/SignalRInputBindings/SecurityTokenValidationInputBinding.cs +++ b/src/SignalRServiceExtension/Bindings/SignalRInputBindings/SecurityTokenValidationInputBinding.cs @@ -30,12 +30,8 @@ public Task BindAsync(object value, ValueBindingContext context) throw new NotSupportedException($"Argument {nameof(HttpRequest)} is null. {nameof(SecurityTokenValidationAttribute)} must work with HttpTrigger."); } - if (securityTokenValidator == null) - { - return Task.FromResult((IValueProvider)new SignalRValueProvider(null)); - } - - return Task.FromResult((IValueProvider)new SignalRValueProvider(securityTokenValidator.ValidateToken(request))); + return Task.FromResult(SignalRValueProvider.Create( + securityTokenValidator?.ValidateToken(request))); } public Task BindAsync(BindingContext context) diff --git a/src/SignalRServiceExtension/Bindings/SignalRInputBindings/SignalRConnectionInputBinding.cs b/src/SignalRServiceExtension/Bindings/SignalRInputBindings/SignalRConnectionInputBinding.cs index 157c81f6..8b2296de 100644 --- a/src/SignalRServiceExtension/Bindings/SignalRInputBindings/SignalRConnectionInputBinding.cs +++ b/src/SignalRServiceExtension/Bindings/SignalRInputBindings/SignalRConnectionInputBinding.cs @@ -1,12 +1,9 @@ // Copyright (c) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. -using System; using System.Collections.Generic; -using System.Reflection; using Microsoft.AspNetCore.Http; using Microsoft.Azure.WebJobs.Host.Bindings; -using Microsoft.Azure.WebJobs.Host.Protocols; using System.Threading.Tasks; using Microsoft.Extensions.Configuration; @@ -37,7 +34,7 @@ protected override Task BuildAsync(SignalRConnectionInfoAttribut { var info = azureSignalRClient.GetClientConnectionInfo(attrResolved.UserId, attrResolved.IdToken, attrResolved.ClaimTypeList); - return Task.FromResult((IValueProvider)new SignalRValueProvider(info)); + return Task.FromResult(SignalRValueProvider.Create(info)); } var request = bindingData[HttpRequestName] as HttpRequest; @@ -46,14 +43,14 @@ protected override Task BuildAsync(SignalRConnectionInfoAttribut if (tokenResult.Status != SecurityTokenStatus.Valid) { - return Task.FromResult((IValueProvider)new SignalRValueProvider(null)); + return Task.FromResult(SignalRValueProvider.NullOf()); } if (signalRConnectionInfoConfigurer == null) { var info = azureSignalRClient.GetClientConnectionInfo(attrResolved.UserId, attrResolved.IdToken, attrResolved.ClaimTypeList); - return Task.FromResult((IValueProvider)new SignalRValueProvider(info)); + return Task.FromResult(SignalRValueProvider.Create(info)); } var signalRConnectionDetail = new SignalRConnectionDetail @@ -64,7 +61,7 @@ protected override Task BuildAsync(SignalRConnectionInfoAttribut signalRConnectionInfoConfigurer.Configure(tokenResult, request, signalRConnectionDetail); var customizedInfo = azureSignalRClient.GetClientConnectionInfo(signalRConnectionDetail.UserId, signalRConnectionDetail.Claims); - return Task.FromResult((IValueProvider)new SignalRValueProvider(customizedInfo)); + return Task.FromResult(SignalRValueProvider.Create(customizedInfo)); } } } \ No newline at end of file diff --git a/src/SignalRServiceExtension/Bindings/SignalRInputBindings/SignalRValueProvider.cs b/src/SignalRServiceExtension/Bindings/SignalRInputBindings/SignalRValueProvider.cs index 8e317641..bff18d93 100644 --- a/src/SignalRServiceExtension/Bindings/SignalRInputBindings/SignalRValueProvider.cs +++ b/src/SignalRServiceExtension/Bindings/SignalRInputBindings/SignalRValueProvider.cs @@ -9,23 +9,47 @@ namespace Microsoft.Azure.WebJobs.Extensions.SignalRService { internal class SignalRValueProvider : IValueProvider { - private object value; + private readonly Task value; - public SignalRValueProvider(object value) + public Type Type { get; } + + private SignalRValueProvider(object value, Type valueType) { - this.value = value; + this.value = Task.FromResult(value); + + Type = valueType; } + internal static IValueProvider Create(T value) where T : class + => value == null + ? NullOf() + : new SignalRValueProvider(value, value.GetType()); + + internal static IValueProvider NullOf() where T : class + => SignalRNullValueProvider.Instance; + public Task GetValueAsync() - { - return Task.FromResult(value); - } + => value; public string ToInvokeString() + => value.ToString(); + + private class SignalRNullValueProvider : IValueProvider { - return value?.ToString(); - } + private readonly Task nullObjectTask = Task.FromResult(null); - public Type Type { get; } + internal static readonly SignalRNullValueProvider Instance = new SignalRNullValueProvider(); + + public Type Type { get; } + + private SignalRNullValueProvider() + => Type = typeof(T); + + public Task GetValueAsync() + => nullObjectTask; + + public string ToInvokeString() + => null; + } } -} +} \ No newline at end of file