最简单的方法是将 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>