2 Stimmen

Dynamischer Aufruf eines Webdienstes zur Laufzeit

Ich habe Code, der es mir ermöglicht, einen Webdienst zur Laufzeit für eine bestimmte URL, einen Dienstnamen, einen Methodennamen und Argumente dynamisch aufzurufen. Das Problem tritt auf, wenn die WSDL, die ich zu kompilieren versuche, die <import namespace="..." location="..."/> Tag. Es wird der folgende Fehler ausgegeben:

Dienstbeschreibung mit Namespace ... fehlt

Vermutlich muss ich zuerst die referenzierte WSDL aus dem Import-Tag kompilieren. Wie sollte ich vorgehen, wenn ich bedenke, dass die referenzierte WSDL auch auf eine andere WSDL verweisen könnte? Im Folgenden finden Sie den Code, den ich verwende.

public static object CallWebService(string url, string serviceName, string methodName, string userName, string password, ServiceDescription wsdl, ILogger logger, object[] args)
{
            var client = new WebClient();
            if (userName.Length > 0)
            {
                client.Credentials = new NetworkCredential(userName, password);
            }

            var stream = client.OpenRead(url + "?wsdl");
            if (stream != null)
            {
                var description = ServiceDescription.Read(stream);
                wsdl = description;

                var importer = new ServiceDescriptionImporter
                    {
                        ProtocolName = "Soap12",
                        Style = ServiceDescriptionImportStyle.Client,
                        CodeGenerationOptions = CodeGenerationOptions.GenerateProperties
                    };
                importer.AddServiceDescription(wsdl, null, null);

                var nameSpace = new CodeNamespace();
                var unit = new CodeCompileUnit();
                unit.Namespaces.Add(nameSpace);

                **var warning = importer.Import(nameSpace, unit);** // Error occurs here
                if (warning == 0)
                {
                    var provider = CodeDomProvider.CreateProvider("CSharp");
                    var assemblyReferences = new[] { "System.dll", "System.Web.Services.dll", "System.Web.dll", "System.Xml.dll", "System.Data.dll" };
                    var parameters = new CompilerParameters(assemblyReferences);
                    var results = provider.CompileAssemblyFromDom(parameters, unit);

                    if (results.Errors.Count > 0)
                    {
                        logger.Info("Compiler errors: " + results.Errors.Count);
                        foreach (var error in results.Errors)
                        {
                            logger.Info(error.ToString());
                        }

                        throw new Exception("Compile Error Occured calling webservice.");
                    }

                    var service = results.CompiledAssembly.CreateInstance(serviceName);
                    if (service != null)
                    {
                        var methods = service.GetType().GetMethods();
                        var method = service.GetType().GetMethod(methodName);
                        if (method == null)
                        {
                            var message = "Method: " + methodName + " is invalid. Valid Methods are: ";
                            message = methods.Aggregate(message, (current, methodInfo) => current + methodInfo.Name + "; ");
                            throw new Exception(message);
                        }

                        return method.Invoke(service, args);
                    }

                    logger.Info("Service invocation error. ServiceName provided: " + serviceName);
                    return null;
                }

                return null;
            }

            return null;
}

0voto

GBoehm Punkte 183

Ein bisschen spät vielleicht, aber für Google-Suchende nicht schlecht. Sie müssen Ihre xsd-Dateien flatten. Parsen Sie sie und suchen Sie den Importteil. Nehmen Sie diesen Importteil und fügen Sie die Datei hinzu, die Sie am Speicherort des Imports gefunden haben. Damit sollten Sie beginnen können: http://arstechnica.com/civis/viewtopic.php?f=20&t=180943

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X