diff --git a/src/AVEVA.Historian.Client/Wcf/HistorianWcfAuthChainHelper.cs b/src/AVEVA.Historian.Client/Wcf/HistorianWcfAuthChainHelper.cs index 5031b24..934d5ed 100644 --- a/src/AVEVA.Historian.Client/Wcf/HistorianWcfAuthChainHelper.cs +++ b/src/AVEVA.Historian.Client/Wcf/HistorianWcfAuthChainHelper.cs @@ -41,7 +41,7 @@ internal static class HistorianWcfAuthChainHelper try { - IHistoryServiceContract2 historyChannel = historyFactory.CreateChannel(); + IHistoryServiceContract2 historyChannel = HistorianWcfClientCredentialsHelper.CreateChannel(historyFactory, options); ICommunicationObject historyChannelCo = (ICommunicationObject)historyChannel; try { diff --git a/src/AVEVA.Historian.Client/Wcf/HistorianWcfClientCredentialsHelper.cs b/src/AVEVA.Historian.Client/Wcf/HistorianWcfClientCredentialsHelper.cs index b8689f5..83bec42 100644 --- a/src/AVEVA.Historian.Client/Wcf/HistorianWcfClientCredentialsHelper.cs +++ b/src/AVEVA.Historian.Client/Wcf/HistorianWcfClientCredentialsHelper.cs @@ -2,7 +2,6 @@ using System.IdentityModel.Selectors; using System.IdentityModel.Tokens; using System.Security.Cryptography.X509Certificates; using System.ServiceModel; -using System.ServiceModel.Description; using System.ServiceModel.Security; namespace AVEVA.Historian.Client.Wcf; @@ -29,14 +28,24 @@ internal static class HistorianWcfClientCredentialsHelper RevocationMode = X509RevocationMode.NoCheck, }; } + } - // Tunnel/proxy support: connect to the Via address while still addressing the message To the - // logical endpoint (Host/Port). Lets a port-forward whose local port differs from the server's - // real service port satisfy the server-side WCF AddressFilter (which checks the To header). - if (!string.IsNullOrWhiteSpace(options.ConnectViaAddress)) - { - factory.Endpoint.EndpointBehaviors.Add(new ClientViaBehavior(new Uri(options.ConnectViaAddress))); - } + /// + /// Creates a channel from , honoring + /// when set: the channel connects to + /// the Via address while still addressing the SOAP message To the factory's logical endpoint. + /// This lets a port-forward whose local port differs from the server's real service port satisfy the + /// server-side WCF AddressFilter (which validates the To header). Use this in place of + /// factory.CreateChannel() at every WCF event/read channel-creation site. + /// + public static TChannel CreateChannel(ChannelFactory factory, HistorianClientOptions options) + { + ArgumentNullException.ThrowIfNull(factory); + ArgumentNullException.ThrowIfNull(options); + + return string.IsNullOrWhiteSpace(options.ConnectViaAddress) + ? factory.CreateChannel() + : factory.CreateChannel(factory.Endpoint.Address, new Uri(options.ConnectViaAddress)); } private sealed class AcceptAnyCertificateValidator : X509CertificateValidator diff --git a/src/AVEVA.Historian.Client/Wcf/HistorianWcfEventOrchestrator.cs b/src/AVEVA.Historian.Client/Wcf/HistorianWcfEventOrchestrator.cs index c8f81a5..d1aaca5 100644 --- a/src/AVEVA.Historian.Client/Wcf/HistorianWcfEventOrchestrator.cs +++ b/src/AVEVA.Historian.Client/Wcf/HistorianWcfEventOrchestrator.cs @@ -167,7 +167,7 @@ internal sealed class HistorianWcfEventOrchestrator try { - IRetrievalServiceContract4 channel = factory.CreateChannel(); + IRetrievalServiceContract4 channel = HistorianWcfClientCredentialsHelper.CreateChannel(factory, _options); ICommunicationObject channelCo = (ICommunicationObject)channel; try {