通过反射动态调用webservices
生活随笔
收集整理的這篇文章主要介紹了
通过反射动态调用webservices
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
該方法可以使程序不通過web引用的方式去調用webservices方法,直接在代碼里調用該方法就能達到動態調用webservices的目的。使用前先引用System.Web.Services動態鏈接庫,是.net自帶的dll。
方法如下:
using?System.Collections.Generic;
using?System.Text;
using?System.Net;
using?System.IO;
using?System.Web.Services.Description;
using?System.CodeDom;
using?Microsoft.CSharp;
using?System.CodeDom.Compiler;
namespace?TestSkin
{
????class?Webservices
????{
????????///?<summary>
????????///?實例化WebServices
????????///?</summary>
????????///?<param?name="url">WebServices地址</param>
????????///?<param?name="methodname">調用的方法</param>
????????///?<param?name="args">把webservices里需要的參數按順序放到這個object[]里</param>
????????public?static?object?InvokeWebService(string?url,?string?methodname,?object[]?args)
????????{
????????????//這里的namespace是需引用的webservices的命名空間,在這里是寫死的,大家可以加一個參數從外面傳進來。
????????????string?@namespace?=?"client";
????????????try
????????????{
????????????????//獲取WSDL
????????????????WebClient?wc?=?new?WebClient();
????????????????Stream?stream?=?wc.OpenRead(url?+?"?WSDL");
????????????????ServiceDescription?sd?=?ServiceDescription.Read(stream);
????????????????string?classname?=?sd.Services[0].Name;
????????????????ServiceDescriptionImporter?sdi?=?new?ServiceDescriptionImporter();
????????????????sdi.AddServiceDescription(sd,?"",?"");
????????????????CodeNamespace?cn?=?new?CodeNamespace(@namespace);
????????????????//生成客戶端代理類代碼
????????????????CodeCompileUnit?ccu?=?new?CodeCompileUnit();
????????????????ccu.Namespaces.Add(cn);
????????????????sdi.Import(cn,?ccu);
????????????????CSharpCodeProvider?csc?=?new?CSharpCodeProvider();
????????????????ICodeCompiler?icc?=?csc.CreateCompiler();
????????????????//設定編譯參數
????????????????CompilerParameters?cplist?=?new?CompilerParameters();
????????????????cplist.GenerateExecutable?=?false;
????????????????cplist.GenerateInMemory?=?true;
????????????????cplist.ReferencedAssemblies.Add("System.dll");
????????????????cplist.ReferencedAssemblies.Add("System.XML.dll");
????????????????cplist.ReferencedAssemblies.Add("System.Web.Services.dll");
????????????????cplist.ReferencedAssemblies.Add("System.Data.dll");
????????????????//編譯代理類
????????????????CompilerResults?cr?=?icc.CompileAssemblyFromDom(cplist,?ccu);
????????????????if?(true?==?cr.Errors.HasErrors)
????????????????{
????????????????????System.Text.StringBuilder?sb?=?new?System.Text.StringBuilder();
????????????????????foreach?(System.CodeDom.Compiler.CompilerError?ce?in?cr.Errors)
????????????????????{
????????????????????????sb.Append(ce.ToString());
????????????????????????sb.Append(System.Environment.NewLine);
????????????????????}
????????????????????throw?new?Exception(sb.ToString());
????????????????}
????????????????//生成代理實例,并調用方法
????????????????System.Reflection.Assembly?assembly?=?cr.CompiledAssembly;
????????????????Type?t?=?assembly.GetType(@namespace?+?"."?+?classname,?true,?true);
????????????????object?obj?=?Activator.CreateInstance(t);
????????????????System.Reflection.MethodInfo?mi?=?t.GetMethod(methodname);
????????????????return?mi.Invoke(obj,?args);
????????????}
????????????catch
????????????{
????????????????return?null;
????????????}
????????}
????}
}
轉載于:https://www.cnblogs.com/ruochen/archive/2007/12/11/990427.html
總結
以上是生活随笔為你收集整理的通过反射动态调用webservices的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 改善ASP.NET2.0性能的五件法宝
- 下一篇: 多目标识别