2013-09-03 80 views
5

Tôi đang làm việc trên các dịch vụ web XML. Khách hàng của tôi dịch vụ web "Khách hàng" có địa chỉ của wsdl của dịch vụ web máy chủ "Dịch vụ" tại thời gian chạy. Để "Khách hàng" sử dụng "Dịch vụ", tôi cần phải làm điều sau đây "theo lập trình":tạo proxy bằng cách sử dụng phân tích cú pháp wsdl theo lập trình và wsdl

1) Tải tệp wsdl ngay từ "Dịch vụ" hoặc từ vị trí trên đĩa. 2) Tạo proxy theo lập trình tức là không sử dụng wsdl.exe hoặc Thêm tham chiếu web. 3) Gọi phương thức trên proxy đã tạo.

Có thể thực hiện được không? Nếu một số người đã làm nó sẽ là tuyệt vời để có bất cứ đề nghị làm thế nào để thực hiện.

+1

Dường như [Vấn đề XY] (http://www.perlmonks.org/?node_id=542341), Bạn chỉ muốn gọi các phương thức của webservice, nghĩ rằng tất cả các bước đó là cần thiết. – I4V

+0

Tôi không muốn có một tài liệu tham khảo dịch vụ cho mỗi dịch vụ tôi sẽ giao tiếp.Tôi muốn sử dụng một proxy duy nhất mà sẽ tạo ra các proxy trên bay từ một wsdl? Có thể? – Macnique

+1

Rất có thể. hãy xem [this] (http://www.c-sharpcorner.com/uploadfile/f9935e/invoking-a-web-service-dynamically-using-system-net-and-soap/). Nhưng điều này không phải là tạo ra một proxy thay vì nó tạo ra yêu cầu xà phòng. –

Trả lời

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

Nó sẽ không dễ dàng thừa kế từ 'SoapHttpClientProtocol' và gọi' base.Invoke' thay vì làm việc biên dịch thời gian chạy rất tốn kém này? Việc sử dụng tạo proxy loại an toàn là gì khi chỉ có tên phương thức và tham số được biết trong thời gian chạy? – I4V

+0

@ I4V vui lòng đăng mã của riêng bạn và cho phép OP thử và chọn –

+0

@MauricioGracia nếu i4v đề xuất có thể, vui lòng thử ... vì chúng tôi muốn có WSDL động tự động thay đổi URL và tạo đối tượng đó để gọi dịch vụ web RUN TIME –