我需要使用一个使用的SOAP1.2Web服务。我在工作中使用的平台是Delphi10.2、东京和.Net核心。这两种方法似乎都不管用。
当尝试使用Delphi10.2东京内置的WSDL导入程序(使用SOAP1.2和Indy)时,我的请求是在没有任何SOAP头信息的情况下发送的。此无效请求引发由对等重置的错误连接。
当尝试使用WCF (使用)时,我得到了一个错误:不支持System.PlatformNotSupportedException:'TransportSecurityBindingElement.BuildChannelFactoryCore‘。
大概是因为.Net Core还不支持所需的特性:https://github.com/dotnet/wcf/blob/master/release-notes/SupportedFeatures-v2.0.0.md (Security.Message不支持)
下面是WSDL。我从这个文件中删除了不必要的XML,并用示例替换了实际的公司名称。希望这将提供足够的WSDL策略/需求的概念。
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:i0="http://tempuri.org/"
xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tns="www.example.com/ExampleService"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
xmlns:wsa10="http://www.w3.org/2005/08/addressing"
xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata"
xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy"
xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
name="ExampleService"
targetNamespace="www.example.com/ExampleService">
<wsp:Policy wsu:Id="ExampleAPI_policy">
<wsp:ExactlyOne>
<wsp:All>
<sp:TransportBinding xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
<wsp:Policy>
<sp:TransportToken>
<wsp:Policy>
<sp:HttpsToken RequireClientCertificate="false" />
</wsp:Policy>
</sp:TransportToken>
<sp:AlgorithmSuite>
<wsp:Policy>
<sp:Basic256 />
</wsp:Policy>
</sp:AlgorithmSuite>
<sp:Layout>
<wsp:Policy>
<sp:Strict />
</wsp:Policy>
</sp:Layout>
<sp:IncludeTimestamp />
</wsp:Policy>
</sp:TransportBinding>
<sp:EndorsingSupportingTokens xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
<wsp:Policy>
<sp:SecureConversationToken sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient">
<wsp:Policy>
<sp:BootstrapPolicy>
<wsp:Policy>
<sp:SignedParts>
<sp:Body />
<sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
<sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
<sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
<sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
<sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
<sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
<sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
</sp:SignedParts>
<sp:EncryptedParts>
<sp:Body />
</sp:EncryptedParts>
<sp:TransportBinding>
<wsp:Policy>
<sp:TransportToken>
<wsp:Policy>
<sp:HttpsToken RequireClientCertificate="false" />
</wsp:Policy>
</sp:TransportToken>
<sp:AlgorithmSuite>
<wsp:Policy>
<sp:Basic256 />
</wsp:Policy>
</sp:AlgorithmSuite>
<sp:Layout>
<wsp:Policy>
<sp:Strict />
</wsp:Policy>
</sp:Layout>
<sp:IncludeTimestamp />
</wsp:Policy>
</sp:TransportBinding>
<sp:SignedSupportingTokens>
<wsp:Policy>
<sp:UsernameToken sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient">
<wsp:Policy>
<sp:WssUsernameToken10 />
</wsp:Policy>
</sp:UsernameToken>
</wsp:Policy>
</sp:SignedSupportingTokens>
<sp:Wss11>
<wsp:Policy />
</sp:Wss11>
<sp:Trust10>
<wsp:Policy>
<sp:MustSupportIssuedTokens />
<sp:RequireClientEntropy />
<sp:RequireServerEntropy />
</wsp:Policy>
</sp:Trust10>
</wsp:Policy>
</sp:BootstrapPolicy>
</wsp:Policy>
</sp:SecureConversationToken>
</wsp:Policy>
</sp:EndorsingSupportingTokens>
<sp:Wss11 xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
<wsp:Policy />
</sp:Wss11>
<sp:Trust10 xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
<wsp:Policy>
<sp:MustSupportIssuedTokens />
<sp:RequireClientEntropy />
<sp:RequireServerEntropy />
</wsp:Policy>
</sp:Trust10>
<wsaw:UsingAddressing />
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
<wsp:Policy wsu:Id="ExampleAPI2_policy">
<wsp:ExactlyOne>
<wsp:All>
<sp:TransportBinding xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
<wsp:Policy>
<sp:TransportToken>
<wsp:Policy>
<sp:HttpsToken RequireClientCertificate="false" />
</wsp:Policy>
</sp:TransportToken>
<sp:AlgorithmSuite>
<wsp:Policy>
<sp:Basic256 />
</wsp:Policy>
</sp:AlgorithmSuite>
<sp:Layout>
<wsp:Policy>
<sp:Lax />
</wsp:Policy>
</sp:Layout>
<sp:IncludeTimestamp />
</wsp:Policy>
</sp:TransportBinding>
<sp:SignedSupportingTokens xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
<wsp:Policy>
<sp:UsernameToken sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient">
<wsp:Policy>
<sp:WssUsernameToken10 />
</wsp:Policy>
</sp:UsernameToken>
</wsp:Policy>
</sp:SignedSupportingTokens>
<sp:Wss10 xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
<wsp:Policy />
</sp:Wss10>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
<wsdl:types>
<!-- trimmed away types -->
</wsdl:types>
<!-- trimmed away messages -->
<wsdl:portType name="IAPIService">
<!-- trimmed away operations -->
</wsdl:portType>
<wsdl:binding name="ExampleAPI" type="tns:IAPIService">
<wsp:PolicyReference URI="#ExampleAPI_policy" />
<soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
<!-- trimmed away operations -->
</wsdl:binding>
<wsdl:binding name="ExampleAPI2" type="tns:IAPIService">
<wsp:PolicyReference URI="#ExampleAPI2_policy" />
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
<!-- trimmed away operations -->
</wsdl:binding>
<wsdl:service name="ExampleService">
<wsdl:port name="ExampleAPI" binding="tns:ExampleAPI">
<soap12:address location="https://example.com/apps/api/APIService.svc" />
<wsa10:EndpointReference>
<wsa10:Address>https://example.com/apps/api/APIService.svc</wsa10:Address>
</wsa10:EndpointReference>
</wsdl:port>
<wsdl:port name="ExampleAPI2" binding="tns:ExampleAPI2">
<soap:address location="https://example.com/apps/api/APIService.svc/endpoint2" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>发布于 2019-06-02 15:31:02
.NET框架完全支持SOAP服务。我在.NET中开发了一个C#框架应用程序,并建立了一个可供Delphi、.NET内核等使用的动态链接库。这是一个迂回的解决方案,也是我能找到的最简单的解决方案。
在C#:https://learn.microsoft.com/en-us/dotnet/framework/wcf/accessing-services-using-a-wcf-client中访问服务
导出DLL函数:Is is possible to export functions from a C# DLL like in VS C++?
发布于 2019-05-30 14:14:26
没有特定的“最佳”平台来使用best服务。然而,有些平台比其他平台更好地支持代理类的自动生成。
当尝试使用Delphi10.2东京内置的WSDL导入程序(使用SOAP1.2和Indy)时,我的请求是在没有任何SOAP头信息的情况下发送的。
我没有使用.NET核心的经验,但是当使用Delphi10.2时,您需要在发送请求之前手动添加(发送) SOAP头。
这可以通过将webservice实例转换到ISOAPHeaders来实现。
示例:
procedure TestSendHeader;
var
MyService: IMySoapWebservice;
header : TMySoapHeader;
begin
MyService := GetMySoapService();
(MyService as ISOAPHeaders).OwnsSentHeaders := True;
// Create header object
header := TMySoapHeader.Create;
// Fill header data
// header.xyz := ;
// 'Send' header with the request
(MyService as ISOAPHeaders).Send(header);
MyResponse := MyService.DoMyRequest();
end;在发送请求后,将OwnsSentHeaders设置为true将释放创建的标头对象。
注意:每次提出请求时,您都必须“发送”标题:
// 'Send' header with the request 1
(MyService as ISOAPHeaders).Send(header);
MyResponse := MyService.DoMyRequest1();
// 'Send' header with the request 2
(MyService as ISOAPHeaders).Send(header);
MyResponse := MyService.DoMyRequest2();在本例中,不要将OwnsSentHeaders设置为true,并在发送请求之后释放标头对象。
https://stackoverflow.com/questions/56378737
复制相似问题