Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用现有WSDL文件在.net core 3.1下创建Soap服务_.net_Soap_Wsdl - Fatal编程技术网

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

使用现有WSDL文件在.net core 3.1下创建Soap服务,.net,soap,wsdl,.net,Soap,Wsdl,我遇到了一个非常有趣的问题,即使用现有的wsdl创建soap服务。 原因是我们试图创建一个测试服务,得到的只是一个wsdl文件。 我所做的是 使用dotnet svcutil server.wsdl生成cs文件 创建新的.net核心服务项目 创建新类以实现上述cs文件中的接口 services.AddSingleton() app.UseSoapEndpoint(“/Services”,新的BasicHttpBinding(),SoapSerializer.XmlSerializer)/这里我

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

  • 使用dotnet svcutil server.wsdl生成cs文件
  • 创建新的.net核心服务项目
  • 创建新类以实现上述cs文件中的接口
  • services.AddSingleton()
  • app.UseSoapEndpoint(“/Services”,新的BasicHttpBinding(),SoapSerializer.XmlSerializer)/这里我使用的是SoapCore包/
在测试期间,可以调用soap服务方法,但我注意到响应消息中的身份验证没有填充,同时正文消息中的数据看起来很好。 检查了真实的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>

地雷


少了什么吗??在我看来,它们应该完全一样


非常感谢您。

这是一个非常烦人的问题,在SoapCore中,MessageHelper.CreateHeader为属性指定了不同的名称空间,即使参数设置正确。最后,我使用Soapcore的beta版进行了修复,因为它支持CustomMessage。创建我自己的MessageHeader并替换旧的MessageHeader。
endpoints.UseSoapEndpoint<RWSv7Services, CustomNamespaceMessage>("/Services", new BasicHttpBinding(), SoapSerializer.XmlSerializer);
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", CUSTOM_HEADER_NAMESPACE, _customData.Password);
            writer.WriteElementString("SecurityToken", CUSTOM_HEADER_NAMESPACE, _customData.SecurityToken);
        }
}