我应该使用哪个编程平台来使用 WS-Security 的 SOAP 服务?
Which programming platform should I use to consume a SOAP service with WS-Security?
我需要使用使用 WS-Security 的 SOAP 1.2 Web 服务。我在工作中使用的平台是 Delphi 10.2 Tokyo 和 .Net Core。这些似乎都不起作用。
- 我是不是在使用网络服务时做错了什么?
- 如果没有,我的其他平台选择是什么?我愿意接受任何建议。尽可能 built-in 支持以下 WSDL。我正在构建的应用程序需要是 Windows 应用程序。
尝试使用 Delphi 10.2 Tokyo 的内置 WSDL 导入程序(使用 Indy 的 SOAP 1.2)时,我的请求发送时没有任何 SOAP header 信息。此无效请求引发错误 Connection reset by peer。
尝试使用 .Net Core(使用 WCF Web 服务引用提供程序)时出现错误:System.PlatformNotSupportedException:'TransportSecurityBindingElement.BuildChannelFactoryCore is not supported.'
可能是由于 .Net Core 尚不支持所需的功能:https://github.com/dotnet/wcf/blob/master/release-notes/SupportedFeatures-v2.0.0.md(不支持 Security.Message)
以下是 WSDL。我从这个文件中删除了不必要的 XML,并用 Example 替换了实际的公司名称。希望这能让人们充分了解 WSDL policies/requirements 是什么。
<?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>
没有特定的 'best' 平台可以使用网络服务。
但是,某些平台支持自动生成代理 类 比其他平台更好。
When trying with Delphi 10.2 Tokyo's built in WSDL importer (using SOAP 1.2 with Indy), my requests are sent without any SOAP header information.
我没有使用 .NET Core 的经验,但是在使用 Delphi 10.2 时,您需要在发送请求之前手动添加(发送)SOAP header。
这可以通过将 web 服务实例转换为 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
将在发送请求后释放创建的 header object。
注意:每次发出请求时,您都必须 'Send' header:
// '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
并在完成后释放 header object,发送请求。
.NET Framework 完全支持 SOAP 服务。我用 C# 开发了一个 .NET Framework 应用程序,并构建了一个可供 Delphi、.NET Core 等使用的 DLL。这是一个有点迂回的解决方案,但却是我能找到的最简单的解决方案。
在 C# 中访问服务:https://docs.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++?
我需要使用使用 WS-Security 的 SOAP 1.2 Web 服务。我在工作中使用的平台是 Delphi 10.2 Tokyo 和 .Net Core。这些似乎都不起作用。
- 我是不是在使用网络服务时做错了什么?
- 如果没有,我的其他平台选择是什么?我愿意接受任何建议。尽可能 built-in 支持以下 WSDL。我正在构建的应用程序需要是 Windows 应用程序。
尝试使用 Delphi 10.2 Tokyo 的内置 WSDL 导入程序(使用 Indy 的 SOAP 1.2)时,我的请求发送时没有任何 SOAP header 信息。此无效请求引发错误 Connection reset by peer。
尝试使用 .Net Core(使用 WCF Web 服务引用提供程序)时出现错误:System.PlatformNotSupportedException:'TransportSecurityBindingElement.BuildChannelFactoryCore is not supported.'
可能是由于 .Net Core 尚不支持所需的功能:https://github.com/dotnet/wcf/blob/master/release-notes/SupportedFeatures-v2.0.0.md(不支持 Security.Message)
以下是 WSDL。我从这个文件中删除了不必要的 XML,并用 Example 替换了实际的公司名称。希望这能让人们充分了解 WSDL policies/requirements 是什么。
<?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>
没有特定的 'best' 平台可以使用网络服务。 但是,某些平台支持自动生成代理 类 比其他平台更好。
When trying with Delphi 10.2 Tokyo's built in WSDL importer (using SOAP 1.2 with Indy), my requests are sent without any SOAP header information.
我没有使用 .NET Core 的经验,但是在使用 Delphi 10.2 时,您需要在发送请求之前手动添加(发送)SOAP header。
这可以通过将 web 服务实例转换为 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
将在发送请求后释放创建的 header object。
注意:每次发出请求时,您都必须 'Send' header:
// '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
并在完成后释放 header object,发送请求。
.NET Framework 完全支持 SOAP 服务。我用 C# 开发了一个 .NET Framework 应用程序,并构建了一个可供 Delphi、.NET Core 等使用的 DLL。这是一个有点迂回的解决方案,但却是我能找到的最简单的解决方案。
在 C# 中访问服务:https://docs.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++?