I'm just trying to get started with WCF. It sounds like it is supposed to be super simple, but using a simple API like SOAP::Lite, I am having trouble getting anything to work. There are a lot of out dated examples in the googlesphere, and I have tried many of them to no avail. So now I am trying to break down the problem to its lowest level. I created the WCF app generated by the Visual Web Developer 2008 Express template. This is its service contract:
[ServiceContract]
public interface IService1
{
[OperationContract]
string GetData(int value);
[OperationContract]
CompositeType GetDataUsingDataContract(CompositeType composite);
// TODO: Add your service operations here
}
// Use a data contract as illustrated in the sample below to add composite types to service operations.
[DataContract]
public class CompositeType
{
bool boolValue = true;
string stringValue = "Hello ";
[DataMember]
public bool BoolValue
{
get { return boolValue; }
set { boolValue = value; }
}
[DataMember]
public string StringValue
{
get { return stringValue; }
set { stringValue = value; }
}
}
I started it up in debug mode and tried to make contact. Doing so with a browser using the debug url http://localhost:59315/Service1.svc gives me a page saying this:
You have created a service.
To test this service, you will need to create a client and use it to
call the service. You can do this using the svcutil.exe tool from the
command line with the following syntax:
svcutil.exe http://localhost:59315/Service1.svc?wsdl
So, then I brows to that wsdl and get this:
<wsdl:definitions name="Service1" targetNamespace="http://tempuri.org/">
<wsp:Policy wsu:Id="WSHttpBinding_IService1_policy">
<wsp:ExactlyOne>
<wsp:All>
<sp:SymmetricBinding>
<wsp:Policy>
<sp:ProtectionToken>
<wsp:Policy>
<sp:SecureConversationToken sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient">
<wsp:Policy>
<sp:RequireDerivedKeys/>
<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:SymmetricBinding>
<wsp:Policy>
<sp:ProtectionToken>
<wsp:Policy>
<sp:SpnegoContextToken sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient">
<wsp:Policy>
<sp:RequireDerivedKeys/>
</wsp:Policy>
</sp:SpnegoContextToken>
</wsp:Policy>
</sp:ProtectionToken>
<sp:AlgorithmSuite>
<wsp:Policy>
<sp:Basic256/>
</wsp:Policy>
</sp:AlgorithmSuite>
<sp:Layout>
<wsp:Policy>
<sp:Strict/>
</wsp:Policy>
</sp:Layout>
<sp:IncludeTimestamp/>
<sp:EncryptSignature/>
<sp:OnlySignEntireHeadersAndBody/>
</wsp:Policy>
</sp:SymmetricBinding>
<sp:Wss11>
<wsp:Policy>
<sp:MustSupportRefKeyIdentifier/>
<sp:MustSupportRefIssuerSerial/>
<sp:MustSupportRefThumbprint/>
<sp:MustSupportRefEncryptedKey/>
</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:ProtectionToken>
<sp:AlgorithmSuite>
<wsp:Policy>
<sp:Basic256/>
</wsp:Policy>
</sp:AlgorithmSuite>
<sp:Layout>
<wsp:Policy>
<sp:Strict/>
</wsp:Policy>
</sp:Layout>
<sp:IncludeTimestamp/>
<sp:EncryptSignature/>
<sp:OnlySignEntireHeadersAndBody/>
</wsp:Policy>
</sp:SymmetricBinding>
<sp:Wss11>
<wsp:Policy>
<sp:MustSupportRefKeyIdentifier/>
<sp:MustSupportRefIssuerSerial/>
<sp:MustSupportRefThumbprint/>
<sp:MustSupportRefEncryptedKey/>
</wsp:Policy>
</sp:Wss11>
<sp:Trust10>
<wsp:Policy>
<sp:MustSupportIssuedTokens/>
<sp:RequireClientEntropy/>
<sp:RequireServerEntropy/>
</wsp:Policy>
</sp:Trust10>
<wsaw:UsingAddressing/>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
<wsp:Policy wsu:Id="WSHttpBinding_IService1_GetData_Input_policy">
<wsp:ExactlyOne>
<wsp:All>
<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>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
<wsp:Policy wsu:Id="WSHttpBinding_IService1_GetData_output_policy">
<wsp:ExactlyOne>
<wsp:All>
<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>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
<wsp:Policy wsu:Id="WSHttpBinding_IService1_GetDataUsingDataContract_Input_policy">
<wsp:ExactlyOne>
<wsp:All>
<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>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
<wsp:Policy wsu:Id="WSHttpBinding_IService1_GetDataUsingDataContract_output_policy">
<wsp:ExactlyOne>
<wsp:All>
<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>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
<wsdl:types>
<xsd:schema targetNamespace="http://tempuri.org/Imports">
<xsd:import schemaLocation="http://localhost:59315/Service1.svc?xsd=xsd0" namespace="http://tempuri.org/"/>
<xsd:import schemaLocation="http://localhost:59315/Service1.svc?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/"/>
<xsd:import schemaLocation="http://localhost:59315/Service1.svc?xsd=xsd2" namespace="http://schemas.datacontract.org/2004/07/RossDominosService"/>
</xsd:schema>
</wsdl:types>
<wsdl:message name="IService1_GetData_InputMessage">
<wsdl:part name="parameters" element="tns:GetData"/>
</wsdl:message>
<wsdl:message name="IService1_GetData_OutputMessage">
<wsdl:part name="parameters" element="tns:GetDataResponse"/>
</wsdl:message>
<wsdl:message name="IService1_GetDataUsingDataContract_InputMessage">
<wsdl:part name="parameters" element="tns:GetDataUsingDataContract"/>
</wsdl:message>
<wsdl:message name="IService1_GetDataUsingDataContract_OutputMessage">
<wsdl:part name="parameters" element="tns:GetDataUsingDataContractResponse"/>
</wsdl:message>
<wsdl:portType name="IService1">
<wsdl:operation name="GetData">
<wsdl:input wsaw:Action="http://tempuri.org/IService1/GetData" message="tns:IService1_GetData_InputMessage"/>
<wsdl:output wsaw:Action="http://tempuri.org/IService1/GetDataResponse" message="tns:IService1_GetData_OutputMessage"/>
</wsdl:operation>
<wsdl:operation name="GetDataUsingDataContract">
<wsdl:input wsaw:Action="http://tempuri.org/IService1/GetDataUsingDataContract" message="tns:IService1_GetDataUsingDataContract_InputMessage"/>
<wsdl:output wsaw:Action="http://tempuri.org/IService1/GetDataUsingDataContractResponse" message="tns:IService1_GetDataUsingDataContract_OutputMessage"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="WSHttpBinding_IService1" type="tns:IService1">
<wsp:PolicyReference URI="#WSHttpBinding_IService1_policy"/>
<soap12:binding transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="GetData">
<soap12:operation soapAction="http://tempuri.org/IService1/GetData" style="document"/>
<wsdl:input>
<wsp:PolicyReference URI="#WSHttpBinding_IService1_GetData_Input_policy"/>
<soap12:body use="literal"/>
</wsdl:input>
<wsdl:output>
<wsp:PolicyReference URI="#WSHttpBinding_IService1_GetData_output_policy"/>
<soap12:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetDataUsingDataContract">
<soap12:operation soapAction="http://tempuri.org/IService1/GetDataUsingDataContract" style="document"/>
<wsdl:input>
<wsp:PolicyReference URI="#WSHttpBinding_IService1_GetDataUsingDataContract_Input_policy"/>
<soap12:body use="literal"/>
</wsdl:input>
<wsdl:output>
<wsp:PolicyReference URI="#WSHttpBinding_IService1_GetDataUsingDataContract_output_policy"/>
<soap12:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="Service1">
<wsdl:port name="WSHttpBinding_IService1" binding="tns:WSHttpBinding_IService1">
<soap12:address location="http://localhost:59315/Service1.svc"/>
<wsa10:EndpointReference>
<wsa10:Address>http://localhost:59315/Service1.svc</wsa10:Address>
<Identity>
<Dns>localhost</Dns>
</Identity>
</wsa10:EndpointReference>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
Nothing too crazy (other than SOAP itself)... Anyway, now I try a simple SOAP::Lite app:
#!/cygdrive/C/Perl64/bin/perl.exe -w
use strict;
use warnings;
use Data::Dumper;
use SOAP::Lite +trace => [ transport => sub {
my ($in) = #_;
if ( ref($in) eq "HTTP::Request") {
print( "REQUEST\n" . $in->content() . "\nEND REQUEST\n" );
}
elsif ( ref($in) eq "HTTP::Response") {
print( "RESPONSE\n" . $in->content() . "\nEND RESPONSE\n" );
}
} ];
my $server = 'http://localhost:59315/Service1.svc';
my $url = "$server?wsdl";
my $xmlns = 'http://schemas.datacontract.org/2004/07/RossDominosService';
# Setup Network Connection
my $service = SOAP::Lite
->ns( $url )
->proxy( $server )
->on_fault( sub {
my ($soap, $res) = #_;
die ref $res ? $res->faultstring() : $soap->transport()->status(), "\n";
} );
;
print( Dumper( $service ) );
eval {
print( "making request\n" );
my $response = $service->GetData(
SOAP::Data->new( name => 'value', value => 5 )
);
print( "got response:\n$response\n" );
};
if ( $# ) {
print( "failed:\n**************************\n$#\n*****************************\n" );
}
Which from the debug is issuing this SOAP request:
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:namesp1="http://localhost:59315/Service1.svc?wsdl" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<namesp1:GetData>
<value xsi:type="xsd:int">5</value>
</namesp1:GetData>
</soap:Body>
</soap:Envelope>
But the response comes back with:
failed:
**************************
415 Unsupported Media Type
*****************************
What is going on? This is the "Hello, World!" of SOAP apps and I cant figure it out.
-----------------------UPDATE-------------------------------
I found that I need to change the binding from its default of wsHttpBinding to:
<endpoint address="" binding="basicHttpBinding"
contract="RossDominosService.IService1">
Now it appears to connect, but I am getting this new error:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<s:Fault>
<faultcode xmlns:a="http://schemas.microsoft.com/ws/2005/05/addressing/none">a:ActionNotSupported</faultcode>
<faultstring xml:lang="en-US">The message with Action 'http://tempuri.org/GetData' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver. Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None).</faultstring>
</s:Fault>
</s:Body>
</s:Envelope>
It doesn't seem like this should be so hard...
-----------------------UPDATE-------------------------------
Got it! After some more tinkering, and some assistance from soapUI, I figured out that the action needs to be modified so that it is:
<namespace>/<serviceContract>/<method>
in this case:
http://tempuri.org/IService1/GetData
When using SOAP::Lite, the default SOAPAction is
<namespace>#<method>
So you have to modify your soap object thusly:
$soap->on_action( sub { sprintf( '%sIService1/%s', #_ ) } );
I will write up the answer below so we can close this question...
This is how I accomplished getting a WCF web service up and running with a perl SOAP::Lite client. Note that I am using Visual Web Developer Express 2008 and perl 5.14 with SOAP::Lite 0.715.
Open up Visual Web Developer
File -> New Project...
Visual C# -> Web
WCF Service Application
Name: WcfService1
Location:
Solution: new solution
Solution Name:
Open Web.config
change <compilation debug="false"> to <compilation debug="true">
change <endpoint address="" binding="wsHttpBinding" contract="WcfService1.IService1"> to <endpoint address="" binding="basicHttpBinding" contract="WcfService1.IService1">
Open Service1.svc.cs
press f5 (to start debugging)
Now a browser window should pop up opened to your Service page. Take note of the port in the url, you will need it for the client. Then create this script:
#!/cygdrive/C/Perl64/bin/perl.exe -w
use strict;
use warnings;
use Data::Dumper;
use SOAP::Lite +trace => [ transport => sub {
my ($in) = #_;
if ( ref($in) eq "HTTP::Request") {
print( "**** REQUEST ****\n" . $in->content() . "\n**** END REQUEST ****\n" );
}
elsif ( ref($in) eq "HTTP::Response") {
print( "**** RESPONSE ****\n" . $in->content() . "\n**** END RESPONSE ****\n" );
}
} ];
my $port = 63181;
my $server = "http://localhost:$port/Service1.svc";
my $namespace = 'http://tempuri.org/';
# Setup Network Connection
my $service = SOAP::Lite
->ns( $namespace, 'my' )
->proxy( $server )
->on_action( sub {
my $action = sprintf( '%sIService1/%s', #_ );
print( "action: '$action'\n" );
return $action;
} );
print( Dumper( $service ) );
eval {
print( "making request\n" );
my $response = $service->GetData(
SOAP::Data->new( prefix => 'my', name => 'value', value => 5 )
);
print( "got response:\n$response\n" );
};
if ( $# ) {
print( "failed:\n**************************\n$#\n*****************************\n" );
}
You will need to change the port number to match your port number. Also, I left in a bunch of the debug code so you can see what is going on.
I hope this helps someone else.
Related
I Have This API And I Used the Message Mediation Below to Authenticate and Get the Token:
curl -X POST "URL" -H "accept: /" -H "Content-Type: application/x-www-form-urlencoded" -d "username=user&password=password"
result is:
enter image description here
<payloadFactory media-type="x-www-form-urlencoded">
<format>
{
"username":"user",
"password":"password"
}
</format>
<args>
</args>
</payloadFactory>
<header name="Content-Type" value="application/x-www-form-urlencoded" scope="transport" />
<property name="messageType" value="application/json" scope="axis2" type="STRING" />
<property name="REST_URL_POSTFIX" value="" scope="axis2" type="STRING" />
<call blocking="true">
<endpoint>
<http method="POST" uri-template="URL" />
</endpoint>
</call>
<property name="bearer-token" expression="json-eval($..token)" scope="default" type="STRING" />
<property name="REST_URL_POSTFIX" expression="get-property('resource')" scope="axis2" type="STRING" />
<header name="Authorization" expression="fn:concat('Bearer ', get-property('bearer-token'))" scope="transport" />
<payloadFactory media-type="x-www-form-urlencoded">
<format>$1</format>
<args>
<arg evaluator="xml" expression="get-property('request-body')" />
</args>
</payloadFactory>
But i have this error:
enter image description here
WSO2 API Manager Logs
INFO - LogMediator STATUS = Message dispatched to the main sequence. Invalid URL., RESOURCE = url, HEALTH CHECK URL = url
[2021-07-28 16:22:39,696] INFO - LogMediator STATUS = Message dispatched to the main sequence. Invalid URL., RESOURCE = url, HEALTH CHECK URL = url
Make sure that, you have provided the correct token endpoint url for the Call mediator
<call blocking="true">
<endpoint>
<http method="POST" uri-template="https://your-token-endpoint/oauth" />
</endpoint>
</call>
I have a windows service application which written by .net core.
In application, i using Log4net to log information to file but nothing is logged.
I tried to change application to console app, any thing is OK.
Please tell me how to fix this issue. Below is my logging config file
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler"/>
</configSections>
<log4net>
<root>
<level value="ERROR" />
<appender-ref ref="System_Appender"/>
</root>
<logger name="System">
<level value="DEBUG" />
<appender-ref ref="System_Appender" />
</logger>
<appender name="System_Appender" type="log4net.Appender.RollingFileAppender">
<file value="Logs\System.txt"/>
<appendToFile value="true"/>
<rollingStyle value="Size"/>
<maximumFileSize value="1MB" />
<maxSizeRollBackups value="10" />
<encoding value="utf-8" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d [%t] %-5p %c - %m%n"/>
</layout>
</appender>
</log4net>
</configuration>
I spent a lot of time messing with log4net .Net Core 3.1 running as a service. I will give some suggestions and code and configuration to review.
Running windows services with service account that has access to the logging and other databases doesn't log to the database
with log4net.
Running as a process but not as a service there was no problem with the log4net configuration. Only when running as a service
did the log4net not add logs to the database.
public static void Main(string[] args)
{
System.IO.Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
Configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables()
.AddCommandLine(args)
.Build();
// run as a console or as a service, configure in appsettings.json
_runAsService = Configuration["RunAsService"].ConvertToBool();
_ServerCertThumbprint = Configuration["ConfigSettings:ServerCertThumbprint"];
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args)
.UseWindowsService()
.ConfigureAppConfiguration((context, config) =>
{
// configure the app here.
}).ConfigureServices((hostContext, services) =>
{
services.AddLogging(logging =>
{
logging.AddConfiguration(Configuration.GetSection("Logging"));
logging.ClearProviders();
logging.AddLog4Net("log4net.config", true);
// logging.AddConsole();
logging.AddDebug();
logging.AddEventLog();
logging.SetMinimumLevel(LogLevel.Trace);
// logging.AddLog4Net("log4net.config", true );
}).Configure<LoggerFilterOptions>(options => options.MinLevel = LogLevel.Information);
services.AddSingleton(x);
services.AddSingleton<xxx>();
services.AddSingleton<xxx>();
services.AddSingleton<IXXX, XXX>();
services.AddSingleton<XXX>();
services.AddHostedService<Worker>();
});
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<appender name="FileAppender" type="log4net.Appender.FileAppender" >
<file value="logfile.log" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<appender name="console" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %level %logger - %message%newline" />
</layout>
</appender>
<appender name="AdoNetAppender" type="MicroKnights.Logging.AdoNetAppender, MicroKnights.Log4NetAdoNetAppender">
<bufferSize value="1" />
<!--<connectionType value="System.Data.SqlClient.SqlConnection, System.Data" />-->
<connectionType value="Microsoft.Data.SqlClient.SqlConnection, Microsoft.Data.SqlClient, Version=1.0.0.0,Culture=neutral,PublicKeyToken=23ec7fc2d6eaa4a5"/>
<connectionStringName value="Log4Net" />
<connectionStringFile value="appsettings.json" />
<commandText value="INSERT INTO dbo.Log
I'm developing with sabre soap api.
Now, I want to create passenger detail with all passenger types (ADT, CNN, INF)
I have a problem with infant type.
When I post the PassengerDetailRQ -> return 200
But in the EndTransaction response, I received an applicationResults's error message.
I have followed by this link . But not working.
Please tell me how to resolve this problem. Thanks!!!
You can see in the below:
PassengerDetail request:
<PassengerDetailsRQ xmlns="http://services.sabre.com/sp/pd/v3_3" version="3.3.0" IgnoreOnError="true" HaltOnError="false">
<PostProcessing IgnoreAfter="false" RedisplayReservation="true" UnmaskCreditCard="false" />
<PreProcessing IgnoreBefore="false">
<UniqueID ID=""/>
</PreProcessing>
<PriceQuoteInfo>
<Link HostedCarrier="true" NameNumber="1.1" Record="1"/>
<Link HostedCarrier="true" NameNumber="2.1" Record="1"/>
<Link HostedCarrier="true" NameNumber="3.1" Record="2"/>
<Link HostedCarrier="true" NameNumber="4.1" Record="3"/>
</PriceQuoteInfo>
<SpecialReqDetails>
<AddRemarkRQ>
<RemarkInfo>
<Remark Code="H" SegmentNumber="A" Type="General">
<Text>TEST REMARK</Text>
</Remark>
</RemarkInfo>
</AddRemarkRQ>
<SpecialServiceRQ>
<SpecialServiceInfo>
<SecureFlight SegmentNumber="A">
<PersonName DateOfBirth="1980-01-01" Gender="M" NameNumber="1.1">
<GivenName>FATHER MR</GivenName>
<Surname>SUR</Surname>
</PersonName>
</SecureFlight>
<SecureFlight SegmentNumber="A">
<PersonName DateOfBirth="1989-06-25" Gender="F" NameNumber="2.1">
<GivenName>MOTHER MRS</GivenName>
<Surname>LINUX</Surname>
</PersonName>
</SecureFlight>
<SecureFlight SegmentNumber="A">
<PersonName DateOfBirth="2010-03-23" Gender="F" NameNumber="3.1">
<GivenName>CHILD MS</GivenName>
<Surname>SUR</Surname>
</PersonName>
</SecureFlight>
<SecureFlight SegmentNumber="A">
<PersonName DateOfBirth="2018-01-23" Gender="MI" NameNumber="4.1">
<GivenName>INFANT MSTR</GivenName>
<Surname>SUR</Surname>
</PersonName>
</SecureFlight>
<Service SegmentNumber="A" SSR_Code="CHLD">
<PersonName NameNumber="3.1" />
<Text>23MAR10</Text>
</Service>
<Service SegmentNumber="A" SSR_Code="INFT">
<PersonName NameNumber="1.1" />
<Text>SUR/INFANT MSTR/23SEP17</Text>
</Service>
</SpecialServiceInfo>
</SpecialServiceRQ>
</SpecialReqDetails>
<TravelItineraryAddInfoRQ>
<AgencyInfo>
<Ticketing TicketType="7T-"/>
</AgencyInfo>
<CustomerInfo>
<ContactNumbers>
<ContactNumber NameNumber="1.1" LocationCode="HAN" Phone="091-666-3333" PhoneUseType="B"/>
</ContactNumbers>
<Email Address="LYVIETANH#GMAIL.COM" NameNumber="1.1" ShortText="ABC123" Type="CC"/>
<PersonName Infant="false" NameNumber="1.1" PassengerType="ADT">
<GivenName>FATHER MR</GivenName>
<Surname>SUR</Surname>
</PersonName>
<PersonName Infant="false" NameNumber="2.1" PassengerType="ADT">
<GivenName>MOTHER MRS</GivenName>
<Surname>LINUX</Surname>
</PersonName>
<PersonName Infant="false" NameNumber="3.1" PassengerType="CNN" NameReference="C02">
<GivenName>CHILD MS</GivenName>
<Surname>SUR</Surname>
</PersonName>
<PersonName Infant="true" NameNumber="4.1" PassengerType="INF" NameReference="I13">
<GivenName>INFANT MSTR</GivenName>
<Surname>SUR</Surname>
</PersonName>
</CustomerInfo>
</TravelItineraryAddInfoRQ>
</PassengerDetailsRQ>
PassengerDetail response:
<PassengerDetailsRS xmlns="http://services.sabre.com/sp/pd/v3_3">
<ApplicationResults xmlns="http://services.sabre.com/STL_Payload/v02_01" status="Complete">
<Success timeStamp="2018-06-15T12:11:26.163-05:00"/>
<Warning type="BusinessLogic" timeStamp="2018-06-15T12:11:25.226-05:00">
<SystemSpecificResults>
<Message code="WARN.SWS.HOST.ERROR_IN_RESPONSE">.INVALID ACTION</Message>
</SystemSpecificResults>
</Warning>
<Warning type="BusinessLogic" timeStamp="2018-06-15T12:11:25.451-05:00">
<SystemSpecificResults>
<Message code="WARN.SWS.HOST.ERROR_IN_RESPONSE">CHECK ITINERARY</Message>
</SystemSpecificResults>
</Warning>
</ApplicationResults>
<TravelItineraryReadRS>
<TravelItinerary>
<CustomerInfo>
<ContactNumbers>
<ContactNumber LocationCode="HAN" Phone="091-666-3333-B-1.1" RPH="001"/>
</ContactNumbers>
<PersonName WithInfant="false" NameNumber="01.01" RPH="1">
<Email Comment="CC/ABC123">LYVIETANH#GMAIL.COM</Email>
<GivenName>FATHER MR</GivenName>
<Surname>SUR</Surname>
</PersonName>
<PersonName WithInfant="false" NameNumber="02.01" RPH="2">
<GivenName>MOTHER MRS</GivenName>
<Surname>LINUX</Surname>
</PersonName>
<PersonName WithInfant="false" NameNumber="03.01" NameReference="C02" RPH="3">
<GivenName>CHILD MS</GivenName>
<Surname>SUR</Surname>
</PersonName>
<PersonName WithInfant="true" NameNumber="04.01" NameReference="I13" RPH="4">
<GivenName>INFANT MSTR</GivenName>
<Surname>SUR</Surname>
</PersonName>
</CustomerInfo>
<ItineraryInfo>
... I REMOVED THIS DATA ...
</ItineraryInfo>
<RemarkInfo>
<Remark RPH="001" Type="General">
<Text>TEST REMARK</Text>
</Remark>
</RemarkInfo>
<SpecialServiceInfo RPH="001" Type="AFX">
<Service SSR_Code="OSI">
<PersonName NameNumber="04.01">I/SUR/INFANT MSTR</PersonName>
<Text>VN INF</Text>
</Service>
</SpecialServiceInfo>
</TravelItinerary>
</TravelItineraryReadRS>
EndTransaction request:
<EndTransactionRQ Version="2.0.8" xmlns="http://webservices.sabre.com/sabreXML/2011/10" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<EndTransaction Ind="true" />
<Source ReceivedFrom="SWS TEST" />
</EndTransactionRQ>
EndTransaction response:
<EndTransactionRS xmlns="http://webservices.sabre.com/sabreXML/2011/10" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:stl="http://services.sabre.com/STL/v01" Version="2.0.8">
<stl:ApplicationResults status="NotProcessed">
<stl:Error type="BusinessLogic" timeStamp="2018-06-15T12:11:31-05:00">
<stl:SystemSpecificResults>
<stl:Message>INFANT DETAILS REQUIRED IN SSR - ENTER 4INFT/...</stl:Message>
<stl:ShortText>ERR.SWS.HOST.ERROR_IN_RESPONSE</stl:ShortText>
</stl:SystemSpecificResults>
</stl:Error>
</stl:ApplicationResults>
</EndTransactionRS>
If you check in the response PassengerDetailsRS/TravelItineraryReadRS/TravelItinerary/SpecialServiceInfo you'll see that none of the special services were added, and for that reason it is requested at the time of the EndTransaction call.
Without knowing the status of the itinerary, it is impossible to state the cause of the 2 warnings returned:
<ApplicationResults xmlns="http://services.sabre.com/STL_Payload/v02_01" status="Complete">
<Success timeStamp="2018-06-15T12:11:26.163-05:00"/>
<Warning type="BusinessLogic" timeStamp="2018-06-15T12:11:25.226-05:00">
<SystemSpecificResults>
<Message code="WARN.SWS.HOST.ERROR_IN_RESPONSE">.INVALID ACTION</Message>
</SystemSpecificResults>
</Warning>
<Warning type="BusinessLogic" timeStamp="2018-06-15T12:11:25.451-05:00">
<SystemSpecificResults>
<Message code="WARN.SWS.HOST.ERROR_IN_RESPONSE">CHECK ITINERARY</Message>
</SystemSpecificResults>
</Warning>
</ApplicationResults>
I would guess UC segments in the itinerary.
Between the "CHECK ITINERARY" error and the "ENTER 4INFT/..." message on save, it would appear you are working with an AA itinerary, and are sending a 3INFT command.
When airline is AA, you need to switch almost all commands starting with a 3 to starting with a 4. ie instead of sending 3INFT/... you send 4INFT/...
Hope this helps!
I have implemented a WSDL of an external service. They have the endpoint of this implementation and we need to configure our WCF configuration so that our WSDL ends up being like theirs so that that company is able to call our service and our WCF service knows what to do.
Their WSDL contains these signed elements:
<wsp:Policy wsu:Id="SecureMessagePolicy">
<wsp:ExactlyOne>
<wsp:All>
<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:SignedElements>
<sp:XPath>/*[namespace-uri()='http://schemas.xmlsoap.org/soap/envelope/' and local-name()='Envelope']/*[namespace-uri()='http://schemas.xmlsoap.org/soap/envelope/' and local-name()='Header']/*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' and local-name()='Security']/*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd' and local-name()='Timestamp']</sp:XPath>
<sp:XPath>/*[namespace-uri()='http://www.w3.org/2003/05/soap-envelope' and local-name()='Envelope']/*[namespace-uri()='http://www.w3.org/2003/05/soap-envelope' and local-name()='Header']/*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' and local-name()='Security']/*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd' and local-name()='Timestamp']</sp:XPath>
</sp:SignedElements>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
The signing part of my WSDL looks like this:
<wsp:Policy wsu:Id="{{POLICE_NAME_REQUEST}}">
<wsp:ExactlyOne>
<wsp:All>
<sp:SignedParts xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
<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>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
<wsp:Policy wsu:Id="{{POLICE_NAME_RESPONSE}}">
<wsp:ExactlyOne>
<wsp:All>
<sp:SignedParts xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
<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>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
<wsp:Policy wsu:Id="{{POLICE_NAME_FAULT}}">
<wsp:ExactlyOne>
<wsp:All>
<sp:SignedParts xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
<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>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
WCF generates these things for the request, response and fault. Their WSDL has it done for these 3 things just once. I don't think this really matters.
As you can see, our WSDL says that the same thing should be signed. (Body, To, From, FaultTo, ReplyTO, MessageID, RelatesTo, Action). EXCEPT SignedElements part which specifies that the TimeStamp should also be signed.
The Timestamp is part of the http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd namespace (called wsu in their WSDL):
<wsu:Timestamp ... >
<wsu:Created>2011-11-30T11:12:12.459Z</wsu:Created>
<wsu:Expires>2011-12-01T11:12:12.459Z</wsu:Expires>
</wsu:Timestamp>
My binding now looks like this:
<binding>
<MissingWSAddressingHeadersTextEncoding />
<security
authenticationMode="MutualCertificate"
messageSecurityVersion="WSSecurity10WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10"
enableUnsecuredResponse="false"
messageProtectionOrder="EncryptBeforeSign"
includeTimestamp="true"
defaultAlgorithmSuite="TripleDesRsa15"
allowSerializedSigningTokenOnReply="false"/>
<httpsTransport requireClientCertificate="true"/>
</binding>
MissingWSAddressingHeadersTextEncoding is a custom encoder that uses a TextMessageEncoder underwater.
The question
How do I specify that my WSDL should also sign the Timestamp? I guess that if I return a response with an unsigned response, errors might occur.
I have found the answer.
Apparently, a timestamp is ALWAYS signed when signing is used (docs.microsoft), so I do not need to worry about signing the timestamp.
When I checked SOAP UI's response, I just got FailedAuthentication errors. I implemented [Recommended WCF logging] which told me that the timestamp was not signed by SOAP UI, which is weird because I did specify this in the WS outgoing config.
My fix was to use MutualCertificateDuplex. This did sign the Timestamp. I also put allowSerializedSigningTokenOnReply on true, although I don't think this matters.
I'm making the following sequence of calls to reserve a hotel room using the direct sell request:
HotelPropertyDescriptionRQ
PassengerDetailsRQ
OTA_HotelResRQ
The final response errors with:
FORMAT ERROR ON OPTIONAL FIELD
I'm unable to work out what is causing this error - is it perhaps the RPH of the room is not being correctly added to the PassengerDetailsRQ?
The OTA_HotelResRQ is:
<OTA_HotelResRQ xmlns="http://webservices.sabre.com/sabreXML/2011/10" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ReturnHostCommand="true" TimeStamp="2017-02-13T12:45:24" Version="2.2.0">
<Hotel>
<BasicPropertyInfo RPH="001">
<ConfirmationNumber>PWBA-POW-131c-02</ConfirmationNumber>
</BasicPropertyInfo>
<Guarantee Type="G">
<CC_Info>
<PaymentCard Code="VI" ExpireDate="2018-10" Number="4111111111111111"/>
<PersonName>
<Surname>TEST</Surname>
</PersonName>
</CC_Info>
</Guarantee>
<RoomType NumberOfUnits="1"/>
</Hotel>
The HotelPropertyDescriptionRQ:
<HotelPropertyDescriptionRQ Version="2.3.0" xmlns="http://webservices.sabre.com/sabreXML/2011/10">
<AvailRequestSegment>
<GuestCounts Count="1" />
<HotelSearchCriteria>
<Criterion>
<HotelRef HotelCode="0007855" />
</Criterion>
</HotelSearchCriteria>
<TimeSpan End="2016-12-17" Start="2016-12-10"/>
</AvailRequestSegment>
</HotelPropertyDescriptionRQ>
The PassengerDetailsRQ:
<PassengerDetailsRQ xmlns="http://services.sabre.com/sp/pd/v3_3" version="3.3.0" IgnoreOnError="false" HaltOnError="true">
<PostProcessing IgnoreAfter="false" RedisplayReservation="true" UnmaskCreditCard="true">
<EndTransactionRQ>
<EndTransaction Ind="true"></EndTransaction>
<Source ReceivedFrom="PW TESTING"/>
</EndTransactionRQ>
</PostProcessing>
<PreProcessing IgnoreBefore="false">
<UniqueID ID=""/>
</PreProcessing>
<SpecialReqDetails>
<AddRemarkRQ>
<RemarkInfo>
<FOP_Remark>
<CC_Info Suppress="true">
<PaymentCard Code="VI" ExpireDate="2017-12" Number="4444333322221111" SuppressApprovalCode="true"/>
</CC_Info>
</FOP_Remark>
</RemarkInfo>
</AddRemarkRQ>
</SpecialReqDetails>
<TravelItineraryAddInfoRQ>
<AgencyInfo>
<Address>
<AddressLine>XXXXXXXXXXX Ltd</AddressLine>
<CityName>London</CityName>
<CountryCode>GB</CountryCode>
<PostalCode>XXXX XXX</PostalCode>
<StateCountyProv StateCode="LN" />
<StreetNmbr>2 Some Rome</StreetNmbr>
</Address>
</AgencyInfo>
<CustomerInfo>
<ContactNumbers>
<ContactNumber NameNumber="1.1" Phone="817-555-1212" PhoneUseType="H" />
</ContactNumbers>
<PersonName Infant="false" NameNumber="1.1">
<GivenName>Iain</GivenName>
<Surname>TESTING</Surname>
</PersonName>
</CustomerInfo>
</TravelItineraryAddInfoRQ>
</PassengerDetailsRQ>
I believe it is because you are adding a confirmation number to the sell request, which is an optional field when selling passive segments, but it should not be expected when actually requesting the room to the hotel.
<ConfirmationNumber>PWBA-POW-131c-02</ConfirmationNumber>
I would try removing that.
To reserve a hotel room using the direct sell request from sabre used OTA_HotelResRQ request.
Here is one example for request (i already used this request and get response from sabre)
<?xml version="1.0"?>
-<OTA_HotelResRQ Version="2.2.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-<Hotel xmlns="http://webservices.sabre.com/sabreXML/2011/10">
<BasicPropertyInfo RPH="001"/>
<Customer NameNumber="01.01"/>
-<Guarantee Type="G">
-<CC_Info>
<PaymentCard Number="3782 8224 6310 005" ExpireDate="2021-09" Code="AX"/>
-<PersonName>
<Surname>tailor</Surname>
</PersonName>
</CC_Info>
</Guarantee>
<RoomType NumberOfUnits="1"/>
</Hotel>
</OTA_HotelResRQ>