diff --git a/src/csharp/Grpc.Core.Api/ChannelCredentials.cs b/src/csharp/Grpc.Core.Api/ChannelCredentials.cs index 23ede0a512e..19b808037d3 100644 --- a/src/csharp/Grpc.Core.Api/ChannelCredentials.cs +++ b/src/csharp/Grpc.Core.Api/ChannelCredentials.cs @@ -30,7 +30,7 @@ namespace Grpc.Core /// public abstract class ChannelCredentials { - static readonly ChannelCredentials InsecureInstance = new InsecureCredentialsImpl(); + static readonly ChannelCredentials InsecureInstance = new InsecureCredentials(); /// /// Creates a new instance of channel credentials @@ -74,7 +74,7 @@ namespace Grpc.Core /// internal virtual bool IsComposable => false; - private sealed class InsecureCredentialsImpl : ChannelCredentials + private sealed class InsecureCredentials : ChannelCredentials { public override void InternalPopulateConfiguration(ChannelCredentialsConfiguratorBase configurator, object state) { @@ -101,7 +101,11 @@ namespace Grpc.Core { this.channelCredentials = GrpcPreconditions.CheckNotNull(channelCredentials); this.callCredentials = GrpcPreconditions.CheckNotNull(callCredentials); - GrpcPreconditions.CheckArgument(channelCredentials.IsComposable, "Supplied channel credentials do not allow composition."); + + if (!channelCredentials.IsComposable) + { + throw new ArgumentException(string.Format("CallCredentials can't be composed with {0}. CallCredentials must be used with secure channel credentials like SslCredentials.", channelCredentials.GetType().Name)); + } } public override void InternalPopulateConfiguration(ChannelCredentialsConfiguratorBase configurator, object state) diff --git a/src/csharp/Grpc.Core.Tests/ChannelCredentialsTest.cs b/src/csharp/Grpc.Core.Tests/ChannelCredentialsTest.cs index 57acfc0bab5..4be6a06131c 100644 --- a/src/csharp/Grpc.Core.Tests/ChannelCredentialsTest.cs +++ b/src/csharp/Grpc.Core.Tests/ChannelCredentialsTest.cs @@ -40,7 +40,8 @@ namespace Grpc.Core.Tests Assert.Throws(typeof(ArgumentNullException), () => ChannelCredentials.Create(new FakeChannelCredentials(true), null)); // forbid composing non-composable - Assert.Throws(typeof(ArgumentException), () => ChannelCredentials.Create(new FakeChannelCredentials(false), new FakeCallCredentials())); + var ex = Assert.Throws(typeof(ArgumentException), () => ChannelCredentials.Create(new FakeChannelCredentials(false), new FakeCallCredentials())); + Assert.AreEqual("CallCredentials can't be composed with FakeChannelCredentials. CallCredentials must be used with secure channel credentials like SslCredentials.", ex.Message); } [Test]