如何在代码中将OrganizationToken添加到WCF端点

时间:2019-01-23 18:42:20

标签: c# .net wcf

我正在尝试连接到供应商的SOAP API,并且我有他们提供的示例项目。我试图弄清楚如何用代码中创建的端点替换app.config中的端点,以便我可以使用DI加载端点URL,用户名和密码。

这是来自app.config的相关XML:

<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>
</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 :(得分:0)

我看到您app.config已配置了headers节点,看来您没有使用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用于在请求标头中添加标头。