2016-04-03 22 views
0

私はサービスを追加せずにWebサービスを呼び出すクライアントを開発しています。このメソッドは、パラメータとしてXMLを受け取ります。ラインでSSL経由のサービス参照を追加せずに動的にWebサービスを呼び出す方法

static void Main(string[] args) 
    { 
     string xmlAux = string.Empty; 
     string link = "https://test.xxx.com/xxx/xxx.asmx";    

     string arg1 = @"<tuca> <hd> <t_doc>10</t_doc> <id_user>xxx</id_user> <pwd>xxx</pwd> <id_pais>xxx</id_pais> </hd> <parametros> <par tipo=""tipo_sujeto"">fisico</par> <par tipo=""calificacion"">xxx</par> <par tipo=""CEDULA DE IDENTIDAD"">xxx</par> </parametros> </tuca>"; 

     object[] arguments = { arg1 }; 

     var ws = CallWebService(link, "xxx", "Reporte", arguments); 

     if (ws != null) 
     { 
      xmlAux = ws.ToString(); 
     } 
    } 
    [System.Security.Permissions.SecurityPermissionAttribute(System.Security.Permissions.SecurityAction.Demand, Unrestricted = true)] 
    internal 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. 
     var description = System.Web.Services.Description.ServiceDescription.Read(stream); 

     ///// LOAD THE DOM ///////// 
     // Initialize a service description importer. 
     var importer = new System.Web.Services.Description.ServiceDescriptionImporter(); 

     importer.ProtocolName = "Soap12"; // Use SOAP 1.2. 

     importer.AddServiceDescription(description, null, null); 

     // Generate a proxy client. 
     importer.Style = System.Web.Services.Description.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. 
     var nmspace = new System.CodeDom.CodeNamespace(); 

     var unit1 = new System.CodeDom.CodeCompileUnit(); 
     unit1.Namespaces.Add(nmspace); 

     // Import the service into the Code-DOM tree. This creates proxy code that uses the service. 
     var warning = importer.Import(nmspace, unit1); 

     if (warning == 0) // If zero then we are good to go 
     { 
      // Generate the proxy code 
      var provider1 = System.CodeDom.Compiler.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" }; 

      var parms = new System.CodeDom.Compiler.CompilerParameters(assemblyReferences); 

      var results = provider1.CompileAssemblyFromDom(parms, unit1); 

      // Check For Errors 
      if (results.Errors.Count > 0) 
      { 
       foreach (System.CodeDom.Compiler.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); 

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

      return mi.Invoke(wsvcClass, args); 

     } 

     else 
     { 
      return null; 
     } 

    } 

のInnerException:

return mi.Invoke(wsvcClass, args) 

は例外をスロー{ "基になる接続が閉じられた:予期しないエラーが受信で発生しました。"}

メッセージ:呼び出しの対象によって例外がスローされました。

+0

をSystem.Netを使用して動的にWebサービスを呼び出すと、SOAP、私は私が見ることだけが、同じ問題を抱えていることは、あなたの場合ですそれがうまくいく引数を持っていないが、それが言う引数を持つ1つのサービスを呼び出します:パラメータの数が一致していない、あなたはより多くの引数を入れて研究することができます。 – vladernn

答えて

関連する問題