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]