Hola Roberto:
En un proyecto por el cual pasé hicimos algo similar a lo tuyo pero de forma
más compleja.
Trabajamos con la Arquitectura MBI de Microsoft (hoy por hoy puede ser algo
de WCF).
Construíamos un Request. Ejecutábamos una Action. Y obteníamos el retorno en
un Response.
Al momento de ejecutar la acción hacíamos lo siguiente:

// Obteníamos las propiedades del Request

string webServiceAsmxUrl = req.WebServiceAsmxUrl;

string serviceName = req.ServiceName;

string methodName = req.MethodName;

object[] args = req.Args;

System.Net.WebClient client = new System.Net.WebClient();

// Conectase al WS

System.IO.Stream stream = client.OpenRead(webServiceAsmxUrl + "?wsdl");

// Leer WSDL

ServiceDescription description = ServiceDescription.Read(stream);

// Cargar el DOM

ServiceDescriptionImporter importer = new ServiceDescriptionImporter();

// Usar SOAP 1.2

importer.ProtocolName = "Soap12";

importer.AddServiceDescription(description, null, null);

// Generar Cliente

importer.Style = ServiceDescriptionImportStyle.Client;

// Generar Propiedades con valores primitivos

importer.CodeGenerationOptions =
System.Xml.Serialization.CodeGenerationOptions.GenerateProperties;

// Iniciar Code-DOM

CodeNamespace nmspace = new CodeNamespace();

CodeCompileUnit unit1 = new CodeCompileUnit();

unit1.Namespaces.Add(nmspace);

// Importar Servicio al Code-DOM

// Crear el Proxy

ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit1);

if (warning == 0)

{

// Generar el Código del Proxy

CodeDomProvider provider1 = CodeDomProvider.CreateProvider("CSharp");

// Compilar el Código

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

// Comprobar Errores

if (results.Errors.Count > 0)

{

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

}

// Invocar el método del WS

object wsvcClass = results.CompiledAssembly.CreateInstance(serviceName);

MethodInfo mi = wsvcClass.GetType().GetMethod(methodName);

object returnObject = mi.Invoke(wsvcClass, args);



Y acá ya estoy en condiciones de setear el retorno en un Response y listo!
Espero haberte ayudado. De todas formas hay un documento de buenas prácticas
para consumir un WS desde otro proyecto/web site/application. No recuerdo
bien la dirección, si la encuentro te la paso.

Saludos cordiales,

Javier Ramos

El día 19 de mayo de 2008 8:30, Roberto Cruz Falcón <[EMAIL PROTECTED]>
escribió:

>  Gracias Javier
>
>
>
> Aquí va un trozo del código …
>
>
>
> public class WSConsumer
>
>     {
>
>         public string URLWSServer
>
>         {
>
>             get
>
>             {
>
>                 Properties.Settings obj = new Properties.Settings();
>
>                 return obj.WSURL;
>
>
>
>             }
>
>             set
>
>             {
>
>                 Properties.Settings obj = new Properties.Settings();
>
>                 obj.WSURL = value;
>
>                 obj.Save();
>
>                 GC.Collect();
>
>                 obj.Reload();
>
>             }
>
>         }
>
>         //---------------------------------------------------------
>
>
>
>         public void WSConsumer()
>
>         {
>
>         }
>
>
>
>         public string ListClientes()
>
>         {
>
>             WSUno.WSUno obj = new global::WSUno.Consumer.WSUno.WSUno();
>
>             return convertirXML(obj.ListClientes());
>
>         }
>
>       . . .
>
>
>
> Saludos
>
> Roberto
>
>
>
> *De:* [email protected] [mailto:[EMAIL PROTECTED] *En nombre de *Javier
> Ramos
> *Enviado el:* Sábado, 17 de Mayo de 2008 03:13 p.m.
> *Para:* [email protected]
> *Asunto:* [puntonet] Consumir varios WS desde una DLL.
>
>
>
>
> Hola Roberto:
>
> Podrías mandarme el código para ver cómo lo haces?
>
> Muchas gracias.
>
> Saludos cordiales,
>
>
>
> Javier Ramos
>
> El día 16 de mayo de 2008 15:39, Roberto Cruz Falcón <
> [EMAIL PROTECTED]> escribió:
>
> Hola
>
>                 El entorno es el siguiente: Varios WS distribuidos y un
> cliente los consume mediante una DLL. Se le publico una Propiedad a la DLL
> para aceptar la URL del WS y lo que hace en el SET() es cambiar el
> Properties.Settings.cURLWS que es la propiedad en cuestión.
>
>                 Todo funciona bien, pero cuando instancio esta DLL por
> Visual FOX una vez que hago la primera consulta, cuando cambio la URL y
> trato de hacer otra consulta sobre esta otra WS, me sigue apuntando al mismo
> WS siempre.
>
>                 Si salgo del FOX y entro de nuevo, si me lo hace a la
> ultima URL correctamente, pero después aunque cambie siempre se queda
> "conectado" a la ultima URL que se uso para la conexión.
>
>
>
> ¿Qué me está faltando?
>
>
>
> (en fox hago el Release del Objeto, probé usar otro nombre de objeto,
> recrearlo con otro nombre y nada.)
>
>
>
> Saludos
>
> Roberto
>
>
>
>
> --
> Javier Eduardo Ramos
>
> MSN: [EMAIL PROTECTED]
> Talk: [EMAIL PROTECTED]
> SKYPE: edudebolivar
>
> Movil: 54 011 15 3064 6801
> Mensajes: 54 011 5353 9494 Extensión: 2945173
>
> www.sistran.com.ar
> [EMAIL PROTECTED]
>
>


-- 
Javier Eduardo Ramos

MSN: [EMAIL PROTECTED]
Talk: [EMAIL PROTECTED]
SKYPE: edudebolivar

Movil: 54 011 15 3064 6801
Mensajes: 54 011 5353 9494 Extensión: 2945173

www.sistran.com.ar
[EMAIL PROTECTED]

Responder a