欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

根据反射,动态调用websever

程序员文章站 2022-03-26 18:24:29
[WebMethod] public string index(string Action,string Message) { try { // 1. 使用 WebClient 下载 WSDL 信息。 WebClient web = new WebClient(); Stream stream = ......
 [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;
}