Generic WebService (SOAP) client library for C++

前端 未结 3 782
我在风中等你
我在风中等你 2020-12-30 05:14

I\'m looking for a simple C++ WebService Client Library that can be easily linked into my application.

Preferably this library:

  • can be used to access a
相关标签:
3条回答
  • 2020-12-30 05:49

    Have you looked at gSOAP? I think it will be suitable for your needs.

    http://gsoap2.sourceforge.net/

    0 讨论(0)
  • 2020-12-30 05:54

    I found a solution using on-the-fly-generated assemblies (which I couldn't get working the previous time). Starting point is http://refact.blogspot.com/2007_05_01_archive.html.

    E.g. This is the code to use the PeriodicTable web service:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net;
    using System.Web;
    using System.Web.Services;
    using System.Web.Services.Description;
    using System.CodeDom;
    using System.CodeDom.Compiler;
    using System.Xml.Serialization;
    using System.IO;
    using System.Reflection;
    
    namespace GenericSoapClient
    {
    class Program
        {
        static void method1()
            {
            Uri uri = new Uri("http://www.webservicex.net/periodictable.asmx?WSDL");
            WebRequest webRequest = WebRequest.Create(uri);
            System.IO.Stream requestStream = webRequest.GetResponse().GetResponseStream();
    
            // Get a WSDL
            ServiceDescription sd = ServiceDescription.Read(requestStream);
            string sdName = sd.Services[0].Name;
    
            // Initialize a service description servImport
            ServiceDescriptionImporter servImport = new ServiceDescriptionImporter();
            servImport.AddServiceDescription(sd, String.Empty, String.Empty);
            servImport.ProtocolName = "Soap";
            servImport.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties;
    
            CodeNamespace nameSpace = new CodeNamespace();
            CodeCompileUnit codeCompileUnit = new CodeCompileUnit();
            codeCompileUnit.Namespaces.Add(nameSpace);
    
            // Set Warnings
    
            ServiceDescriptionImportWarnings warnings = servImport.Import(nameSpace, codeCompileUnit);
    
            if (warnings == 0)
                {
                StringWriter stringWriter =
                     new StringWriter(System.Globalization.CultureInfo.CurrentCulture);
    
                Microsoft.CSharp.CSharpCodeProvider prov =
                  new Microsoft.CSharp.CSharpCodeProvider();
    
                prov.GenerateCodeFromNamespace(nameSpace,
                   stringWriter,
                   new CodeGeneratorOptions());
    
                string[] assemblyReferences =
                   new string[2] { "System.Web.Services.dll", "System.Xml.dll" };
    
                CompilerParameters param = new CompilerParameters(assemblyReferences);
    
                param.GenerateExecutable = false;
                param.GenerateInMemory = true;
                param.TreatWarningsAsErrors = false;
    
                param.WarningLevel = 4;
    
                CompilerResults results = new CompilerResults(new TempFileCollection());
                results = prov.CompileAssemblyFromDom(param, codeCompileUnit);
                Assembly assembly = results.CompiledAssembly;
                Type service = assembly.GetType(sdName);
    
                //MethodInfo[] methodInfo = service.GetMethods();
    
                List<string> methods = new List<string>();
    
                // only find methods of this object type (the one we generated)
                // we don't want inherited members (this type inherited from SoapHttpClientProtocol)
                foreach (MethodInfo minfo in service.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly))
                    {
                    methods.Add(minfo.Name);
                    Console.WriteLine (minfo.Name + " returns " + minfo.ReturnType.ToString());
                    ParameterInfo[] parameters = minfo.GetParameters();
                    foreach (ParameterInfo pinfo in parameters)
                        {
                            Console.WriteLine("   " + pinfo.Name + " " + pinfo.ParameterType.ToString());
                        }
                    }
    
                // Create instance of created web service client proxy
                object obj = assembly.CreateInstance(sdName);
    
                Type type = obj.GetType();
    
                object[] args0 = new object[] { };
                string result0 = (string)type.InvokeMember(methods[0], BindingFlags.InvokeMethod, null, obj, args0);
                Console.WriteLine(result0);
    
                object[] args1 = new object[] { "Oxygen" };
                string result1 = (string)type.InvokeMember(methods[1], BindingFlags.InvokeMethod, null, obj, args1);
                Console.WriteLine(result1);
                }
            }
        }
    }
    

    In this code I explicitly use methods[0] and methods[1] but in reality you would check the method names of course. In this example I get the names of all elements in the periodic table, then get the atomic weight of oxygen.

    This example does not yet contain logic to support a proxy. I still need to add this, but for the moment, it solves my biggest problem, namely, having a generic SOAP client.

    EDIT:

    I know this code is C# and I was originally asking for a C++ solution, but this code proves that it can work in a .NET environment (which I can still use in limited parts of my application), and I will probably rewrite this code into C++/.NET, which solves my problem.

    0 讨论(0)
  • 2020-12-30 05:56

    Axis2C : http://axis.apache.org/axis2/c/core/index.html

    Axis2C ticks most of the above , please check for static linking. .

    EDIT: As per last few messages on the list, static linking is incomplete. The below still holds:

    Perhaps I do not understand the question correctly. Any web service you call you need to specify the endpoint URL and the operation & parameters.

    Are you referring to dynamically "discovering" the services & presenting the option to call them...? If so I doubt this is possible.

    If you are referring to generic framework, SOAP messages are client end responsibility any way... You should not have a problem wrapping them under some of the toolkit API's. WSDL code generation is not mandatory. I have written a few services from scratch, i.e. You can set endpoint, service and craft the SOAP message, parameters, headers etc. as you feel.

    Cheers!

    0 讨论(0)
提交回复
热议问题