• C#不添加引用,动态调用webservice(转)


    好像很多人做WebService的时候都是直接添加引用的方式,然后调用服务端的方法。这样就个问题,就是每次我服务端添加了方法或者修改了方法后都要更新Web引用,这样比较麻烦。下面给一个不用添加引用的方式调用服务端的方法.只是一个简单的测试,不是很规范,用得着的人可以自己封装一下,然后直接传服务端的方法名进去,Type.GetMethod获取方法,然后method.Invoke返回结果。

    高手些多多包函,主要是给用得着的人参考一下,互相学习.代码主要是用了 System.Web.Services.Description里的东西

    1. public static object InvokeMethod(string nameSpace, string className, string methodName, object[] param)
    2. {
    3. System.Net.WebClient client = new System.Net.WebClient();
    4. String url = System.Configuration.ConfigurationManager.ConnectionStrings["serviceAddress"].ConnectionString;//这个地址可以写在Config文件里面,这里取出来就行了.在原地址后面加上: ?WSDL
    5. System.IO.Stream stream = client.OpenRead(url);
    6. System.Web.Services.Description.ServiceDescription description = System.Web.Services.Description.ServiceDescription.Read(stream);
    7. System.Web.Services.Description.ServiceDescriptionImporter importer = new System.Web.Services.Description.ServiceDescriptionImporter();//创建客户端代理代理类。
    8. importer.ProtocolName = "Soap"; //指定访问协议。
    9. importer.Style = System.Web.Services.Description.ServiceDescriptionImportStyle.Client; //生成客户端代理。
    10. importer.CodeGenerationOptions = System.Xml.Serialization.CodeGenerationOptions.GenerateProperties | System.Xml.Serialization.CodeGenerationOptions.GenerateNewAsync;
    11. importer.AddServiceDescription(description, null, null); //添加WSDL文档。
    12. System.CodeDom.CodeNamespace nmspace = new System.CodeDom.CodeNamespace(); //命名空间
    13. nmspace.Name = nameSpace;
    14. System.CodeDom.CodeCompileUnit unit = new System.CodeDom.CodeCompileUnit();
    15. unit.Namespaces.Add(nmspace);
    16. System.Web.Services.Description.ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit);
    17. System.CodeDom.Compiler.CodeDomProvider provider = System.CodeDom.Compiler.CodeDomProvider.CreateProvider("CSharp");
    18. System.CodeDom.Compiler.CompilerParameters parameter = new System.CodeDom.Compiler.CompilerParameters();
    19. parameter.GenerateExecutable = false;
    20. parameter.OutputAssembly = "TempClass.dll";//输出程序集的名称
    21. parameter.ReferencedAssemblies.Add("System.dll");
    22. parameter.ReferencedAssemblies.Add("System.XML.dll");
    23. parameter.ReferencedAssemblies.Add("System.Web.Services.dll");
    24. parameter.ReferencedAssemblies.Add("System.Data.dll");
    25. System.CodeDom.Compiler.CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit);
    26. if (result.Errors.HasErrors)
    27. {
    28. // 显示编译错误信息
    29. }
    30. System.Reflection.Assembly asm = System.Reflection.Assembly.LoadFrom("TempClass.dll");//加载前面生成的程序集
    31. Type t = asm.GetType(nameSpace + "." + className);
    32. object o = Activator.CreateInstance(t);
    33. System.Reflection.MethodInfo method = t.GetMethod(methodName);//GetPersons是服务端的方法名称,你想调用服务端的什么方法都可以在这里改,最好封装一下
    34. object item = method.Invoke(o, param);
    35. //注:method.Invoke(o, null)返回的是一个Object,如果你服务端返回的是DataSet,这里也是用(DataSet)method.Invoke(o, null)转一下就行了
    36. return item;
    37. }
  • 相关阅读:
    单线制DS18B20温度传感器LED数码管显示当前的温度值
    AD转换器的主要指标
    关于swiper动态更改,无法更新的悖论
    在360的兼容模式下关于innerHTML=“”,引发的问题
    比较两个字符串的相似度
    WebSocket使用
    事件绑定addEventListener
    插件开发优缺点
    插件开发宗旨
    学会用博客
  • 原文地址:https://www.cnblogs.com/dwfbenben/p/2600113.html
Copyright © 2020-2023  润新知