I’m trying to write a simple WCF Server + gSOAP client proof-of-concept application using SOAP 1.2 protocol. Here’s server code:
[ServiceContract(Namespace='http://test.com')] public interface IService1 { [OperationContract] void HelloWorld(); } [ServiceBehavior(Namespace = 'http://test.com')] public class Service1 : IService1 { public void HelloWorld() { } } static void Main(string[] args) { var svc = new Service1(); Uri uri = new Uri('http://localhost:8201/Service1'); ServiceHost host = new ServiceHost(typeof(Service1), uri); host.Description.Namespace = 'http://test.com'; var binding = new WSHttpBinding() { Namespace = 'http://test.com' }; ServiceEndpoint endpoint = host.AddServiceEndpoint(typeof(IService1), binding, uri); endpoint.Behaviors.Add(new InlineXsdInWsdlBehavior()); host.Description.Behaviors.Add(new ServiceMetadataBehavior() { HttpGetEnabled = true }); var mex = host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), 'mex'); host.Open(); Console.ReadLine(); }
Then I launch service and generate code using following commands:
wsdl2h.exe -gyf -t WS/WS-typemap.dat -o Service.h http://localhost:8201/Service1?wsdl WS/WS-Addressing05.xsd soapcpp2.exe -C -L -w -x -i -2 Service.h -ID:\...\gsoap-2.7\gsoap\import
Then I compile following C++ code:
#include 'soapWSHttpBinding_USCOREIService1Proxy.h' #include 'WSHttpBinding_USCOREIService1.nsmap' #include 'stdsoap2.h' int _tmain(int argc, _TCHAR* argv[]) { WSHttpBinding_USCOREIService1Proxy svc; _ns1__HelloWorld req; _ns1__HelloWorldResponse rsp; int hr = svc.HelloWorld( &req, &rsp ); if ( hr != SOAP_OK ) { _tprintf( _T('Error: %i\n'), hr ); } return 0; }
and this generates error 8 (SOAP_MUSTUNDERSTAND). Have anyone ever generated working WCF to gSOAP link at all? What am I doing wrong?
I guess -a switch in soapcpp2 have fixed error 8, so the switches are now: