使用现有WSDL文件在.net core 3.1下创建Soap Service

问题描述

使用现有的wsdl创建肥皂服务时遇到了一个非常有趣的问题。 原因是我们试图创建一个测试服务,而我们得到的只是一个wsdl文件。 我所做的是

  • 使用dotnet-svcutil server.wsdl生成CS文件
  • 创建一个新的.net核心服务项目
  • 创建新类以实现上述cs文件中的接口
  • services.AddSingleton ();
  • app.UseSoapEndpoint(“ / Services”,新的BasicHttpBinding(),SoapSerializer.XmlSerializer); / 这里我正在使用SoapCore软件包 /

在测试期间可以调用soap服务方法,但是我注意到响应消息中的Authentication没有被填充,而主体消息中的数据看起来很好。 检查了真实的wsdl和我的wsdl,它们是不同的。

纠正一个

<wsdl:operation name="listDocumentsInternal">
<soap:operation style="document" soapAction="/RetailWebServicesV7/InterfaceServices/RetailWebServicesV7Service.serviceagent/listDocumentsInternal"/>
<wsdl:input>
<soap:body use="literal" parts="listDocumentsReq"/>
<soap:header use="literal" message="tns:soapHeader" part="operationSystem"/>
<soap:header use="literal" message="tns:soapHeader" part="vendorDetails"/>
<soap:header use="literal" message="tns:soapHeader" part="authentication"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal" parts="listDocumentsRespInternal"/>
<soap:header use="literal" message="tns:soapHeader" part="authentication"/>
</wsdl:output>
<wsdl:fault name="fault1">
<soap:fault use="literal" name="fault1"/>
</wsdl:fault>
</wsdl:operation>

我的

<wsdl:operation name="listDocumentsInternal">
<soap:operation soapAction="/RetailWebServicesV7/InterfaceServices/RetailWebServicesV7Service.serviceagent/listDocumentsInternal" style="document"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>

缺少什么吗?在我看来,它们应该完全相同。

非常感谢您。

解决方法

endpoints.UseSoapEndpoint<RWSv7Services,CustomNamespaceMessage>("/Services",new BasicHttpBinding(),SoapSerializer.XmlSerializer);
public class CustomNamespaceMessage : CustomMessage
    {
        public CustomNamespaceMessage() { }
        public CustomNamespaceMessage(Message message) : base(message) { }

        public override MessageHeaders Headers
        {
            get
            {
                var index = base.Headers.FindHeader("Authentication","my correct namespace");
                if (index >= 0)
                {
                    var xml = new XmlDocument();
                    xml.LoadXml(base.Headers[index].ToString());
                    var obj = new Authentication { };
                    var authNode = xml.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name.Equals("Authentication",System.StringComparison.OrdinalIgnoreCase));
                    foreach(XmlNode node in authNode.ChildNodes)
                    {
                        if (node.Name.Equals("B2BAccount",System.StringComparison.OrdinalIgnoreCase))
                            obj.B2BAccount = node.InnerText;
                        if (node.Name.Equals("Password",System.StringComparison.OrdinalIgnoreCase))
                            obj.Password = node.InnerText;
                        if (node.Name.Equals("SecurityToken",System.StringComparison.OrdinalIgnoreCase))
                            obj.SecurityToken = node.InnerText;
                    }
                    var header = new CustomHeader(obj);
                    base.Headers.RemoveAt(index);
                    base.Headers.Add(header);

                }
                return base.Headers;
            }
        }
    }
public class CustomHeader : MessageHeader
    {
        private const string CUSTOM_HEADER_NAME = "Authentication";
        private const string CUSTOM_HEADER_NAMESPACE = "my correct namespace";

        private Authentication _customData;

        public Authentication CustomData
        {
            get
            {
                return _customData;
            }
        }

        public CustomHeader()
        {
        }

        public CustomHeader(Authentication customData)
        {
            _customData = customData;
        }

        public override string Name
        {
            get { return (CUSTOM_HEADER_NAME); }
        }

        public override string Namespace
        {
            get { return (CUSTOM_HEADER_NAMESPACE); }
        }

        protected override void OnWriteHeaderContents(
            System.Xml.XmlDictionaryWriter writer,MessageVersion messageVersion)
        {
            writer.WriteElementString("B2BAccount",CUSTOM_HEADER_NAMESPACE,_customData.B2BAccount);
            writer.WriteElementString("Password",_customData.Password);
            writer.WriteElementString("SecurityToken",_customData.SecurityToken);
        }
}