当前位置: 移动技术网 > IT编程>开发语言>.net > 根据反射,动态调用websever

根据反射,动态调用websever

2020年07月23日  | 移动技术网IT编程  | 我要评论
 [webmethod]
        public string index(string action,string message)
        {

            try
            {
                // 1. 使用 webclient 下载 wsdl 信息。
                webclient web = new webclient();
                stream stream = web.openread("http://localhost/test/webservice.asmx?wsdl");
                // 2. 创建和格式化 wsdl 文档。
                servicedescription description = servicedescription.read(stream);

                // 3. 创建客户端代理代理类。
                servicedescriptionimporter importer = new servicedescriptionimporter();

                importer.protocolname = "soap"; // 指定访问协议。
                importer.style = servicedescriptionimportstyle.client; // 生成客户端代理。
                importer.codegenerationoptions = codegenerationoptions.generateproperties | codegenerationoptions.generatenewasync;

                importer.addservicedescription(description, null, null); // 添加 wsdl 文档。

                // 4. 使用 codedom 编译客户端代理类。
                codenamespace nmspace = new codenamespace(); // 为代理类添加命名空间,缺省为全局空间。
                codecompileunit unit = new codecompileunit();
                unit.namespaces.add(nmspace);

                servicedescriptionimportwarnings warning = importer.import(nmspace, unit);
                codedomprovider provider = codedomprovider.createprovider("csharp");

                compilerparameters parameter = new compilerparameters();
                parameter.generateexecutable = false;
                parameter.generateinmemory = true;
                parameter.referencedassemblies.add("system.dll");
                parameter.referencedassemblies.add("system.xml.dll");
                parameter.referencedassemblies.add("system.web.services.dll");
                parameter.referencedassemblies.add("system.data.dll");

                compilerresults result = provider.compileassemblyfromdom(parameter, unit);

                // 5. 使用 reflection 调用 webservice。
                if (!result.errors.haserrors)
                {
                    assembly asm = result.compiledassembly;
                    //搜索类名 如果在前面为代理类添加了命名空间,此处需要将命名空间添加到类型前面。
                    type t = asm.gettype("webservice"); 
                    object o = activator.createinstance(t);
                    //搜索类下函数
                    methodinfo method = t.getmethod("test");//hipmessageserver
                    object[] l_args = new object[2] { action, message };
                    //调用函数
                    return method.invoke(o, l_args).tostring();
                    
                }
                return "{code:2,msg:'错误'}";
            }
            catch (exception e)
            {

                return "{code:1,msg:'"+e.tostring()+"'}";
            }
        }

   //被调用的接口

 

[webmethod]
public string test(string action, string message) {
return action + message;
}

 

 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网