0

从 webservices 接收对象到 asp.net 时出现问题。我的问题不能使用 AddWebReference。它不能在我的项目中使用。因为用户必须输入有关网络服务的信息,例如:IPAddress、Port。然后,客户端将使用此信息来访问 Web 服务。

它在 Webservices 中的功能:

 [SoapRpcMethod("", RequestNamespace = "urn:ALBAPI", ResponseNamespace = "urn:ALBAPI")]
        public ResponseInfo getAdvCertExport(out AdvCertExportValues values);
        public void getAdvCertExportAsync();
        public void getAdvCertExportAsync(object userState);

客户:

public void call()
        {
            string WebserviceUrl = "http://192.168.2.19:3333/ALBAPI.wsdl";
            string serviceName = "ALBAPI";
            string methodName = "getSetupLicenseRows";
            object[] args=new object[1];
            object sSessionID = CallWebService(WebserviceUrl, serviceName, methodName,args);
            foreach (PropertyInfo property in sSessionID.GetType().GetProperties())
            {
                object value = property.GetValue(sSessionID, null);

                Console.WriteLine("{0} = {1}", property.Name, value);
            }

        }

        public object CallWebService(string webServiceAsmxUrl, string serviceName, string methodName, object[] args)
        {
            System.Net.WebClient client = new System.Net.WebClient();
            //-Connect To the web service
            using (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)
                    {
                        StringBuilder sb = new StringBuilder();
                        foreach (CompilerError oops in results.Errors)
                        {
                            sb.AppendLine("========Compiler error============");
                            sb.AppendLine(oops.ErrorText);
                        }
                        throw new System.ApplicationException("Compile Error Occured calling webservice. " + sb.ToString());
                    }
                    //--Finally, Invoke the web service method 
                    Type foundType = null;
                    Type[] types = results.CompiledAssembly.GetTypes();
                    foreach (Type type in types)
                    {
                        if (type.BaseType == typeof(System.Web.Services.Protocols.SoapHttpClientProtocol))
                        {
                            Console.WriteLine(type.ToString());
                            foundType = type;
                        }
                    }

                    object wsvcClass = results.CompiledAssembly.CreateInstance(foundType.ToString());
                    MethodInfo mi = wsvcClass.GetType().GetMethod("getSetupLicenseRows");
                    object o = new object();                    
                    Line 100:o = mi.Invoke(wsvcClass, args);
                    return o;
                }
                else
                {
                    return null;
                }
            }

它显示错误。“参数计数不匹配。” 在第 100 行:o = mi.Invoke(wsvcClass, args); 无论如何,提前感谢您的帮助。

4

0 回答 0