修改 SOAP 标头以匹配第 3 方格式

问题描述 投票:0回答:1

我必须创建一个 Web 服务来从第三方公司检索信息。他们有一个 soap xml 的示例,我已经能够使其匹配,但标题部分除外。我在我的 asp.net 网络应用程序中创建了一个 webservice.asmx 来格式化他们将要发送的内容。

    [WebService(
        Namespace = "",
        Name = "TheRequest")]
    public class WebService1 : WebService
    { 
        public HeaderData HeaderData { get; set; }
        [SoapHeader ("ReplyTo", Required = true)]
        [WebMethod]
        public string TheirRequest(string username, string password, string data)
        {
            if (HeaderData.To == null ||
                HeaderData.ReplyTo.Address == null ||
                HeaderData.MessageID == null ||
                HeaderData.Action == null)
                throw new SoapException("Required information not provided",
                    SoapException.ClientFaultCode);

            if (username.ToLower() == "username" &&
                password.ToLower() == "password")
                return "SUCCESS";
            else
                throw new SoapException("Unrecognized login",
                    SoapException.ClientFaultCode);
        }
    }

    public class HeaderData : SoapHeader
    {
        public string To;
        public ReplyTo ReplyTo { get; set; }
        public string MessageID;
        public string Action;
    }

    public class ReplyTo
    {
        public string Address;
    }

如下设置 xml

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="" xmlns:xsd="" xmlns:soap="">
  <soap:Header>
    <HeaderData xmlns="">
      <To>string</To>
      <MessageID>string</MessageID>
      <Action>string</Action>
      <ReplyTo>
        <Address>string</Address>
      </ReplyTo>
    </HeaderData>
  </soap:Header>
  <soap:Body>
    <TheirRequest xmlns="">
      <username>string</username>
      <password>string</password>
      <data>string</data>
    </TheirRequest>
  </soap:Body>
</soap:Envelope>

他们需要将通话格式化为什么

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="">
    <soapenv:Header xmlns:wsa="">
        <wsa:To>[customer provided URL]</wsa:To>
        <wsa:ReplyTo>
            <wsa:Address>http:...</wsa:Address>
        </wsa:ReplyTo>
        <wsa:MessageID>3DBF4F1510689894919</wsa:MessageID>
        <wsa:Action>urn:submitMessage</wsa:Action>
    </soapenv:Header>
    <soapenv:Body>
        <sub:TheirRequest xmlns:sub="">
            <sub:username>customer_provided_username</sub:username>
            <sub:password>customer_provided_password</sub:password>
            <sub:data>Base64 encoded XML request</sub:data>
        </sub:TheirRequest>
    </soapenv:Body>
</soapenv:Envelope>

有几点不同:

  1. <soap:Envelope xmlns:xsi="" xmlns:xsd="" xmlns:soap
    需要
    <soapenv:Envelope xmlns:soapenv
  2. <soap:Header> <HeaderData xmlns="">
    需要
    <soapenv:Header xmlns:wsa="">

有什么方法可以设置它以匹配它,以便我们可以处理他们的电话吗?或者有什么方法可以设置 SOAP 标头以不管他们发送什么而只关心正文?任何帮助将不胜感激。

xml soap asmx asp.net-webapp
1个回答
0
投票

我能够让它工作。

第一部分是差异#1 无关紧要。唯一重要的部分是命名空间是正确的。命名空间如何命名以供引用并不重要。

第二部分是差异 #2 不必在标题标语上。它可以设置为标题中的每个项目。我找不到将其设置为标题标语的方法。

<soap:Header>
  <ReplyTo xmlns="http://www.w3.org/2005/08/addressing">
    <Address>string</Address>
  </ReplyTo>
</soap:Header>

这是如何完成的,当我声明 SoapHeader 字段时,我单独设置了命名空间。

[XmlRoot(Namespace = "http://www.w3.org/2005/08/addressing")]
public class ReplyTo : SoapHeader
{
    public string Address;
}
© www.soinside.com 2019 - 2024. All rights reserved.