0

调用后Webservices,返回一个对象(该对象为自定义对象类)给客户端。所以,我想从这个对象转换为自定义类。

-网页服务:

[WebMethod]
public Cls_ROLES GetRoles(int firstNum)
{
    Cls_ROLES o = new Cls_ROLES();
    o.Role_ID = 2;
    o.RoleName = "binh";
    return o;
}

-客户:

+功能:

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(methodName);
            object o = new object();
            o=mi.Invoke(wsvcClass, args);
            return o;
        }
        else
        {
            return null;
        }
    }
}

+Page_Load 函数:

Line 1:object[] args=new object[1];
Line 2:args[0]=1;  
Line 3:o = this.CallWebService("http://localhost:1814/HelloServices/Service.asmx", "Hello", "GetRoles", args);

它在 Line3 处返回一个对象(该对象是一个自定义对象类)给客户端。所以,我想从这个对象转换为自定义类(Cls_Role 对象)。//================================================= =======================================//========== ==================================================== ===========================//====================== ==================================================== ============== 作为 Selalu_Ingin_Belajar 的回答,我可以从 web 服务中获得价值给客户端。

对象你的对象 = 新对象();

foreach (PropertyInfo property in yourObject.GetType().GetProperties())
{           
    object value = property.GetValue(yourObject , null);
    Console.WriteLine("{0} = {1}", property.Name, value);
}

除此之外,当我申请另一个项目时,它显示另一个错误:参数计数不匹配。如果我通过 VisualStudio 工具使用 AddWebReference。它会自动生成 Reference.cs 文件。它包含:

/// <remarks/>
    [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="urn:ALBAPI", ResponseNamespace="urn:ALBAPI")]
    [return: System.Xml.Serialization.SoapElementAttribute("info")]
    public ResponseInfo getSetupLicenseRows(out SetupLicenseRowsValues values) {
        object[] results = this.Invoke("getSetupLicenseRows", new object[0]);
        values = ((SetupLicenseRowsValues)(results[1]));
        return ((ResponseInfo)(results[0]));
    }

因此,通过传递一个对象 SetupLicenseRowsValues 类可以很容易地从 webClient 调用。现在,我必须手动将参数传递给 WebServices。不要使用这个生成文件。

客户:

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(methodName);
                    object o = new object();
                    Line error: o = mi.Invoke(wsvcClass, new object[0]);
                    return o;
                }
                else
                {
                    return null;
                }
            }
        }
public void call()
    {
        string WebserviceUrl = "http://192.168.2.19:3333/ALBAPI.wsdl";
        string serviceName = "ALBAPI";
        string methodName = "getSetupLicenseRows";
        object[] args=new object[0];
        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);
        }

    }

现在,它在线路错误处显示错误“参数计数不匹配”。还是要谢谢你的帮助

4

3 回答 3

0

现在,如果我理解正确,并且由于您经历了动态构建代理(而不是使用服务引用)的繁琐工作,这意味着您的消费者代码不包含您可能服务的任何对象的实际定义可能会回来。

在那种情况下,我看不出有很多方法可以通过静态类型的代码来实现这一点。您可以尝试使用dynamic并希望您的响应具有您期望的“结构”,但不知道真实类型。如:

dynamic returnValue = CallWebservice(someEndpoint, someServiceName, ...);
//now you can access all the properties of returnValue, for example:
Console.WriteLine(returnValue.Role_ID);
//but you won't have intellisense, may be error prone, and will prevent you from proper refactoring
于 2012-11-02T04:06:38.613 回答
0

只需Web/Service Reference右键单击您的客户项目并发现它即可使用Web Service。提供适当namespace的名称并单击确定。

此过程将根据暴露Proxy在.GetRolesCls_ROLESWSDL

于 2012-11-02T04:08:16.017 回答
0

如果您只想获取对象的每个参数的值,则可以使用反射。

object yourObject = new object();

foreach (PropertyInfo property in yourObject.GetType().GetProperties())
{           
    object value = property.GetValue(yourObject , null);
    Console.WriteLine("{0} = {1}", property.Name, value);
}

但是你最好使用像 Pablo 和 Furqan 这样的服务参考来获得你的对象的清晰模式。因为它会自动序列化你的对象,所以你不用担心序列化的东西。对不起我的英语:p

于 2012-11-02T04:19:13.873 回答