C#SOAP服务删除xmlns="";来自页眉元素

本文关键字:quot 元素 服务 删除 C#SOAP xmlns | 更新日期: 2023-09-27 18:00:57

我使用服务引用从提供的WSDL生成SOAP客户端。除了标头中导致服务失败的元素上的空白xmlns之外,一切都很好。使用SOAPUI,我知道如果我从元素中删除它,请求就可以正常工作。如何用程序从属性中删除这个空白xmlns?由于这是一个从外部应用程序加载的DLL,我没有使用app.config。

SecurityHeaderType是一个生成的对象,它由h:Security元素及其相应的命名空间组成。SecurityHeaderType中有一个名为Any的XmlElement[],我就是在这里设置元素的。

private SecurityHeaderType GetSecurityHeaderType()
    {
        SecurityHeaderType securityHeader = new SecurityHeaderType();
        DateTime created = DateTime.Now;
        string creationDate;
        creationDate = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ");
        string nonce = nonce = (new Random().Next(0, int.MaxValue)).ToString();
        byte[] hashedPassword;
        hashedPassword = GetSHA1(password);
        string concatednatedDigestInput = string.Concat(nonce, creationDate, Encoding.Default.GetString(hashedPassword));
        byte[] digest;
        digest = GetSHA1(concatednatedDigestInput);
        string passwordDigest;
        passwordDigest = Convert.ToBase64String(digest);
        string encodedNonce;
        encodedNonce = Convert.ToBase64String(Encoding.Default.GetBytes(nonce));
        XmlDocument doc = new XmlDocument();
        using (XmlWriter writer = doc.CreateNavigator().AppendChild())
        {
            writer.WriteStartDocument();
            writer.WriteStartElement("Security");
            writer.WriteStartElement("UsernameToken");
            writer.WriteElementString("Username", username);
            writer.WriteElementString("Password", passwordDigest);
            writer.WriteElementString("Nonce", encodedNonce);
            writer.WriteElementString("Created", creationDate);
            writer.WriteEndElement();
            writer.WriteEndElement();
            writer.WriteEndDocument();
            writer.Flush();
        }
        doc.DocumentElement.RemoveAllAttributes();
        System.Xml.XmlElement[] headers = doc.DocumentElement.ChildNodes.Cast<XmlElement>().ToArray<XmlElement>();
        securityHeader.Any = headers;
        return securityHeader;

    }

当我在客户端上调用一个方法时,每个请求都必须有上面的头,但它实际上生成了以下XML;

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
    <h:Security xmlns:h="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <UsernameToken xmlns="">
            <Username></Username>
            <Password></Password>
            <Nonce></Nonce>
            <Created></Created>
        </UsernameToken>
    </h:Security>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <createShipmentRequest>
        <requestedShipment>
            <customerReference>Customer Ref</customerReference>
        </requestedShipment>
    </createShipmentRequest>
</s:Body>

不管我把什么作为Security元素中的第一个元素,它总是自动显示xmlns="。

我只想简单地获取它,这样就可以发出以下请求,并且usernameToken元素没有一个空白的名称空间,我知道这个名称空间很好;

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
    <h:Security xmlns:h="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <UsernameToken>
            <Username></Username>
            <Password></Password>
            <Nonce></Nonce>
            <Created></Created>
        </UsernameToken>
    </h:Security>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <createShipmentRequest>
        <requestedShipment>
            <customerReference>Customer Ref</customerReference>
        </requestedShipment>
    </createShipmentRequest>
</s:Body>

C#SOAP服务删除xmlns="";来自页眉元素

您需要包含默认名称空间,因此:

writer.WriteStartElement("UsernameToken", 
    "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");

等等。"正确"XML中的所有元素都有这个名称空间,因为它们继承自h:Security:中声明中指定的默认名称空间

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