Как добавить OrganizationToken в конечную точку WCF в коде - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь подключиться к SOAP API поставщика, и у меня есть пример проекта, который они предоставили, который работает.Я пытаюсь выяснить, как заменить их конечную точку, которая находится в app.config, на созданную в коде, чтобы я мог загрузить URL-адрес, имя пользователя и пароль конечной точки с помощью DI.

Вот соответствующий XML изapp.config:

<client> <endpoint address="https://strongmail.com/sm/services/mailing/v2" binding="basicHttpBinding" bindingConfiguration="MailingServiceServiceSoapBinding" contract="MailingService" name="MailingServicePort"> <headers> <SOAP-ENV:Header xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> <wsse:UsernameToken wsu:Id="UsernameToken"> <wsse:Username>Username</wsse:Username> <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">Password</wsse:Password> </wsse:UsernameToken> <OrganizationToken xmlns="http://www.strongmail.com/services/v2/schema"> <organizationName>admin</organizationName> <subOrganizationId> <id>1</id> </subOrganizationId> </OrganizationToken> </wsse:Security> </SOAP-ENV:Header> </headers> </endpoint><br> </client>

Это код, который я пытаюсь использовать для создания экземпляра.

public class SelligentOrganizationToken
    {
        public string organizationName { get; set; }
        public SelligentOrganization subOrganizationId { get; set; }
    }

    public class SelligentOrganization
    {
        public string id { get; set; }
    }

    private MailingService CreateMailingService(string mailingServiceUrl, string userName, string password)
    {

        var securityElement = SecurityBindingElement.CreateUserNameOverTransportBindingElement();
        securityElement.IncludeTimestamp = false;
        var encodingElement = new TextMessageEncodingBindingElement(MessageVersion.Soap11, Encoding.UTF8);
        var transportElement = new HttpsTransportBindingElement();

        var customBinding = new CustomBinding(securityElement, encodingElement, transportElement);

        var remoteAddress = new EndpointAddress(mailingServiceUrl);

        var mailingService = new MailingServiceClient(customBinding, remoteAddress);

        mailingService.ClientCredentials.UserName.UserName = userName;
        mailingService.ClientCredentials.UserName.Password = password;

        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11;

        var selligentOrganizationToken = new SelligentOrganizationToken()
        {
            organizationName = "admin",
            subOrganizationId = new SelligentOrganization()
            {
                id = "1"
            }
        };

        //Serialize object to xml
        XmlObjectSerializer xmlObjectSerializer = new DataContractSerializer(typeof(SelligentOrganizationToken), "OrganizationToken", "http://www.strongmail.com/services/v2/schema");

        var eab = new EndpointAddressBuilder(mailingService.Endpoint.Address);
        eab.Headers.Add(AddressHeader.CreateAddressHeader("OrganizationToken", "http://www.strongmail.com/services/v2/schema", selligentOrganizationToken, xmlObjectSerializer));
        mailingService.Endpoint.Address = eab.ToEndpointAddress();

        return mailingService;
    }

Когда я пытаюсь запустить это, я получаю:

System.ServiceModel.FaultException: 'Обнаружена ошибка безопасности при проверке сообщения'

Что, кстати, то, что я получаю при выполнении примера кода, если я удаляю узел OrganizationToken.

Любая помощь по этому вопросу будет принята с благодарностью, заранее спасибо!

1 Ответ

0 голосов
/ 25 января 2019

Я вижу, что app.config настроил узел заголовков, и кажется, что вы не используете endpointconfig. Вместо этого вы добавляете заголовки в ваш код на c #.

Как насчет непосредственного использования конфигурации конечной точки в вашем app.config?

var mailingService = new MailingServiceClient("MailingServicePort")

Если вы хотите добавить addressHeader, вы также можете попробовать использовать OutgoingMessageHeaders или HttpRequestMessageProperty. https://code.msdn.microsoft.com/windowsapps/How-to-add-custom-5cbbf066

Пожалуйста, убедитесь, что вы хотите добавить заголовок, OutgoingMessageHeaders используется для добавления заголовка мыла, а HttpRequestMessageProperty используется для добавления заголовка в заголовок запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...