2013-09-03 22 views
5

Pracuję nad usługami sieci XML. Moja usługa internetowa klienta "Klient" zawiera adres URL serwera WWW usługi "Usługa" w czasie wykonywania. Aby "Klient" mógł używać "Usługi", muszę wykonać następujące czynności "programowo":Tworzenie proxy za pomocą wsdl programowo i wsdl parsowanie

1) Pobierz plik wsdl w locie z "Usługi" lub z lokalizacji na dysku. 2) Utwórz programowo program pośredniczący, tzn. Nie używając pliku wsdl.exe lub Dodaj odniesienia do strony WWW. 3) Wywoływanie metod na utworzonym proxy.

Czy można to zrobić? Jeśli ktoś to zrobił, dobrze byłoby wziąć wszelkie sugestie, jak to zrobić.

+1

Wygląda jak problem [XY] (http://www.perlmonks.org/?node_id=542341), po prostu chcą odwołać się do metod usługa, myślenia potrzebne są te wszystkie kroki. – I4V

+0

Nie chcę mieć odwołania do usługi dla każdej usługi, którą zamierzam się komunikować. Chcę użyć pojedynczego serwera proxy, który utworzyłby serwer proxy w locie z pliku wsdl? Czy to możliwe? – Macnique

+1

Jest to bardzo możliwe. spójrz na [this] (http://www.c-sharpcorner.com/uploadfile/f9935e/invoking-a-web-service-dynamically-using-system-net-and-soap/). Ale to nie tworzy serwera proxy, ponieważ tworzy żądanie mydła. –

Odpowiedz

8
using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Reflection; 
using System.CodeDom; 
using System.CodeDom.Compiler; 
using System.Security.Permissions; 
using System.Web.Services.Description; 

namespace ConnectionLib 
{ 
    public class WSProxy 
    { 
     [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 
      System.IO.Stream stream = client.OpenRead(webServiceAsmxUrl + "?wsdl"); 

      // 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 = "Soap12"; // 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; 
      } 
     } 
    } 
} 
+1

Czy nie byłoby łatwiej dziedziczyć po 'SoapHttpClientProtocol' i wywoływać' base.Invoke' zamiast robić to bardzo kosztowne kompilacje czasu wykonywania? Jaki jest pożytek z tworzenia bezpiecznych serwerów proxy typu, gdy tylko nazwa metody i parametry są znane w czasie wykonywania? – I4V

+0

@ I4V zapraszam do dodania własnego kodu i zezwolenia OP na próbę wybrania –

+0

@MauricioGracia, jeśli i4v sugeruje, że możesz, spróbuj ... ponieważ chcemy mieć dynamiczny WSDL, który dynamicznie zmienia adres URL i stworzyć ten obiekt dla połączenia usługi internetowe CZAS PRACY –

Powiązane problemy