【问题标题】:.NET Core - cannot find a simple soap request code.NET Core - 找不到简单的肥皂请求代码
【发布时间】:2020-11-06 18:00:10
【问题描述】:

我需要发送这样的xml

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:web="**************">
    <soap:Header/>
    <soap:Body>
        <web:Open>
            <web:username>USERNAME</web:username>
            <web:password>PASSWORD</web:password>
        </web:Open>
    </soap:Body>
</soap:Envelope>

来自本教程https://stackify.com/soap-net-core/

var binding = new BasicHttpBinding();
var endpoint = new EndpointAddress(new Uri("http://server/PingService.svc"));
var channelFactory = new ChannelFactory(binding, endpoint);
var serviceClient = channelFactory.CreateChannel();
var result = serviceClient.Ping("Ping");
channelFactory.Close();

但是如何修改此代码以执行我自己的请求?

我分析了有关 WCF 和 svcutils 的 microsoft 文档,它看起来非常复杂 我的意思是,所有这些,只是为了发送一个 XML?

我如何以最简单的方式发出 SOAP 请求

感谢您在这方面帮助我

【问题讨论】:

  • 据我所知,如果你想在asp.net core中创建一个soap请求,你首先应该知道SOAP xml请求示例,然后你就可以生成请求了。更多详情,可以参考这个link
  • 我有soap请求,它与问题一起发布...我不认为需要生成任何东西...我在soapui中尝试过它工作正常...我只需要一个简单的SOAP代码...我在网络上的任何地方都找不到
  • 我会检查你提供的代码,这似乎是我需要的,谢谢

标签: asp.net-core soap


【解决方案1】:

最简单的方法是将 wsdl 从服务器端导入到您的项目中。这将生成大部分所需的代码。您提出的与此相关的另一个问题中提供了一个示例。

也可以完全手动完成。首先,您需要创建一个或 2 个描述您的标头和有效负载的 xml 架构(标头是可选的)。

打开.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:web="http://bvdep.com/webservices/" targetNamespace="http://bvdep.com/webservices/" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:complexType name="OpenType">
        <xs:sequence>
            <xs:element name="username" type="xs:string"/>
            <xs:element name="password" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
    <xs:element name="Open" type="web:OpenType"/>
</xs:schema>

header.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:head="http://bvdep.com/webservices/Header" targetNamespace="http://bvdep.com/webservices/Header" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="Header" type="head:HeaderType"/>
    <xs:complexType name="HeaderType">
        <xs:sequence>
            <xs:element name="From" type="xs:string"/>
            <xs:element name="To" type="xs:string"/>
            <xs:element name="MsgType" type="xs:string"/>
            <xs:element name="Datetime" type="xs:dateTime"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>

然后您使用 xsd.exe 生成类文件。我使用 bat 文件来执行此操作。

@echo off
set exepad=C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\xsd.exe
set sourcepad=..\..\

set xsdpad=%sourcepad%\ConsoleCore\xsd
set Outpad=%sourcepad%\ConsoleCore\generated

Set NameSpace=ConsoleCore.generated

"%exepad%" "%xsdpad%\Open.xsd" /c  /n:%NameSpace%  /o:%Outpad%
"%exepad%" "%xsdpad%\Header.xsd" /c  /n:%NameSpace%  /o:%Outpad%

在您的 vs 核心项目中,您需要添加 2 个 nuget 包 System.ServiceModel.Primitives 和 System.ServiceModel.Http

接下来,您需要添加一个接口来描述您想要调用的服务和操作,就像您在 ping 示例中找到的那样

[ServiceContract(Namespace = "http://Open.webservice.namespace")]
    public interface IOpenService
    {
        [XmlSerializerFormat()]
        [OperationContract(IsOneWay = false, Action = "urn:#OpenOperation")]
        OpenReturnMsg OpenOperation(OpenMsg msg);
    }

    [MessageContract(IsWrapped = false)]
    public class OpenMsg
    {
        [MessageHeader(Name = "Header", Namespace = "http://bvdep.com/webservices/Header")] public HeaderType Header { get; set; }
        [MessageBodyMember(Name = "Open", Namespace = "http://bvdep.com/webservices/")] public OpenType Open { get; set; }
    }

    [MessageContract(IsWrapped = false)]
    public class OpenReturnMsg
    {
        [MessageBodyMember(Name = "ResponseMsg", Namespace = "http://Open.webservice.namespace")] public string ResponseMsg { get; set; }
    }

最后是调用服务并获得响应的实际语句:

static void Main(string[] args)
        {
            Console.WriteLine("Start Program!");

            var binding = new BasicHttpBinding();
            var endpoint = new EndpointAddress(new Uri("http://LOCALHOST:8085/mockOpenBinding"));
            var channelFactory = new ChannelFactory<IOpenService>(binding, endpoint);
            var serviceClient = channelFactory.CreateChannel();


            var msg = new OpenMsg
            {
                Header = new HeaderType
                {
                    From = "source",
                    To = "dest",
                    MsgType = "open",
                    Datetime = DateTime.Now
                },
                Open = new OpenType
                {
                    username = "user",
                    password = "pw"
                }
            };

            var result = serviceClient.OpenOperation(msg);
            channelFactory.Close();
            Console.WriteLine(result.ResponseMsg);
        }

我已经在 SOAPUI 中使用来自以下 WSDL 的模拟服务对此进行了测试。

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="http://Open.webservice.namespace" xmlns:web="http://bvdep.com/webservices/" xmlns:head="http://bvdep.com/webservices/Header" targetNamespace="http://Open.webservice.namespace">
    <wsdl:types>
        <xs:schema targetNamespace="http://Open.webservice.namespace" elementFormDefault="qualified">
            <xs:import namespace="http://bvdep.com/webservices/Header" schemaLocation="Header.xsd"/>
            <xs:import namespace="http://bvdep.com/webservices/" schemaLocation="Open.xsd"/>
            <xs:element name="ResponseMsg" type="xs:string"/>
        </xs:schema>
    </wsdl:types>
    <wsdl:message name="OpenMessageHeader">
        <wsdl:part name="MsgHeader" element="head:Header"/>
    </wsdl:message>
    <wsdl:message name="OpenMessageRequest">
        <wsdl:part name="Open" element="web:Open"/>
    </wsdl:message>
    <wsdl:message name="OpenMessageResponse">
        <wsdl:part name="Response" element="tns:ResponseMsg"/>
    </wsdl:message>
    <wsdl:portType name="OpenPortType">
        <wsdl:operation name="OpenOperation">
            <wsdl:input message="tns:OpenMessageRequest"/>
            <wsdl:output message="tns:OpenMessageResponse"/>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="OpenBinding" type="tns:OpenPortType">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="OpenOperation">
            <soap:operation soapAction="urn:#OpenOperation"/>
            <wsdl:input>
                <soap:body use="literal"/>
                <soap:header message="tns:OpenMessageHeader" part="MsgHeader" use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="OpenService">
        <wsdl:port name="OpenPort" binding="tns:OpenBinding">
            <soap:address location="No Target Adress"/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

【讨论】:

    猜你喜欢
    • 2018-07-16
    • 2011-02-10
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多