2009-03-30 4 views
1

Я пытаюсь написать простое приложение WCF Server + gSOAP для проверки подлинности с использованием протокола SOAP 1.2. Вот код сервера:WCF и gSOAP - совместимый код?

[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(); 
} 

Затем я запускаю службу и генерировать код, используя следующие команды:

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 

Тогда я компилирую следующий C++ кода:

#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; 
} 

и это порождает ошибку 8 (SOAP_MUSTUNDERSTAND). Кто-нибудь когда-либо создавал рабочий WCF для ссылки gSOAP вообще? Что я делаю не так?

ответ

3

Я думаю -a переключатель в soapcpp2 исправили ошибки 8, так что переключатели теперь:

soapcpp2.exe -C -L -w -x -i -2 -a Service.h -I<...path...>