根据反射,动态调用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;
}
上一篇: 2020最新PHP面试题和进阶资料
下一篇: 设计模式(1)