Jump to content
lizie

adiconar web references dinamicamente

Recommended Posts

lizie

olá,

Meu problema é o seguinte:

Eu preciso de inserir uma web references dinamicamente em runtime. Encontrei um código que me permite efetuar isso, o problema é que este código só aceita url .asmx e a minha acaba em .wsdl.

Alguém pode me ajudar.o erro dá na variável warning antes de me retornar 0 esta a retornar OptionalExtensionsIgnored.

Obrigada :)

[securityPermissionAttribute(SecurityAction.Demand, Unrestricted = true)]
public static object CallWebService(string webServiceAsmxUrl, string serviceName, string methodName, object[] args)
{
System.Net.WebClient client = new System.Net.WebClient();
// Connect To the web service
	if (!webServiceAsmxUrl.Contains("?wsdl"))
		webServiceAsmxUrl += "?wsdl";
		System.IO.Stream stream = client.OpenRead(webServiceAsmxUrl);
// Now read the WSDL file describing a service.
ServiceDescription description = ServiceDescription.Read(stream);
///// LOAD THE DOM /////////
	// Initialize a service description importer.
	ServiceDescriptionImporter importer = new ServiceDescriptionImporter();
	importer.ProtocolName = "Soap"; // Use SOAP 1.2.
	importer.AddServiceDescription(description, null, null);
// Generate a proxy client.
	importer.Style = ServiceDescriptionImportStyle.Client;
// Generate properties to represent primitive values.
	importer.CodeGenerationOptions = System.Xml.Serialization.CodeGenerationOptions.GenerateProperties;
// Initialize a Code-DOM tree into which we will import the service.
	CodeNamespace nmspace = new CodeNamespace();
	CodeCompileUnit unit1 = new CodeCompileUnit();
	unit1.Namespaces.Add(nmspace);
// Import the service into the Code-DOM tree. This creates proxy code that uses the service.
	ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit1);
if (warning == 0) // If zero then we are good to go
{
	// Generate the proxy code
	CodeDomProvider provider1 = CodeDomProvider.CreateProvider("CSharp");
	// Compile the assembly proxy with the appropriate references
	string[] assemblyReferences = new string[5] { "System.dll", "System.Web.Services.dll", "System.Web.dll", "System.Xml.dll", "System.Data.dll" };
	CompilerParameters parms = new CompilerParameters(assemblyReferences);
	CompilerResults results = provider1.CompileAssemblyFromDom(parms, unit1);
	// Check For Errors
	if (results.Errors.Count > 0)
		{
			foreach (CompilerError oops in results.Errors)
			{
				System.Diagnostics.Debug.WriteLine("========Compiler error============");
				System.Diagnostics.Debug.WriteLine(oops.ErrorText);
			}
			throw new System.Exception("Compile Error Occured calling webservice. Check Debug ouput window.");
		}
	// Finally, Invoke the web service method
	object wsvcClass = results.CompiledAssembly.CreateInstance(serviceName);
	MethodInfo mi = wsvcClass.GetType().GetMethod(methodName);
	return mi.Invoke(wsvcClass, args);
}
else
{
	return null;
}
}

Edited by apocsantos
Geshi + Identação

Share this post


Link to post
Share on other sites
apocsantos

Boa noite,

Depois de ver o código a unica coisa que me saltou à vista foi uma falta de chavetas.

[securityPermissionAttribute(SecurityAction.Demand, Unrestricted = true)]
public static object CallWebService(string webServiceAsmxUrl, string serviceName, string methodName, object[] args)
{
	System.Net.WebClient client = new System.Net.WebClient();
	// Connect To the web service
			if (!webServiceAsmxUrl.Contains("?wsdl"))
			{
					webServiceAsmxUrl += "?wsdl";
					System.IO.Stream stream = client.OpenRead(webServiceAsmxUrl);
				// Now read the WSDL file describing a service.
				ServiceDescription description = ServiceDescription.Read(stream);
				///// LOAD THE DOM /////////
						// Initialize a service description importer.
						ServiceDescriptionImporter importer = new ServiceDescriptionImporter();
						importer.ProtocolName = "Soap"; // Use SOAP 1.2.
						importer.AddServiceDescription(description, null, null);
				// Generate a proxy client.
						importer.Style = ServiceDescriptionImportStyle.Client;
				// Generate properties to represent primitive values.
						importer.CodeGenerationOptions = System.Xml.Serialization.CodeGenerationOptions.GenerateProperties;
				// Initialize a Code-DOM tree into which we will import the service.
						CodeNamespace nmspace = new CodeNamespace();
						CodeCompileUnit unit1 = new CodeCompileUnit();
						unit1.Namespaces.Add(nmspace);
				// Import the service into the Code-DOM tree. This creates proxy code that uses the service.
						ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit1);
				if (warning == 0) // If zero then we are good to go
				{
						// Generate the proxy code
						CodeDomProvider provider1 = CodeDomProvider.CreateProvider("CSharp");
						// Compile the assembly proxy with the appropriate references
						string[] assemblyReferences = new string[5] { "System.dll", "System.Web.Services.dll", "System.Web.dll", "System.Xml.dll", "System.Data.dll" };
						CompilerParameters parms = new CompilerParameters(assemblyReferences);
						CompilerResults results = provider1.CompileAssemblyFromDom(parms, unit1);
						// Check For Errors
						if (results.Errors.Count > 0)
								{
										foreach (CompilerError oops in results.Errors)
										{
												System.Diagnostics.Debug.WriteLine("========Compiler error============");
												System.Diagnostics.Debug.WriteLine(oops.ErrorText);
										}
										throw new System.Exception("Compile Error Occured calling webservice. Check Debug ouput window.");
								}
						// Finally, Invoke the web service method
						object wsvcClass = results.CompiledAssembly.CreateInstance(serviceName);
						MethodInfo mi = wsvcClass.GetType().GetMethod(methodName);
						return mi.Invoke(wsvcClass, args);
				}
				else
				{
						return null;
				}
			}
}

Cordiais cumprimentos,

Apocsnatos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.