将SOAP隐式标头添加到WSDL

| 我的问题与此类似。 WSDL未定义时如何传递Soap Header?但是是不同的。 对于我使用的Web服务,所有方法都需要身份验证,该身份验证以SOAP标头内的明文形式发送。但是,我的WSDL不包含任何soap标头信息。我有一个自定义平台工具,必须使用该工具从WSDL生成代码。由于标题信息不可用,因此无法直接使用生成的类-我不想手动修改代码以容纳标题。 我尝试在WSDL中指定SOAP标头,但无法获取正确的名称空间。 WSDL在这里https://stage.totalcheck.sensis.com.au/service/webservice?wsdl,并且SOAP标头如下:
    <soapenv:Header>
        <wsse:Security>
            <wsse:UsernameToken>
                <wsse:Username>username</wsse:Username>
                <wsse:Password>password</wsse:Password>
            </wsse:UsernameToken>
        </wsse:Security>
   </soapenv:Header>
有人能帮我吗?谢谢!
已邀请:
从概念的角度来看,WSDL不应定义标头。 WSDL仅用于定义服务的功能方面,例如操作,消息,绑定和端点。消息和绑定定义了消息的有效负载应如何编码和格式化。 但是,SOAP消息的头不属于有效负载。它们通常用于配置SOAP处理器的非功能属性。安全性是一种无功能的属性。有效负载的功能方面不受影响。只能确保通信是安全的,并且WS工具栈(而不是服务实现)应该注意这一点。 因此,缺少的部分现在是允许将一些非功能性需求附加到WSDL服务的标准,以便代码生成器可以自动派生需要发送和/或理解的标头,以便根据需要实现非功能性属性- -无需手动处理标题字段。该标准存在,称为WS-Policy。策略通常包含一组替代方案,这些替代方案暴露了提供者和使用者都应能够满足的一组要求。当假定两个服务相互交互时,将采用两个策略并计算一个所谓的“有效策略”。它定义了常见的非功能性要求。使用此信息,提供者和使用者可以配置自己以添加所需的标头,例如WS-Security标头。 WS-SecurityPolicy还定义了一组可以使用的策略。 WS-PolicyAttachment定义了如何将此类策略附加到WSDL。 有一些代码生成器可以处理WS-Policies,例如Metro或Axis2
您可以使用SoapHeader属性装饰wsdl生成的代理类中的方法,从而将soap标头信息添加到方法调用中。 例如,当您“添加Web引用”时,wsdl.exe将为Web服务引用生成客户端代理类Reference.cs。在上面提到的链接https://stage.totalcheck.sensis.com.au/service/webservice?wsdl中,有一条消息notifyAddress,当您添加网站时,该消息将转换为生成的reference.cs客户端代理代码文件中的方法。来自Visual Studio的参考。默认情况下,调用此方法时,肥皂信封中将没有标题。要将SoapHeader添加到此请求的信封中,请在Reference.cs生成的类中的SubmitAddress方法的顶部添加[SoapHeader(\“ Security \”)]属性,其中\“ Security \”是继承自该类的类SoapHeader基类。 对于上述必需的Security SoapHeader的示例,您将创建以下类,
public partial class Security : SoapHeader
{
    public UserNameToken UserNameToken { get; set; }
}

public partial class UserNameToken
{
    public string UserName { get; set; }
    public string Password { get; set; }
}
然后,您可以像下面那样在reference.cs中装饰SuggestAddress方法,
[SoapHeader(\"Security\")]
public suggestAddressesResult suggestAddresses([System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] addressSearch search) {
        object[] results = this.Invoke(\"suggestAddresses\", new object[] {search});
        return ((suggestAddressesResult)(results[0]));
    }
这样可以确保调用方法notifyAddress时创建的每个信封都包含一个类似于上述内容的安全标头,
<soapenv:Header>
    <wsse:Security>
        <wsse:UsernameToken>
            <wsse:Username>username</wsse:Username>
            <wsse:Password>password</wsse:Password>
        </wsse:UsernameToken>
    </wsse:Security>
对于我来说,使用此问题来帮助自己的关键是(正如某些人指出的那样)认识到所讨论的标头是WS-Security标准的标头。 如果您的代理生成工具是\“ custom \”,那么看起来您可以进行切换以自动添加WS-Security标头似乎是合乎逻辑的。但是,如果您使用的是WSDL.exe(在Visual Studio中为\“添加Web引用\”),请考虑使用(4ѭ(\“添加服务引用\”)。 如果使用WCF代理,则可以覆盖给定的配置,并允许WCF为您添加标头:
<security mode=\"TransportWithMessageCredential\">
    <transport clientCredentialType=\"None\" proxyCredentialType=\"None\" realm=\"\" />
    <message clientCredentialType=\"UserName\" algorithmSuite=\"Default\" />
</security>
从那里您可以指定密码:
RemoteSvcProxy.TheirClient client = new RemoteSvcProxy.TheirClient();
client.ClientCredentials.UserName.UserName = \"uname\";
client.ClientCredentials.UserName.Password = \"pwd\";
我不知道您的自定义工具是什么,但也许它所基于的框架也具有类似的配置选项。

要回复问题请先登录注册