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