如何定义要包含在XML请求标头中的XML名称空间,它将通过调用Web服务调用发送?

时间:2014-11-24 15:11:46

标签: c# xml web-services wcf soap

我在VS 2012中开发了一个C#类,我必须通过HTTPS(一种远程Web服务方法)调用(使用)。我已经应用代码来为安全标记创建自定义标头,但是我必须在根中应用名称空间的声明,如

xmlns:ns1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"

必须通过Web服务方法调用发送的完整XML请求(并且已使用SOAP UI成功测试),如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
    <env:Header>
        <ns1:Security>
            <ns1:UsernameToken>
                <ns1:Username>XXXXXXXXXXXXXXXXXXXX</ns1:Username>
                <ns1:Password>ZZZZZZZZZZZZZZZZZZZZ</ns1:Password>
            </ns1:UsernameToken>
        </ns1:Security>
    </env:Header>
    <env:Body>
        <ns:vhWsVersion/>
    </env:Body>
</env:Envelope>

为此,使用命名空间

xmlns:ns1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
必须通过调用Web服务方法来包含

如何实现这一目标的任何帮助都表示赞赏

修改

var customBinding = new CustomBinding(); 
customBinding.Elements.Add(new TextMessageEncodingBindingElement 
{ 
   MessageVersion = MessageVersion.Soap11, 
   WriteEncoding = System.Text.Encoding.UTF8
}); 
var Uri = new Uri("https://"); 
var endpointAddres = new EndpointAddress(Uri, new MySecurityHeader()); 
var client = new ChannelFactory<ServiceReference3.VhWsCreatePayId>(customBinding)
             .CreateChannel(e‌​ndpointAddres); 
client.vhWsCreatePayIdVersion(request);

1 个答案:

答案 0 :(得分:1)

您需要确保http://docs.oasis-open.org/...中包含SoapHeader命名空间,例如

[System.Xml.Serialization.XmlRootAttribute(Namespace = 
  "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",
   IsNullable = false)]
public partial class UsernameToken : System.Web.Services.Protocols.SoapHeader
{
    // Namespace is also available here if different from the root element.
    [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string Username {get; set;}
    [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string Password {get; set;}
}

修改
如果您正在使用其他技术来构建SoapHeader,请注意oasis命名空间不一定需要进入根Envelope元素 - 它可以放在本地标题中,例如:

<Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
    <UsernameToken>
        <Username>XXXXXXXXXXXXXXXXXXXX</Username>
        <Password>ZZZZZZZZZZZZZZZZZZZZ</Password>
    <UsernameToken>
</Security>