public async Task <ValidateAddress> ValidateAddressAsync(ValidateAddress request, CancellationToken cancellationToken = default)
    {
        try
        {
            // don't waste resources
            if (!AddressAttributes.SupportedCountries.ContainsKey(request.OriginalAddress.CountryCode))
            {
                return(request);
            }

            var client = new v4.AddressValidationPortTypeClient(
                v4.AddressValidationPortTypeClient.EndpointConfiguration.AddressValidationServicePort,
                _options.Url);

            var wrap = CreateRequest(request);

            var serviceRequest = new v4.addressValidationRequest1(wrap);

            var reply = await client.addressValidationAsync(serviceRequest);

            if (reply.AddressValidationReply.HighestSeverity == v4.NotificationSeverityType.SUCCESS ||
                reply.AddressValidationReply.HighestSeverity == v4.NotificationSeverityType.NOTE ||
                reply.AddressValidationReply.HighestSeverity == v4.NotificationSeverityType.WARNING)
            {
                var result           = reply.AddressValidationReply;
                var addressResults   = result.AddressResults[0];
                var effectiveAddress = addressResults.EffectiveAddress;
                var parsedAddress    = addressResults.ParsedAddressPartsDetail;
                var lines            = effectiveAddress?.StreetLines ?? new string[1] {
                    string.Empty
                };

                request.ProposedAddress = new Address(
                    lines[0],
                    effectiveAddress?.City ?? string.Empty,
                    effectiveAddress?.StateOrProvinceCode ?? string.Empty,
                    effectiveAddress?.PostalCode ?? string.Empty,
                    effectiveAddress?.CountryCode ?? string.Empty,
                    effectiveAddress?.Residential ?? true);

                if (lines.Length == 2)
                {
                    request.ProposedAddress.StreetLine2 = lines[1];
                }

                request.ProposedAddress.IsResidential = addressResults.Classification switch
                {
                    v4.FedExAddressClassificationType.MIXED => false,
                    v4.FedExAddressClassificationType.BUSINESS => false,
                    _ => true,
                };

                if (!request.ValidationBag.ContainsKey("Classification"))
                {
                    request.ValidationBag.Add("Classification", addressResults.Classification.ToString());
                }

                if (!request.ValidationBag.ContainsKey("State"))
                {
                    request.ValidationBag.Add("State", addressResults.State.ToString());
                }

                foreach (var a in addressResults.Attributes)
                {
                    if (!request.ValidationBag.ContainsKey(a.Name))
                    {
                        request.ValidationBag.Add(a.Name, a.Value);
                    }
                }
            }
            else
            {
                var exMsg = string.Empty;
                foreach (var notification in reply.AddressValidationReply.Notifications)
                {
                    exMsg += notification.Message;
                    request.Errors.Add(new Error
                    {
                        Source      = notification.Source,
                        Number      = notification.Code,
                        Description = notification.Message
                    });
                }
            }
        }
        catch (Exception ex)
        {
            var exMsg = "FedExValidation client failed";
            _logger.LogError(ex, exMsg);
            request.InternalErrors.Add(ex?.Message ?? exMsg);
        }

        return(request);
    }
 private static System.ServiceModel.EndpointAddress GetDefaultEndpointAddress()
 {
     return(AddressValidationPortTypeClient.GetEndpointAddress(EndpointConfiguration.AddressValidationServicePort));
 }
 private static System.ServiceModel.Channels.Binding GetDefaultBinding()
 {
     return(AddressValidationPortTypeClient.GetBindingForEndpoint(EndpointConfiguration.AddressValidationServicePort));
 }
 public AddressValidationPortTypeClient(EndpointConfiguration endpointConfiguration, System.ServiceModel.EndpointAddress remoteAddress) :
     base(AddressValidationPortTypeClient.GetBindingForEndpoint(endpointConfiguration), remoteAddress)
 {
     this.Endpoint.Name = endpointConfiguration.ToString();
     ConfigureEndpoint(this.Endpoint, this.ClientCredentials);
 }
 public AddressValidationPortTypeClient(EndpointConfiguration endpointConfiguration) :
     base(AddressValidationPortTypeClient.GetBindingForEndpoint(endpointConfiguration), AddressValidationPortTypeClient.GetEndpointAddress(endpointConfiguration))
 {
     this.Endpoint.Name = endpointConfiguration.ToString();
     ConfigureEndpoint(this.Endpoint, this.ClientCredentials);
 }
 public AddressValidationPortTypeClient() :
     base(AddressValidationPortTypeClient.GetDefaultBinding(), AddressValidationPortTypeClient.GetDefaultEndpointAddress())
 {
     this.Endpoint.Name = EndpointConfiguration.AddressValidationServicePort.ToString();
     ConfigureEndpoint(this.Endpoint, this.ClientCredentials);
 }